阅读《Effective Java》每条tips的理解和总结(5)

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拼接速度差几倍。

    

猜你喜欢

转载自www.cnblogs.com/shen-qian/p/12411261.html