Java不可变字符串String和Integer

不可变对象是在创建后不会更改其值的对象。

Java中最为人所知的不可变对象是字符串。

除了字符串之外,还有一个不可变的对象,这是Integer(类而不是基元数据类型),它的值比较有趣,-128到127之间放在一个常用池中。

根据不可变对象的定义,如果要实现自己的不可变类,它将如下所示:

final class MyImmutable

{

  private final int value;	//将它定义为 final

  public MyImmutable(int Value)

  {

      value = Value;

  }

  public int getValue() {

      return value;

  }

}

不可变类

  • 定义为final以防止继承;

  • 属性被定义为final,防止其值被更改;

  • 不包含更改其属性值的方法;

字符串对象Strign是不变的;

当使用=运算符初始化字符串对象值时,它们的值存储在字符串常量池中;

当使用=时,如果该值以前没有使用过,则JVM将在字符串常量池中创建一个新的字符串对象;否则,将字符串对象地址赋值给引用。

Java中的另一种不可变对象是Integer(还有其他类型,如Double、Color…)。

JVM将-128到127之间的整数值存储在类似于字符串常量池的区域中,因为它们在很多情况下都会用到。

下面这个例子可以验证这一点

Integer i1 =100;  //使用常量值

Integer i2 =100;            

if(i1 == i2)        //比较引用值

    System.out.println("引用值相等!");

else

    System.out.println("引用值不相等!");

i1 = 300;  // 使用比较大的值

i2 = 300;

if(i1 == i2)

    System.out.println( "引用值相等");

else

    System.out.println("引用值不相等");

输出结果:

引用值相等

引用值不相等

在第一个初始化(其中使用的值介于-128和127之间)中,两个Integer引用相等,因为它们引用同一个整数对象。

当值在-128和127区间之外时,这两个引用是不同的,因为我们有两个具有相同值的不同整数对象。

日期:2019-04-29 03:17:56 来源:oir作者:oir