新手提问:java 字符串String一些运行机制的东西

q307115253 2012-11-26 03:57:52
String str1 = "dx";
String str2 = new String("dx");
String str4 = "d";
String str5 = "x";

String str3 = str4+str5;
final String str6 = "d";
String str7 = str6 + "x";
String str8 = "d" + "x";


System.out.println(str1 == str2.intern());//true
System.out.println(str1==str3);//false
System.out.println(str1==str7);//true
System.out.println(str7==str8);//true

各位大牛能帮我解释下这个结果的原因吗?
...全文
136 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yh0123123 2012-11-26
  • 打赏
  • 举报
回复
String的==比较的是两者是否同一对象。 直接赋值的如String s="dx",这样的对象放在常量池中,编译过程中就能够识别,new出来的的放在堆内存中,执行期再分配新的内存,所以str1和str2不是同一对象。而intern函数具体可以自己查一下api文档,大概是从常量池中找有没有相等的对象,这里的相等时用equals来判断。有就用,没有就在池里新创建,显然str2的对象在常量池中能找到,所以是用的同一对象。str1=str2。str4和str5在编译期是不能识别的,得执行中动态分配新的内存,所以和指向常量池中的对象的str1不==。str6则是因为加了final,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中。简单点来理解加了final时str7等效于str7="d"+"x",也等效于str7="dx";
ExceptionBaby 2012-11-26
  • 打赏
  • 举报
回复
看看这个吧。http://hi.baidu.com/xianminvip/item/44ecbe8d83b6fdcab071544d
ExceptionBaby 2012-11-26
  • 打赏
  • 举报
回复
关于Java中String的问题,可以说一百度可以搜出好几页。 为什么不肯自己查一下列? 搜索一下String 常量池

62,620

社区成员

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

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