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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张狮子 中级黑马   /  2016-5-3 22:53  /  628 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String a = "ab";
String b = "ab";
String c = "abc";
String d = a+"c";

System.out.println(a==b);
System.out.println(c==d);
为什么a=b而c不等于d哪?

10 个回复

倒序浏览
还没学到字符串{:2_30:}{:2_33:}
回复 使用道具 举报
这里的==比较的是地址值你应该知道吧?
String a = "ab";//字符串常量池里,找不到"ab",好,那就创建一个.地址值假设为001

String b = "ab";//"ab",我常量池里有,直接引用,所以b的地址值也是001.所以 a==b;

String c = "abc";   //字符串常量池里没有"abc",好创建一个,地址值假设为002

String d = a+"c";//而这里要说得话我文笔不是很好,说不太清楚
你可以这样理解,这个d是在堆内存中的对象,地址值你觉得和常量池里的abc是一样吗?
底层好像是一个StringBuilder对象.最后这段话看不懂的话就忽略吧,你就当它是一个堆内存对象,那它的地址值和常量池里的对象有可能是一样的吗?
回复 使用道具 举报
接着楼上说:String d = a +"c"为什么不等于c的问题;
这里你要理解+号的意思,+为java中的一种重载运算符号。那么String d = a +"c"java虚拟机对他的处理为实际上: String d = ( new StringBuilder( String.valueOf(a) ) ).append("c").toString();这里可以看到先new了一个StringBuilder对象,这时候就在堆内存中创建了一个对象,而d指向的是这个对象的内存地址。所以和c指向的地址不同。
String c = "abc" 等价于 final String c = "abc";也就是说它是个常量。所以肯定会跟一个对象不同。
这种变态的问题,了解一下就好了。初级开发是用不到的。
回复 使用道具 举报
还正在学习中
回复 使用道具 举报
成员变量会创建一个常量池,那个b会直接指向之前啊所指的那个"ab",所以一样.后面呢个不是很清楚啊
回复 使用道具 举报
相同的字符串在常量池中只创建一次,所以a和b是两个引用指向同一个对象,而c指向的是常量池中的"abc",地址,d指向的是堆内存
回复 使用道具 举报
==号比较的是地址,d是堆内存中的new对象出来的地址,c是常量池里的地址。
回复 使用道具 举报
success560 来自手机 中级黑马 2016-5-5 08:35:15
9#
也还在学习中
回复 使用道具 举报
你可以看看 == 和equal的区别
回复 使用道具 举报
地制值不相同,一个事常量的地址值,一个是new的地址,这就好理解了吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马