美文网首页
有用的冷知识集结

有用的冷知识集结

作者: 6cc89d7ec09f | 来源:发表于2018-06-28 18:30 被阅读12次

    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

    相关文章

      网友评论

          本文标题:有用的冷知识集结

          本文链接:https://www.haomeiwen.com/subject/sgdweftx.html