有用的冷知识集结

2018-06-28  本文已影响12人  6cc89d7ec09f

1 jvm内置工具

诊断工具,介绍了jvm自带的一些常用工具,在解决问题时可以用到
参考:https://blog.csdn.net/fenglibing/article/details/6411940

2 Instrumentation

使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。
学习难度有点大,最好需要具备javassist的知识

简单入门:https://www.cnblogs.com/orionhp/p/6362615.html

3 ToStringBuilder

apache的commons-lang3的工具包里有一个ToStringBuilder类,这样在打日志的时候可以方便的打印出类实例中的各属性的值。

4 markdown语法

掌握20%的语法适用80%的场景

5 javassist入门

Javassist是一个动态类库,可以用来检查、”动态”修改以及创建 Java类。其功能与jdk自带的反射功能类似,但比反射功能更强大。
简单小入门:https://blog.csdn.net/bjo2008cn/article/details/53543467

详细用法demo:https://www.cnblogs.com/sunfie/p/5154246.html

6 String.intern的深入研究

考察我们是否真正理解了String的不可变性、String常量池的设计以及String.intern方法所做的事情。但其实,我们在实际的编程中也可能碰到可以利用String.intern方法来提高程序效率或者减少内存占用的情况

7 对象到底占用了多少字节

文章通过手动计算,给出了代码和计算方式.可以清晰的知道如何计算一个对象占用的大小.工作场景小,但是非常基础的知识.

8 SELECT ...for update

select for update 是工作中非常常用的一种mysql锁机制,但是使用时如果不注意,会导致lock table等事情发生.比如未指明主键,或者mysql引擎选用错误等.

9 linux上测试端口

测试端口的调用情况和是否开放
参考:https://blog.csdn.net/m0_37975886/article/details/78405808

10 内部类的加载时机&双重加载机制的弊端&单例的最佳实现

参考:https://blog.csdn.net/brouth/article/details/51656603

11 按时间单位调用线程sleep

TimeUnit.SECONDS.sleep(1);

12 非运算(~) -1的二进制

负数的二进制计算方法参考:https://blog.csdn.net/han1558249222/article/details/55218193
~1 = -2
~2 = -3

System.out.println(~1);

为什么1个字节的取值范围为 -2^7+1 ~ 2^7呢?
因为最高位为符号位,最高位1代表负数,0代表整数,依次来区分二进制是整数还是负数

13 java retry使用详解

在线程池源码中出现
转载:https://blog.csdn.net/u014763302/article/details/54617683

14、javaSpi的介绍

Java 的 SPI 机制,英文全称是 Service Provider Interface,常用于框架的可扩展实现。Java 语言的 JDBC、JDNI 就使用了这种技术,甚至我们常用的 dubbo 也是在 Java SPI 机制基础上做的改进。参考
在jdbc中的实例
dubbo中对SPI的使用与思考
思考:dubbo中的spi运用到了 spring的IOC,动态代理,工厂模式.
那为什么dubbo不直接使用spring来实现IOC呢?因为dubbo是一个提供给外部使用的框架,不能和spring耦合太多,实现自己的spi可以达到高内聚.
跟jdk的spi的区别? dubbo自己实现的spi不用一次性把所有实现类加载出来,通过key=value的配置形式,可以用参数动态指定具体使用哪个实现类.灵活性很高!
动态代理类的作用:接口 -->动态代理实现类.我们要做动态代理,无非是想得到做一个能公共的逻辑,而这个动态代理实现类所做的事情就是 根据参数动态的加载具体的实现类. Protcol -->

15 mysql 插入时解决重复性问题

https://blog.csdn.net/analogous_love/article/details/71085001

16 你真的了解try{ return }finally{}中的return?

https://blog.csdn.net/stduent_/article/details/60955365

17 jdk自带的序列化工具效率非常之低,为了解决序列化问题,可以使用第三方的序列化工具Protostuff

参考:https://blog.csdn.net/canot/article/details/53750443

18注解参数的详细介绍

参考:https://www.cnblogs.com/gmq-sh/p/4798194.html

