黑马程序员技术交流社区
标题:
一个简单问题,就是想不到,关于String
[打印本页]
作者:
janfrost
时间:
2015-2-4 20:40
标题:
一个简单问题,就是想不到,关于String
private final static String MESSAGE = "heima";
public static void main(String[] args) {
String a = "hei"+"ma";
String b = "hei";
String c = "ma";
System.out.println(a==MESSAGE);
System.out.println((b+c)==MESSAGE);
}
复制代码
问打印结果。
想不通为什么。。唉。
作者:
田得聖老师
时间:
2015-2-4 20:45
==比较的是引用地址,比较字符串内用用equals
作者:
张_磊
时间:
2015-2-4 21:42
String字符串存在于常量池中,String a 的“heima”,是在常量池中找有没有,有的话就直接拿来用,也就是指向了MESSAGE。所以他们的地址值相同。而b+c是又造了一个String字符串,==比较地址值时返回结果为false,用(b+c).equals(MESSAGE)的返回结果就为true。(个人理解的观点)
作者:
kenfine
时间:
2015-2-4 22:15
这个涉及到一个设计模式:享元设计模式。好像很复杂...{:3_62:}
作者:
duxubo
时间:
2015-2-4 22:29
private final static String MESSAGE = "heima";
String a = "hei"+"ma"; 因为hei ma 是字面常量值 在编译器编译时,就已经在class文件中写死了 和MESSSAGE他们在
常量
池中同为同一个值,所以为true而b+c是变量在编译期间无法确定其具体值。Java在操作b+c是其实是调用StringBuilder执行append方法完成字符串的拼接,位于
字符串缓冲区
所以最后一条语句放回false
作者:
duxubo
时间:
2015-2-4 22:30
是返回false 刚才打错字了
作者:
边晓炎
时间:
2015-2-4 22:32
受教了!
作者:
邓士林
时间:
2015-2-5 16:00
并不是每个String都会创建一个对象
作者:
xiao飞
时间:
2015-2-5 16:30
我记得是 在创建字符串 会先在方法去的常量池中去找是否有相同的字符串,如果没有就创建,有就不创建
作者:
huangchunwei
时间:
2015-2-5 17:57
学习学习。。。
作者:
冷遇
时间:
2015-2-5 20:29
多分享,多收获,多学习!
作者:
robertlu
时间:
2015-2-5 21:21
我也不是很理解
作者:
烟雾绕
时间:
2015-2-5 21:56
henhaodetiezi
作者:
outsider1020
时间:
2015-2-5 22:06
学习学习。。。。。。
作者:
奔跑的猴子
时间:
2015-2-5 22:50
5楼说的很详细
作者:
610757257
时间:
2015-2-6 01:26
ture
ture
作者:
Julie
时间:
2015-2-6 01:33
打印出 true和false。因为MESSAGE是静态变量,被放在方法区,对象a在创建对象之前现在方法区查找看是否有自己想要的东西,一看,已经有“heima”了,所以a就指向了这块区域,即返回true。但是(b+c)就相当于在堆中开辟了一块新的空间放“heima”,地址不相同,所以返回false
作者:
Julie
时间:
2015-2-6 01:34
你再复习一下String类那部分的知识点。
作者:
BEIKOU
时间:
2015-2-6 08:04
感谢分享,学习了
作者:
O(∩_∩)O~wen
时间:
2015-2-6 09:03
private final static String MESSAGE = "heima";
public static void main(String[] args) {
String a = "hei"+"ma";
String b = "hei";
String c = "ma";
System.out.println(a==MESSAGE);
System.out.println((b+c)==MESSAGE);
System.out.println((b+c).equals(MESSAGE));
复制代码
首先MESSAGE是一个常量,是存在常量池中的,a的字符串也是“heima”所以会从常量池中找到“heima"而不是自己在创建一个,因而a的地址和MESSAGE的地址是一个地址。b,c从一开始的就是各自新建了一个字符串,地址也就跟a的不一样,加完了也就相当于重新创建了一个字符串重新给这个b+c分配了空间,地址也不一样
作者:
万合天宜
时间:
2015-2-6 09:50
直接看图,一目了然。
String直接复制的特点.png
(96.34 KB, 下载次数: 9)
下载附件
2015-2-6 09:50 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2