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

來源:互聯網
上載者:User

標籤:

一 基本概念

可變類和不可變類(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的值在是兩個常量相加,編譯時間也被確定。
  * @return true
  */
 public static Boolean testString2()
 {
  String a = "xyy";
  String b = "xy" + "y";
  return a == b;
 }

 /**
  * b的值為一個變數和一個常量相加,無法編譯時間被確定,而是會在堆裡新產生一個值為"abc"的對象
  * @return false
  */
 public static Boolean testString3()
 {
  String a = "xyy";
  String b = "xy";
  b = b + "y";
  return a == b;
 }
 

 /**
  * b的值都無法編譯時間被確定,而是會在堆裡分別新產生一個對象叫"xyy"。
  * @return false
  */
 public static Boolean testString4()
 {
  String a = "xyy";
  String b = "xy".concat("y");
  return a == b;
 }

 
 /**
  * new String()建立的字串不是常量,不能在編譯期就確定,所以new String() 建立的字串不放入常量池中,它們有自己的地址空間。 
  * a,b的值都無法編譯時間被確定,會在堆裡分別新產生一個值為"xy"的對象。
  * @return fasle
  */
 public static Boolean testString5()
 {
  String a = new String("xy");
  String b = new String("xy");
  return a == b;
 }

 /**
  * intern()把駐留池中"xy"的引用賦給b。
  * @return true
  */
 public static Boolean testString6()
 {
  String a = "xy";
  String b = new String("xy");
  b = b.intern();
  return a == b.intern();
 }

 

 /**
  * char的toString方法返回的是一個char對象的字串,而不是我們想象的"xy"
  * @return false
  */
 public static Boolean testString7()
 {
  String b = "xy";
  char[] a = new char[]{‘x‘,‘y‘};
  return a.toString().equals(b);
 }
 


 /**
  * char是一種新的類型,不存在駐留池的概念。
  * @return fasle
  */
 public static Boolean testString8()
 {
  String b = "xy";
  char[] a = new char[]{‘x‘,‘y‘};
  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);
 }

}

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.