黑马程序员技术交流社区
标题:
这道想不通
[打印本页]
作者:
张狮子
时间:
2016-5-3 22:53
标题:
这道想不通
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哪?
作者:
zhxz521
时间:
2016-5-3 23:00
还没学到字符串{:2_30:}{:2_33:}
作者:
张金金金
时间:
2016-5-3 23:19
这里的==比较的是地址值你应该知道吧?
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对象.最后这段话看不懂的话就忽略吧,你就当它是一个堆内存对象,那它的地址值和常量池里的对象有可能是一样的吗?
作者:
Sj改变
时间:
2016-5-4 23:36
接着楼上说: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";也就是说它是个常量。所以肯定会跟一个对象不同。
这种变态的问题,了解一下就好了。初级开发是用不到的。
作者:
SilentMax
时间:
2016-5-4 23:44
还正在学习中
作者:
番茄君
时间:
2016-5-5 00:16
成员变量会创建一个常量池,那个b会直接指向之前啊所指的那个"ab",所以一样.后面呢个不是很清楚啊
作者:
18735346124
时间:
2016-5-5 01:59
相同的字符串在常量池中只创建一次,所以a和b是两个引用指向同一个对象,而c指向的是常量池中的"abc",地址,d指向的是堆内存
作者:
jialianghao
时间:
2016-5-5 07:12
==号比较的是地址,d是堆内存中的new对象出来的地址,c是常量池里的地址。
作者:
success560
时间:
2016-5-5 08:35
也还在学习中
作者:
Midicy
时间:
2016-5-5 08:58
你可以看看 == 和equal的区别
作者:
WDzyll
时间:
2016-5-5 10:01
地制值不相同,一个事常量的地址值,一个是new的地址,这就好理解了吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2