黑马程序员技术交流社区

标题: String类小问 [打印本页]

作者: 葛晓东    时间: 2014-5-31 16:48
标题: String类小问
本帖最后由 葛晓东 于 2014-6-3 23:45 编辑

String s1 = "abc";
String s2 = new String("abc");
s1和s2  有什么区别?
作者: yang1352546    时间: 2014-5-31 16:51
String s1 = "abc";s1是一个类类型变量,"abc"是一个对象

字符串最大的特点就是:一旦被初始化就不可以改变。

字符串既是一个对象,也是一个常量。

String s2 = new String("abc");

s1==s2;   false                s2  new一个新的对象   

s1.equals(s2);    ture                equals比较的是内存地址值

String类复写了object类中的equals方法,该方法用于判断字符串是否相等
s1和s2  有什么区别?
s1在内存中有一个对象   
s2在内存中有两个对象  

作者: superob123    时间: 2014-5-31 17:06
String s1="abc"这行代码执行时,java虚拟机先到一个存放很多共享使用String对象的字符串池寻找,如果存在“abc”,则不创建新对象,直接返回对象引用。如果没有就创建对象加入到字符串池再返回引用。
而String s2=new String("abc")语句中,“abc”本身就是字符串池的对象,运行new String时,就会在堆内存里复制一份“abc”,并把复制的对象引用赋予s2,就等于创建了两个对象。

作者: 陈冬冬    时间: 2014-5-31 17:23
s2是创建的一个对象,而s1只是声明一个字符串
作者: 陈冬冬    时间: 2014-5-31 17:32
再补充一下,在JDK5.0中,java虚拟机在启动的时候会实例化9个对象池,这九个对象池分别用来存贮8种基本类型的包装类对象和String对象。当创建s1时,jvm会去查找对象池中是否存在“abc”,如果存在则不会创建对象,直接拿现成,如果不存在,再创建对象;而创建s2时,不管对象池中有没有“abc”都会创建对象s2.
作者: wangkerui    时间: 2014-5-31 18:39
s1在内存中有一个对象   
s2在内存中有两个对象  
作者: 葛晓东    时间: 2014-5-31 22:34
superob123 发表于 2014-5-31 17:06
String s1="abc"这行代码执行时,java虚拟机先到一个存放很多共享使用String对象的字符串池寻找,如果存在 ...

好吧  常量池木有学。。。。

作者: 黑马粉、峥    时间: 2014-5-31 22:35
第一种方式,其实在内存中有1个对象存在。
第二种方式,在内存中只有2个对象存在。
作者: 葛晓东    时间: 2014-5-31 22:36
yang1352546 发表于 2014-5-31 16:51
String s1 = "abc";s1是一个类类型变量,"abc"是一个对象

字符串最大的特点就是:一旦被初始化就不可以改 ...

前面的看的懂,后面的   看不懂  为什么  s2  是两个对象?
作者: 小黑驴    时间: 2014-5-31 23:35
一楼正解




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