String == equals 堆 常量池

问题

我们知道创建一个String类型的变量有以下两种方法:

String str1 = "abc";
String str2 = new String("abc");

那么问题来了:

String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a.equals(c));
System.out.println(c == d);
System.out.println(c.equals(d));

答案

true
false
true
false
true

有没有得出正确答案?为什么会得出这样的输出,它们在内存中的表现形式以及比较的区别?

解析

用equals为true很简单,因为equals方法永远比较的是值,而非引用。而==比较的是对象的引用,那么a == cc == d结果为false也好理解,因为用new创建的字符串每次都会在JVM的堆中创建新的内存空间,地址当然不一样。
a == b为true这个就特殊点了,要弄明白字符串在内存中的分配才知道为什么。

 

如上图,变量a和b赋值的abc字符串相当于常量,是在方法区中分配的,常量只会创建一份。而c和d两个变量通过new创建的,是在JVM的堆内存中分配的。结果一目了然。



作者:Misout
链接:https://www.jianshu.com/p/8421596f0d36
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

全部评论

相关推荐

06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
07-16 14:10
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务