A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s1 = "hi" 和  String s2= new String("hi")有什么区别?

41 个回复

倒序浏览
本帖最后由 zippo 于 2014-7-26 10:35 编辑

String s1 = "hi"创建一个字符串对象的时候,那么首先JVM在字符串常量池中检测是否已经存在了该字符串。如果存在,那么直接返回字符串常量池中该字符串的内存地址。如果不存在,那么现在字符串常量池中创建该字符串的对象,然后返回该字符串对象的内存地址。

String s2= new String("hi")方式创建字符串的时候,那么jvm首先也会在字符串常量池中检测是否已经存在了"hi"字符串,如果不存在,那么直接在字符串常量池中创建该对象,而且还会去到堆内存中创建该字符串对象,把字符串常量池中字符串对象的内容拷贝过去,并且把堆内存中字符串对象内存地址返回。如果字符串常量池中已经存在了指定的字符串,那么不会在字符串常量池中再创建,但是也去到堆内存中创建一个字符串对象,并且把字符串常量池中的字符串内容拷贝过去。

点评

牛逼,这。。。。。  发表于 2014-7-26 11:36
学习了~  发表于 2014-7-26 10:24
回复 使用道具 举报
楼上解释的,太详细了
回复 使用道具 举报
zippo 发表于 2014-7-26 10:21
String s1 = "hi"创建一个字符串对象的时候,那么首先JVM在字符串常量池中检测是否已经存在了该字符串。如 ...

哈哈,好详细啊,其实String s1 = "hi"中只有一个对象,而String s2 = new String("hi")有两个对象,当你执行System.out.println(s1==s2)时,它会报false,我搞了好久才明白的,所以分享一下。哈哈,,,,
回复 使用道具 举报
String s1 = "hi" 是查找看有没有这个"hi",而String s2 = new String("hi")是直接创建一个,不管有没有"hi",我这个理解哪里有错,大神提出下
回复 使用道具 举报
戒风 来自手机 中级黑马 2014-7-26 11:03:55
地板
来学习一下
回复 使用道具 举报
碎流 发表于 2014-7-26 10:48
String s1 = "hi" 是查找看有没有这个"hi",而String s2 = new String("hi")是直接创建一个,不管有没有"hi", ...

在常量池中先寻找这个hi,已经有了hi这个对象,但是new又创建了一个对象,,,所以这个过程需要明白,(s1==s2)得出的是false,而(s1.equals(s2))是true的,它们的地址值是一样的,只是指向的地址不一样。
回复 使用道具 举报

一起学习,共同进步!:D
回复 使用道具 举报
zippo 发表于 2014-7-26 10:21
String s1 = "hi"创建一个字符串对象的时候,那么首先JVM在字符串常量池中检测是否已经存在了该字符串。如 ...

原来这就是一个对象和两个对象的区别啊  一直没弄明白啊
回复 使用道具 举报
2楼解释的太详细了!!!!
回复 使用道具 举报
我似乎也明白了一些。。。。
回复 使用道具 举报
@for 中级黑马 2014-7-27 08:55:57
12#
、、、、、、、、、、、、、、、、、、
回复 使用道具 举报
vaqh 中级黑马 2014-7-27 08:58:13
13#
二楼厉害
回复 使用道具 举报
@for 中级黑马 2014-7-27 08:59:34
14#
这个问题很基础的。。
回复 使用道具 举报
一个在常量池中,一个在堆
回复 使用道具 举报
这个问题在 论坛里 问烂了,多关注论坛,能学到很多的知识
回复 使用道具 举报
endian11 发表于 2014-7-27 09:16
一个在常量池中,一个在堆

嗯,是的。
回复 使用道具 举报
2L 真心的详细啊 看看2楼就应该明白了把
回复 使用道具 举报
毕老师视频里叙述的已经很清楚啦
回复 使用道具 举报
我为你着迷 发表于 2014-7-27 09:33
毕老师视频里叙述的已经很清楚啦

嗯,旨在分享学习!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马