黑马程序员技术交流社区

标题: 字符串的相关问题 [打印本页]

作者: Cheers_for_CRAZ    时间: 2014-1-2 22:58
标题: 字符串的相关问题

  1. public class StringTest {
  2.         public static void main(String[] args) {

  3.                         String str1 = "abc"+"bcd";
  4.                         String str2 = "abcbcd";
  5.                         String str3 = "abc";
  6.                         String str4 = "bcd";
  7.                         String str5 = str3+str4;
  8.                         System.out.println(str1 == str2);
  9.                         System.out.println(str1 == str5);
  10.         }
  11. }
复制代码



为什么?求大神解释!


作者: 浮出一个美    时间: 2014-1-3 00:03
字符串一旦创建便不会被更改
指定一个字符串或者串联字符串都会先在字符串池里寻找该字符串是否存在,
如果存在,则用此对象,不会重新创建,如果不存在,则创建对象。
new 字符串就一定会创建一个字符串
String str1 = "abc"+"bcd";相当于String str1 = "abcbcd";
第一句先把abcbcd放进了线程池,第二句的str2就直接指向了str1指向的线程池中的字符串abcbcd
所以他们属于同一个对象
然后,第三句,第四句,第五句都是新创建了一个字符串对象
作者: 其LovE斤    时间: 2014-1-3 00:25
字符串是常量;它们的值在创建之后不能更改。 String 对象是不可变的,所以可以共享

String str1 = "abc"+"bcd";
是由于编译器做了优化,编译器会先把字符串拼接,再在常量池中查找这个字符串是否存在,如果存在,则让变量直接引用该字符串。所以str1和str2引用也是相同的。
System.out.println(str1 == str2);//true

String str5 = str3+str4;     
str3和str4是两个变量,编译器认为是两个变量相加,不会做优化. str5 的对象不是显式赋值,编译器会在堆中重新分配一个区域来存储它的对象数据。所以str1和str5的引用是不一样的。
System.out.println(str1 == str5);//false





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2