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的连接线程池不同,每个数据库连接都是非常珍贵的,重用这些对象价值很大。