19 文件防止篡改

文件防止篡改的主要思路是对文件进行md5 加密 得到一串4字节的字符串.检测防篡改就是再进行一次md5加密和第一次的md5加密结果进行对比,如果文件没有被改动,则检测成功
md5 工具:https://www.cnblogs.com/hihtml5/p/6064999.html
实战:https://blog.csdn.net/JavaBuilt/article/details/79583921

20 spring的AOP

概念:http://www.cnblogs.com/hongwz/p/5764917.html
注解方式:https://www.cnblogs.com/qinglangyijiu/p/8425653.html

21 静态内部类和静态类的区别

参考:https://www.cnblogs.com/aademeng/articles/6192954.html
1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
3.实例化一个非静态的内部类的方法:
a.先生成一个外部类对象实例
OutClassTest oc1 = new OutClassTest();
b.通过外部类的对象实例生成内部类对象
OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
4.实例化一个静态内部类的方法:
a.不依赖于外部类的实例,直接实例化内部类对象
OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
b.调用内部静态类的方法或静态变量,通过类名直接调用
OutClassTest.InnerStaticClass.static_value
OutClassTest.InnerStaticClass.getMessage()

22 自定义Spring的schema文件

参考:https://blog.csdn.net/luyee2010/article/details/9954941

23 枚举的使用

https://www.jianshu.com/p/3fed5f481e54

24 输入流输出流转换

org.apache.commons.io包下
IOUtils.copy(inputStream, outputStream);

25 对类的操作犹如窥探这个世界的本质

org.apache.commons.lang3包下的 ClassUtils类了解一下
https://www.jianshu.com/p/dc104d635fac

26日志框架 logback的配置详解

https://www.cnblogs.com/reason-cai/p/6763108.html
https://www.cnblogs.com/DeepLearing/p/5663178.html
例子:

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>

    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d - %msg%n
            </pattern>
        </layout>
    </appender>

    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--只过滤error级别-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>/var/log/tomcat/sell/info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>


    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--只保留error以上级别-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>/var/log/tomcat/sell/error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog" />
        <appender-ref ref="fileInfoLog" />
        <appender-ref ref="fileErrorLog" />
    </root>

</configuration>

27 lombok 减少代码开发量,优雅代码的利器

https://blog.csdn.net/motui/article/details/79012846
注意:减少logger的书写的方法

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
//@Data
public class LoggerTest {

    @Test
    public void test1() {
        String name = "imooc";
        String password = "123456";
        log.debug("debug...");
        log.info("name: " + name + " ,password: " + password);
        log.info("name: {}, password: {}", name, password);
        log.error("error...");
        log.warn("warn...");
    }
}

28 spring的AOP编程方法众多,利用BeanNameAutoProxyCreator可以非常简单的实现AOP编程

spring中有多种方法来配置aop.可以参考汇总篇:https://blog.csdn.net/xiejx618/article/category/2894739

还有其他实现代理的方法

29 java中的引用和句柄是什么意思?

句柄就代表引用
关于java中的引用 我觉得在"think in java"这本书里面讲得很好 在那本书里 他们把引用叫做"句柄"(Handle)

java中就是用"句柄"来操纵对象的

在java中 任何东西都可以看作是对象 因此,我们可采用一种统一的语法,任何地方均可照搬不误。但要注意,尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。在其他Java参考书里,还可看到有的人将其称作一个“引用”,甚至一个“指针”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。

此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。

30 Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)

Cglib BeanCopier的性能卓越

31 Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方。

注意:Collections.emptyList()方法得到的List是不能添加元素的,相比于直接初始化ArrayList,它的作用仅仅为了使对象初始化的时候,不用占用内存,也防止null的出现
https://blog.csdn.net/qq_27093465/article/details/65444622

32 toString方法的工具类

用法非常简单,如下

@Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

ToStringStyle代表输出样式,可以选择不同的样式进行输出.
具体介绍可以参考官方api:http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/ToStringStyle.html

上一篇下一篇

猜你喜欢

热点阅读