天天看點

Java中String類型的不可變性和駐留池

一 基本概念

可變類和不可變類(mutable and immutable objects)的初步定義:

可變類:當獲得這個類的一個執行個體引用時,可以改變這個執行個體的内容。

不可變類:不可變類的執行個體一但建立,其内在成員變量的值就不能被修改。其中string類就是不可變類的經典應用。

二 例子

package cn.xy.test;

public class stringtest

{

 /**

  * a的值在編譯時就被确定下來,故其值"xy"被放入string的駐留池(駐留池在堆中)并被a指向。

  * b的值在編譯時也被确定,那麼b的值在string的駐留池中找是否有等于"xy"的值,有的話也被b指向。

  * 故兩個對象位址一緻

  * @return true

  */

 public static boolean teststring1()

 {

  string a = "xy";

  string b = "xy";

  return a == b;

 }

  * b的值在是兩個常量相加,編譯時也被确定。

 public static boolean teststring2()

  string a = "xyy";

  string b = "xy" + "y";

  * b的值為一個變量和一個常量相加,無法編譯時被确定,而是會在堆裡新生成一個值為"abc"的對象

  * @return false

 public static boolean teststring3()

  b = b + "y";

  * b的值都無法編譯時被确定,而是會在堆裡分别新生成一個對象叫"xyy"。

 public static boolean teststring4()

  string b = "xy".concat("y");

  * new string()建立的字元串不是常量,不能在編譯期就确定,是以new string() 建立的字元串不放入常量池中,它們有自己的位址空間。

  * a,b的值都無法編譯時被确定,會在堆裡分别新生成一個值為"xy"的對象。

  * @return fasle

 public static boolean teststring5()

  string a = new string("xy");

  string b = new string("xy");

  * intern()把駐留池中"xy"的引用賦給b。

 public static boolean teststring6()

  b = b.intern();

  return a == b.intern();

  * char的tostring方法傳回的是一個char對象的字元串,而不是我們想象的"xy"

 public static boolean teststring7()

  char[] a = new char[]{'x','y'};

  return a.tostring().equals(b);

  * char是一種新的類型,不存在駐留池的概念。

 public static boolean teststring8()

  return a.tostring() == b;

/**

  * string不可變性的展現

 string str = "xy";

 public string chage(string str)

  str = "xyy";

  return str;

  * 一般引用類型的可變性(傳值的時候把位址傳過去,相當于把倉庫的要是交給方法,方法拿到鑰匙去移動倉庫裡的東西)

 person p = new person("xy");

 public string changeperson(person p)

  p.setname("xyy");

  return p.tostring();

 public static void main(string[] args)

  print(teststring1()); // true

  print(teststring2()); // true

  print(teststring3()); // fasle

  print(teststring4()); // false

  print(teststring5()); // false

  print(teststring6()); // true

  print(teststring7()); // false

  print(teststring8()); // false

  stringtest t = new stringtest();

  print(t.str); // xy

  print(t.chage(t.str)); // xxy

  print(t.str); // xy

  print(t.p.tostring()); //xy

  print(t.changeperson(t.p)); //xyy

  print(t.p.tostring()); //xyy

 public static void print(object o)

  system.out.println(o);

}