我想澄清几个问题。据我所知,Wrapper类也是最终的,也是不可改变的。那么他们是否像String类一样拥有对象池呢?还有Wrapper类的可变版本吗? String类有可变版本,如StringBuilder和StringBuffer。
答案 0 :(得分:5)
某些包装类(例如Long和Integer)具有某些值的缓存(对于Integer和Long,缓存用于-128到127之间的值),其行为类似于String池,但与String池不同它是常量,因此无法向其中添加新对象。
至于你的第二个问题,我假设它是一个拼写错误,你打算问一下包装类是否有可变版本,比如String有StringBuilder。答案是否定的。
答案 1 :(得分:-1)
我想详细说明Eran在他的回答中提到的缓存部分。这也将回答他在评论中提出的问题。
包装器布局,字节,短,存在缓存实例 整数,长,字符类。
对于Boolean类,缓存的实例是 直接访问因为只有两个存在:静态常量Boolean.TRUE 和Boolean.FALSE。
Character类缓存值为0到127的实例。
字节,短,整数和长缓存实例的值为-127到 128。
Float和Double包装类没有缓存实例。
如果从这个范围请求任何这些类的对象,valueOf()方法将返回对预定义对象的引用:否则,它会创建一个新对象并返回其引用。
Example :-
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
Integer i3 = Integer.valueOf(10);
Integer i4 = Integer.valueOf(10);
Integer i5 = 10; // Autoboxing, internally autoboxing uses valueOf() method.
Integer i6 = 10;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
System.out.println(i4 == i5);
System.out.println(i5 == i6);
O/P :-
false
true - result is true because valueOf() returns a cached copy.
true
true