我是靠谱客的博主 欢喜小蘑菇,这篇文章主要介绍Effective Java之避免创建不必要的对象(五),现在分享给大家,希望可以做个参考。

1.对于不可变类(immutable),他始终可以被重用。

如:String类
String s = new String(“string”);
这种方法创建了两个String对象,因为传入String构造器的参数本身就是一个String实例,new再创建一个对象,由s指向它,事实上这样做浪费了两倍内存。
所以应该这样:
String s = “string”;

又如:Integer类等包装类
Integer比较特殊,也是面试中坑点之一:
先来看一个简单的例子:

 Integer i1 = new Integer(127)
Integer i2 = new Integer(127)
Integer i3 = 127
System.out.println(i1 == i2);
System.out.println(i1 == i3); 

这两个判断跟String原理一样,都是false;
再来

 int i1 = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i1 == i2);
System.out.println(i1 == i3); 

答案都是true,很简单,基本类型和装箱类型比较,装箱类型会自动拆箱,两个int比较当然是true。

最后一波坑

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);

答案第一个true,第二个false,原因是Integer常量池只存了-128-127的数,所以Integer i3 = 128,相当于创建了一个新的Integer对象!

2.除了重用不可变对象,还可以重用那些不可修改的可变对象。

比如jdbc的driver,connection中,如果你在每个sql操作中,都创建新的对象,那么代价回非常非常大。

常用的解决方法是把这些不可修改的可变对象放在静态代码块中或者构造方法中。其实就是饿汉式加载和懒汉式加载的问题。jdbc采用的是维护一个

3.避免创建不必要的对象不等于避免创建对象

对于现代jvm来说,对于小对象的回收和创建的动作是非常廉价的,创建小的对象来提升程序清晰性,简洁性,通常是好事。

有的人为了避免创建对象,维护自己的对象池,需要时只需要从对象池中取出,这样避免了创建很多对象。但是这种方法通常不可行,通常会把代码弄的难以理解,难以维护,有时候还不如jvm直接创建回收来的快。

但是jdbc的连接线程池不同,每个数据库连接都是非常珍贵的,重用这些对象价值很大。

最后

以上就是欢喜小蘑菇最近收集整理的关于Effective Java之避免创建不必要的对象(五)的全部内容,更多相关Effective内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(107)

评论列表共有 0 条评论

立即
投稿
返回
顶部