在Java中,可以使用兩種方式創建字符串:
~~~
String x = "abc";
String y = new String("abc");
~~~
對于這兩種方式(雙引號,構造函數)它們到底有什么區別呢?
1.雙引號 vs 構造函數
這個問題可以使用這兩個簡單代碼實例來回答:
實例一
~~~
String a = "abcd";
String b = "abcd";
System.out.println("a == b : "+(a == b)); // true
System.out.println("a.equals(b) : "+(a.equals(b))); // true
~~~
a== b等于true 是因為x和y指向方法區中同一個字符串常量,內存引用是相同的。
當相同的字符串常量被多次創建時,只會保存字符串常量的一份副本,這稱為“字符串駐留”。在Java中,所有編譯時字符串常量都是駐留的。
實例二
~~~
String c = new String("abcd");
String d = new String("abcd");
System.out.println("c == d : "+(c == d)); // false
System.out.println("c.equals(d) : "+(c.equals(d))); // true
~~~
c== d等于false 是因為c和d指向堆中不同的對象。不同的對象擁有不同的內存引用。
下面圖論證了以上的結論。

2.運行時字符串駐留
運行時也會發生字符串駐留,即使兩個字符串是由構造函數方法創建的。
~~~
String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println("c == d : "+(c == d)); // true
System.out.println("c.equals(d) : "+(c.equals(d))); // true (JDK1.7)
~~~
如果字面值“abcd”已經是字符串類型,那么使用構造函數方式只會創建一個額外沒有用處的對象。
因此,如果你只需要創建一個字符串,你可以使用雙引號的方式,如果你需要在堆中創建一個新的對象,你可以選擇構造函數的方式。
原文鏈接:[Create Java String Using ” ” or Constructor?](http://www.programcreek.com/2014/03/create-java-string-by-double-quotes-vs-by-constructor/)
- 前言
- [Hibernate開發之路](1)Hibernate配置
- [Hibernate開發之路](2)Hibernate問題
- [Hibernate開發之路](3)基礎配置
- [Hibernate開發之路](4)ID生成策略
- [Hibernate開發之路](5)聯合主鍵
- [設計模式實踐之路](1)單例模式
- [Java]UDP通信的簡單例子
- [Java]套接字地址InetAddress講解
- [Java開發之路](1)final關鍵字
- [Java開發之路](2)Java字符串
- [Java開發之路](3)Java常用類
- [Java開發之路](4)String、StringBuffer與StringBuilder詳解
- [Java開發之路](5)異常詳解
- [Java開發之路](6)File類的使用
- [Java開發之路](7)RandomAccessFile類詳解
- [Java開發之路](8)輸入流和輸出流
- [Java開發之路](9)對象序列化與反序列化
- [Java開發之路](10)DOM解析XML文檔
- [Java開發之路](11)SAX解析XML文檔
- [Java開發之路](12)JDOM和DOM4J解析XML文檔
- [Java開發之路](14)反射機制
- [Java開發之路](15)注解
- [Java開發之路](16)學習log4j日志
- [Java開發之路](18)關于Class.getResource和ClassLoader.getResource的路徑問題
- [Java開發之路](19)Long緩存問題
- [Java開發之路](20)try-with-resource 異常聲明
- [Java開發之路](21)Comparator與Comparable
- [Java]Java工程師成神之路
- [細說Java](1)圖說字符串的不變性
- [細說Java](2)Java中字符串為什么是不可變的
- [細說Java](3)創建字符串是使用" "還是構造函數?