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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 葛晓东 中级黑马   /  2014-5-31 16:48  /  1654 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 葛晓东 于 2014-6-3 23:45 编辑

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

点评

视频里有详解!!!  发表于 2014-5-31 17:03

10 个回复

倒序浏览
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在内存中有两个对象  
回复 使用道具 举报
String s1="abc"这行代码执行时,java虚拟机先到一个存放很多共享使用String对象的字符串池寻找,如果存在“abc”,则不创建新对象,直接返回对象引用。如果没有就创建对象加入到字符串池再返回引用。
而String s2=new String("abc")语句中,“abc”本身就是字符串池的对象,运行new String时,就会在堆内存里复制一份“abc”,并把复制的对象引用赋予s2,就等于创建了两个对象。
回复 使用道具 举报
s2是创建的一个对象,而s1只是声明一个字符串
回复 使用道具 举报
再补充一下,在JDK5.0中,java虚拟机在启动的时候会实例化9个对象池,这九个对象池分别用来存贮8种基本类型的包装类对象和String对象。当创建s1时,jvm会去查找对象池中是否存在“abc”,如果存在则不会创建对象,直接拿现成,如果不存在,再创建对象;而创建s2时,不管对象池中有没有“abc”都会创建对象s2.
回复 使用道具 举报
s1在内存中有一个对象   
s2在内存中有两个对象  
回复 使用道具 举报
superob123 发表于 2014-5-31 17:06
String s1="abc"这行代码执行时,java虚拟机先到一个存放很多共享使用String对象的字符串池寻找,如果存在 ...

好吧  常量池木有学。。。。
回复 使用道具 举报
第一种方式,其实在内存中有1个对象存在。
第二种方式,在内存中只有2个对象存在。
回复 使用道具 举报
yang1352546 发表于 2014-5-31 16:51
String s1 = "abc";s1是一个类类型变量,"abc"是一个对象

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

前面的看的懂,后面的   看不懂  为什么  s2  是两个对象?
回复 使用道具 举报
一楼正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马