黑马程序员技术交流社区
标题: String类的疑惑,求解决,, [打印本页]
作者: 高昌德 时间: 2014-11-5 13:53
标题: String类的疑惑,求解决,,
String s1 = "abc";
String s2 = new String("abc");
s1和s2的区别,为什么是s1在内存中有一个对象,s2在内存中有两个对象?
1:System.out.println(s1.hashCode());
2:System.out.println(s2.hashCode());
1和2输出的结果为什么是相同的,hashCode()不是获取内存地址值得吗?
难道s1和s2是相同的?
作者: wf111sxwf 时间: 2014-11-5 14:53
给你一个经典解答 ,传送门:http://bbs.itheima.com/forum.php?mod=viewthread&tid=150754
作者: 冷锋也温柔 时间: 2014-11-5 15:06
String s1=new String("helloword"); 先在堆内存中创建一个对象,并得到一个地址值(比如00010),然后在常量池中开辟一个空间,创建一个String对象为helloword,并得到一个地址值(比如00020),然后把00020传给00010,最后把00010传给s1
String s2=“helloWord"; 直接在常量池里开辟空间(其实先在常量寻找helloWord,如果有则把地址值传给s2,如果没有则开辟空间)
一目了然 他俩的地址值不可以一样
-
创建对象和直接赋值的区别.jpg
(77.21 KB, 下载次数: 1)
创建对象和直接赋值的区别
作者: sk0806 时间: 2014-11-5 15:07
s1==s2的话为FALSE
s1.equals(s2)为TRUE
前者比较的是两个对象,后者比较的是两个对象的字符串内容
作者: 高昌德 时间: 2014-11-5 15:40
表示很不解,是不是没有学习常量池,许多东西不知道
作者: wf111sxwf 时间: 2014-11-5 15:43
字符串常量池你可以简单理解成 内存中专门存储字符串对象的一个空间。
作者: 高昌德 时间: 2014-11-5 15:45
String s1 = new String("helloword");是不是s1找堆内存中的地址,堆内存中的地址找常量池中的地址,然后得到数据。
而String s2 = "helloword";直接到常量池中找数据。
作者: 高昌德 时间: 2014-11-5 15:46
这个还比较好理解
作者: 冷锋也温柔 时间: 2014-11-6 12:57
是的
s1==s2的话为FALSE 是因为==比较的是地址值
s1.equals(s2)为TRUE 是因为equals比较的是内容
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |