轉載自:http://blog.csdn.net/xiazdong/article/details/6723101
一、兩種實例化方式:
String str = “abc”;
String str = new String("abc");
一個字符串就是String的匿名對象。
"hello".equals(str) 一個字符串能夠調用一個函數,可以看出,一個字符串是String的匿名對象。
二、比較
(1)直接賦值
String str = “abc”;表示一個堆內存指向給了棧內存。
注意:直接賦值可以節省內存
舉例:
- public class StringDemo01{
- public static void main(String args[]){
- //享元模式
- //在堆內存中有一個"hello"的String對象,而str1和str2和str3指向這個匿名對象
- String str1 = "hello";
- String str2 = "hello";
- String str3 = "hello";
- System.out.println("str1 == str2 --> "+(str1 == str2));
- System.out.println("str1 == str3 --> "+(str1 == str3));
- System.out.println("str2 == str3 --> "+(str2 == str3));
- }
- }
(2)new
舉例:
- public class StringDemo01{
- public static void main(String args[]){
- String str1 = new String("hello");
- String str2 = new String("hello");
- System.out.println("str1==str2 -->"+(str1==str2));
- }
- }
1.創建了"hello"的匿名String對象。
2.創建一個str的對象,並開闢新的堆空間。
3.原來的“hello”的匿名對象變成垃圾。
注意:因此開發中最好使用直接賦值。
三、字符串的不可改變性
爲什麼str+="world"這種連接操作效率低,就是因爲這個,所以纔會有StringBuilder或者StringBuffer。
四、String和StringBuilder的性能比較
- public class StringDemo02{
- public static void main(String args[]){
- long begin1 = System.currentTimeMillis();
- String str = "";
- for(int i=0;i<10000;i++){
- str+=i;
- }
- long end1 = System.currentTimeMillis();
- System.out.println("String用時: "+(end1-begin1)+" ms"); //用時2000ms
- long begin2 = System.currentTimeMillis();
- StringBuilder sbuilder = new StringBuilder();
- for(int i=0;i<10000;i++){
- sbuilder.append(i);
- }
- long end2 = System.currentTimeMillis();
- System.out.println("StringBuilder用時: "+(end2-begin2)+" ms");//用時0ms,所以快了很多
- }
- }