阅读《Effective Java》每条tips的理解和总结
Posted shen-qian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阅读《Effective Java》每条tips的理解和总结相关的知识,希望对你有一定的参考价值。
61 基本数据类型优于包装类型
这里说基本数据类型优于包装类型,并不是说包装类型一无是处。某些场景,比如要表示值为null、使用包装类型的方法、与其他对象交互(添加到集合里、用作参数类型)都需要用包装类型。这里的意思是能用基本数据类型就尽量用基本数据类型,因为包装类型自动拆箱、装箱会带来性能损失尤其是循环使用时会大量创建对象;还有就是自动拆、装箱使得多很多隐患,这些错误编译时无法发现,运行时就会出现意料之外的结果。例如:
static Integer i; public static void main(String[] args) { if (i == 42) { //这里会报空指针异常 System.out.println("test"); //打印不了,判断时会出错 } }
为什么上面那步报异常,因为虽然包装类型初始为null,拆箱时就会报空指针异常。再比如:
Comparator<Integer> naturalOrder =(i, j) -> (i < j) ? -1 : (i == j ? 0 : 1); //这个比较器的compare方法接收Integer参数,看起来很正常的比较但是有大bug
如果传入compare(new Integer(666),new Integer(666))。传入两个1的包装类型,但是却不会正确的返回0。因为i == j时,由于两者都是对象于是返回false。
总结,为什么会出现这两个例子的情况呢,因为我们都认为 拆箱、装箱会为我们解决一切的,而忽略了拆箱装箱有些情形不会触发。如上面包装类型为null、参与==判断的都是包装类型等就没有装、拆箱了。总之,如无必要不要用包装类型,增加隐患。
62 当使用其他类型更合适时应避免使用字符串
这一条主要是告诉我们不要看到什么属性,都把它声明为String,String应该仅仅用来表示文本。因为如果使用不当,字符串比其他 类型更麻烦、灵活性更差、速度更慢、更容易出错。字符串经常被误用的类型包括基本类型、枚举和聚合类型。
误用代替枚举:则失去了枚举的拓展性,失去了枚举类提供的api、单例限制等;误用代替聚合类型:如使用逗号隔开用一个字符串表示多个信息,则会增加处理、解析的开销与麻烦,与出错几率。误用代替数值:则需要用到数值时还需要将字符串转换为数字,增加开销、出错几率。
63 当心字符串连接引起的性能问题
由于String类的不可变特性,用“+”连接两个字符串时不是在改变原有对象,而是根据两个字符串的内容生成新对象。所以,不要使用“+”频繁、大量的操作字符串,而应该用StringBuffer、StringBuilder(线程不安全)。
当然,”+“这么久来也做了一些优化,如String s = "1" + "2",是直接生成“12”一个对象的。“+”可以满足少数几个字符串连接,但是,还是比StringBuilder拼接速度差几倍。
以上是关于阅读《Effective Java》每条tips的理解和总结的主要内容,如果未能解决你的问题,请参考以下文章
Effective Java 第三版——65. 接口优于反射
Effective Java 第三版——48. 谨慎使用流并行