我们是否也有包装类的对象池?

时间:2015-05-31 06:03:09

标签: java string class wrapper

我想澄清几个问题。据我所知,Wrapper类也是最终的,也是不可改变的。那么他们是否像String类一样拥有对象池呢?还有Wrapper类的可变版本吗? String类有可变版本,如StringBuilder和StringBuffer。

2 个答案:

答案 0 :(得分:5)

某些包装类(例如Long和Integer)具有某些值的缓存(对于Integer和Long,缓存用于-128到127之间的值),其行为类似于String池,但与String池不同它是常量,因此无法向其中添加新对象。

至于你的第二个问题,我假设它是一个拼写错误,你打算问一下包装类是否有可变版本,比如String有StringBuilder。答案是否定的。

答案 1 :(得分:-1)

我想详细说明Eran在他的回答中提到的缓存部分。这也将回答他在评论中提出的问题。

  1. 包装器布局,字节,短,存在缓存实例 整数,长,字符类。

  2. 对于Boolean类,缓存的实例是 直接访问因为只有两个存在:静态常量Boolean.TRUE 和Boolean.FALSE。

  3. Character类缓存值为0到127的实例。

  4. 字节,短,整数和长缓存实例的值为-127到 128。

  5. Float和Double包装类没有缓存实例。

  6. 如果从这个范围请求任何这些类的对象,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