【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder
1、String
1.1 不可变性
1 // 在堆中会创建一个"Hello"字符串实例,把地址赋给对象a 2 String a = new String("Hello"); 3 // 在堆中又重新创建了一个"World"字符串实例,把新地址赋给对象a 4 a = new String("World");
经过上述操作,字符串"World"并不是在原字符串"Hello"的空间上修改的,而是重新开辟空间保存"World",然后把新空间的地址赋予a
1.2 字符串常量池
1 // 创建引用a,在常量池中增加"Hello"字串,把"Hello"字串的地址赋给a 2 String a = "Hello"; 3 // 创建引用b,在常量池中寻找"Hello"字串,把"Hello"字串的地址赋给b 4 String b = "Hello"; 5 // 创建引用c,在常量池中寻找拼接后的"Hello"字串,把"Hello"字串的地址赋给c 6 String c = "He" + "llo"; 7 // 此时,a、b、c三个对象引用对应的地址都是常量池内"Hello"的地址,所以下面的比较均会返回true 8 System.out.println(a == b);// true 9 System.out.println(a == c);// true 10 11 // 但是下面这种方式不会在常量池中保存 12 // 创建引用d,在堆中开辟空间存储字串"Hello",把空间地址赋给d 13 String d = new String("Hello"); 14 15 // 此时,d对应的地址将是堆内的"Hello"字串地址,而非常量池中"Hello"的地址 16 System.out.println(a == d);// false
1.3 intern方法
1 // 执行扩展,但是引用d的地址并未修改,所以此时比较a和d仍为false 2 d.intern(); 3 System.out.println(a == d);// false 4 5 // 执行扩展,把新地址赋给d,由于新地址指向的是常量池中已经存在的"Hello"字串,所以此时a和d的引用地址相同 6 d = d.intern(); 7 System.out.println(a == d);// true
1.4 参数传递
1 static void testParamTrans() { 2 String param = "Hello World"; 3 User user = new User(0, "Nodin", 23); 4 5 System.out.println("Before-------------"); 6 System.out.printf("param is %s, user.name is %s\n", para, user.getName()); 7 8 change(param, user); 9 10 System.out.println("After------------"); 11 System.out.printf("param is %s, user.name is %s\n", para, user.getName()); 12 } 13 14 static void change(String param, User user) { 15 param = "New World"; 16 user.setName("New Name"); 17 }
param is Hello World, user.name is Nodin
After-------------
1.5 有关字符串的比较
2、StringBuffer
3、StringBuilder
4、String、StringBuffer和StringBuilder的区别
【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder,古老的榕树,5-wow.com
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。