《阿里巴巴Java开发手册》阅读手记

2019-03-08  本文已影响0人  VincentPeng

一、(四)、7
【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。 说明:对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在
IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。

自己测试了一下,确实是这样的,好可怕

    @Test
    public void testInteger() {
        //测试-128 、127
        Integer var1 = -129;
        Integer var2 = -129;
        Integer var3 = -128;
        Integer var4 = -128;
        Integer var5 = 127;
        Integer var6 = 127;
        Integer var7 = 128;
        Integer var8 = 128;
        // 通过以下断言
        assert var1 != var2 : "小于-128,不能使用等等";
        assert var3 == var4 : "等于-128,是不相等的";
        assert var5 == var6 : "等于127,是不相等的";
        assert var7 != var8 : "大于127,是相等的";
        
    }

一、(四)、10
【强制】序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。 说明:注意serialVersionUID不一致会抛出序列化运行时异常。

推荐】循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展。 说明:反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费。

我们来实际看一下

反编译字节码命令
javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。

用法: javap <options> <classes>
其中, 可能的选项包括:
  -help  --help  -?        输出此用法消息
  -version                 版本信息
  -v  -verbose             输出附加信息
  -l                       输出行号和本地变量表
  -public                  仅显示公共类和成员
  -protected               显示受保护的/公共类和成员
  -package                 显示程序包/受保护的/公共类
                           和成员 (默认)
  -p  -private             显示所有类和成员
  -c                       对代码进行反汇编
  -s                       输出内部类型签名
  -sysinfo                 显示正在处理的类的
                           系统信息 (路径, 大小, 日期, MD5 散列)
  -constants               显示最终常量
  -classpath <path>        指定查找用户类文件的位置
  -cp <path>               指定查找用户类文件的位置
  -bootclasspath <path>    覆盖引导类文件的位置
##使用javap -c '不带.class后缀的文件名'
#
  public void testStrppend();
    Code:
       0: ldc           #10                 // String SH
       2: astore_1
       3: iconst_0
       4: istore_2
       5: iload_2
       6: bipush        100
       8: if_icmpge     37
      11: new           #11                 // class java/lang/StringBuilder
      14: dup
      15: invokespecial #12                 // Method java/lang/StringBuilder."<init>":()V
      18: aload_1
      19: invokevirtual #13                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      22: ldc           #14                 // String hello
      24: invokevirtual #13                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      27: invokevirtual #15                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      30: astore_1
      31: iinc          2, 1
      34: goto          5
      37: return
把反编译代码翻译一下
上一篇 下一篇

猜你喜欢

热点阅读