黑马程序员技术交流社区

标题: 大家学的怎么样了?你能一眼看出它的区别吗? [打印本页]

作者: sunshine9091    时间: 2014-7-26 10:16
标题: 大家学的怎么样了?你能一眼看出它的区别吗?
String s1 = "hi" 和  String s2= new String("hi")有什么区别?
作者: zippo    时间: 2014-7-26 10:21
本帖最后由 zippo 于 2014-7-26 10:35 编辑

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

String s2= new String("hi")方式创建字符串的时候,那么jvm首先也会在字符串常量池中检测是否已经存在了"hi"字符串,如果不存在,那么直接在字符串常量池中创建该对象,而且还会去到堆内存中创建该字符串对象,把字符串常量池中字符串对象的内容拷贝过去,并且把堆内存中字符串对象内存地址返回。如果字符串常量池中已经存在了指定的字符串,那么不会在字符串常量池中再创建,但是也去到堆内存中创建一个字符串对象,并且把字符串常量池中的字符串内容拷贝过去。
作者: 渴望学习    时间: 2014-7-26 10:34
楼上解释的,太详细了
作者: sunshine9091    时间: 2014-7-26 10:34
zippo 发表于 2014-7-26 10:21
String s1 = "hi"创建一个字符串对象的时候,那么首先JVM在字符串常量池中检测是否已经存在了该字符串。如 ...

哈哈,好详细啊,其实String s1 = "hi"中只有一个对象,而String s2 = new String("hi")有两个对象,当你执行System.out.println(s1==s2)时,它会报false,我搞了好久才明白的,所以分享一下。哈哈,,,,
作者: 碎流    时间: 2014-7-26 10:48
String s1 = "hi" 是查找看有没有这个"hi",而String s2 = new String("hi")是直接创建一个,不管有没有"hi",我这个理解哪里有错,大神提出下
作者: 戒风    时间: 2014-7-26 11:03
来学习一下
作者: sunshine9091    时间: 2014-7-26 11:29
碎流 发表于 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的,它们的地址值是一样的,只是指向的地址不一样。
作者: sunshine9091    时间: 2014-7-26 23:11
戒风 发表于 2014-7-26 11:03
来学习一下

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

原来这就是一个对象和两个对象的区别啊  一直没弄明白啊
作者: 大成哥    时间: 2014-7-27 08:10
2楼解释的太详细了!!!!
作者: 叶飞翔    时间: 2014-7-27 08:53
我似乎也明白了一些。。。。
作者: @for    时间: 2014-7-27 08:55
、、、、、、、、、、、、、、、、、、
作者: vaqh    时间: 2014-7-27 08:58
二楼厉害
作者: @for    时间: 2014-7-27 08:59
这个问题很基础的。。
作者: endian11    时间: 2014-7-27 09:16
一个在常量池中,一个在堆
作者: 张周飞    时间: 2014-7-27 09:18
这个问题在 论坛里 问烂了,多关注论坛,能学到很多的知识
作者: sunshine9091    时间: 2014-7-27 09:22
endian11 发表于 2014-7-27 09:16
一个在常量池中,一个在堆

嗯,是的。
作者: 郑阳阳    时间: 2014-7-27 09:28
2L 真心的详细啊 看看2楼就应该明白了把
作者: 我为你着迷    时间: 2014-7-27 09:33
毕老师视频里叙述的已经很清楚啦
作者: sunshine9091    时间: 2014-7-27 14:43
我为你着迷 发表于 2014-7-27 09:33
毕老师视频里叙述的已经很清楚啦

嗯,旨在分享学习!
作者: ztw    时间: 2014-7-27 15:03
第一个是先判断堆内存里面有没有那个对象,有就不用创建,没有就创建,第二个不用判断,直接在堆内存里面新建一个对象
作者: rolling-stone    时间: 2014-7-27 15:31
一个在内存中有一个对象,一个在内存中有两个对象
作者: tiandzwx    时间: 2014-7-27 15:41
赞二楼!
作者: 多此一举    时间: 2014-7-27 16:59
学习学习。。
作者: 波风梅西    时间: 2014-7-27 17:01
zippo 发表于 2014-7-26 10:21
String s1 = "hi"创建一个字符串对象的时候,那么首先JVM在字符串常量池中检测是否已经存在了该字符串。如 ...

要是你自己手打的那就太牛逼了
作者: dingpanbo    时间: 2014-7-27 17:03
解释的很清楚,受教了
作者: sunny~    时间: 2014-7-27 17:07
来瞅瞅,学习一下
作者: heimacs    时间: 2014-7-27 17:38
学习了。
作者: 黑马_java猿    时间: 2014-7-27 17:43
zippo 发表于 2014-7-26 10:21
String s1 = "hi"创建一个字符串对象的时候,那么首先JVM在字符串常量池中检测是否已经存在了该字符串。如 ...

介绍的很好,很详细
作者: sing    时间: 2014-7-27 17:47
真心不会
作者: hejinzhong    时间: 2014-7-27 18:12
知道字符创建过程就0K
作者: java—family    时间: 2014-7-27 18:27
看了这么多人关心着个问题:那我就分享一个面试题。
面试关问:
string str  = new string(“haha”)中创建了几个对象  。
不知道那位能回答哈     共同学习。。
作者: sunshine9091    时间: 2014-7-27 18:32
java—family 发表于 2014-7-27 18:27
看了这么多人关心着个问题:那我就分享一个面试题。
面试关问:
string str  = new string(“haha”)中创 ...

是两个!将这个帖子从头到尾看完就能找到答案。
作者: java—family    时间: 2014-7-27 18:42
sunshine9091 发表于 2014-7-27 18:32
是两个!将这个帖子从头到尾看完就能找到答案。

错  ,这么好理解 就不能分享出来了

作者: sunshine9091    时间: 2014-7-27 18:50
java—family 发表于 2014-7-27 18:42
错  ,这么好理解 就不能分享出来了

那你给我讲讲。。
作者: huangxuanheng    时间: 2014-7-27 19:00
sunshine9091 发表于 2014-7-26 10:34
哈哈,好详细啊,其实String s1 = "hi"中只有一个对象,而String s2 = new String("hi")有两个对象,当你 ...

楼上说的太对了
作者: java—family    时间: 2014-7-27 19:46
sunshine9091 发表于 2014-7-27 18:50
那你给我讲讲。。

说一个不对,说两个也不对。如果面试官问你,你要回答,有可能是1个,也有可能是两个。原因要看常量池里面最开始有没有“haha”这字符串。。。。。。。。。。。。
作者: conglin1991    时间: 2014-7-27 20:55
膜拜了。。。
作者: sunshine9091    时间: 2014-7-27 23:45
java—family 发表于 2014-7-27 19:46
说一个不对,说两个也不对。如果面试官问你,你要回答,有可能是1个,也有可能是两个。原因要看常量池里 ...

嗯是的,可能是我回答的不严谨,但是我在回答5楼的问题时已经分情况了啊!跟你说的一样!
作者: 淡淡柠檬茶    时间: 2014-7-28 00:08
路过走走




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2