字符串的运行结果的具体分析

abcdefghiijklmnopqrs 2014-06-30 04:27:59
01: public class Test { 
public static void main(String[] args) {
String first = "Phone:" + "55555";
String second = "Phone:" + 55555;
String third = new String("Phone:") + new String("55555");
String fourth = new String("Phone:") + 55555;
System.out.println(first==second);
System.out.println(first==third);
System.out.println(first==fourth);
}
}
...全文
177 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dandan8989251 2014-07-01
  • 打赏
  • 举报
回复
先说理论: 用'String X = "X" ;方式 声明先去找字符常量池有没有这个引用,有的话就直接给引用地址给栈里的字面值X; 用NEW 方式声明则不会去找,直接在堆内存NEW类.把新建的类的引用地址给栈里的字面值X; String first = "Phone:" + "55555"; String second = "Phone:" + 55555; //true,找了字符常量池,所以为真 String third = new String("Phone:") + new String("55555"); //false,new 方式没找字符常量池,所以为假 String fourth = new String("Phone:") + 55555; //false,new 方式,没找字符常量池,所以为假
-江沐风- 2014-06-30
  • 打赏
  • 举报
回复
比较好的理解方式便是研究一下JVM; 看一下内存中对字符串的处理,如堆栈的引用,运行时常量池的使用;
疯癫行者 2014-06-30
  • 打赏
  • 举报
回复
true false false 第一个true的原因是:first和second都会放在jvm的常量区,而且重复定义的常量会合并为一个,所以,first和second指向的地址相同。 第二个和第三个false的原因是:他们都分别指向各自的放在堆区里的不同对象,所以==判断是不同的。
商科程序员 2014-06-30
  • 打赏
  • 举报
回复
这个测试的是JVM对字符串的管理了。 想知道结果,读JVM源码比较好。想通过测试的方式来猜测实现,比较难。
zzqcsdn123 2014-06-30
  • 打赏
  • 举报
回复
第一个是true其余的都是false。 == 你去查看下java.lang.object类的equals方法,==是比较内存地址是否相同,或者比较基本类型的值是否相同,比如: 1 == 1比较的是2个基本类型的值 对象1 == 对象2 比较是2个对象在内存中的地址的引用是否是同一个,说白了就是比较是否引用了相同对象,即是否是同一个对象。 说这个可以延伸到更深层次,呵呵慢慢研究吧,你可以关注下hashcode 和equals方法对于这个的延伸
zzt369880281 2014-06-30
  • 打赏
  • 举报
回复
我觉得都是false,

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