A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Cheers_for_CRAZ 中级黑马   /  2014-1-2 22:58  /  982 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  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. }
复制代码



为什么?求大神解释!

2 个回复

倒序浏览
字符串一旦创建便不会被更改
指定一个字符串或者串联字符串都会先在字符串池里寻找该字符串是否存在,
如果存在,则用此对象,不会重新创建,如果不存在,则创建对象。
new 字符串就一定会创建一个字符串
String str1 = "abc"+"bcd";相当于String str1 = "abcbcd";
第一句先把abcbcd放进了线程池,第二句的str2就直接指向了str1指向的线程池中的字符串abcbcd
所以他们属于同一个对象
然后,第三句,第四句,第五句都是新创建了一个字符串对象
回复 使用道具 举报
字符串是常量;它们的值在创建之后不能更改。 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
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马