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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s1 = "abc"
String s2 = new String("abc")
s1 s2 有什么区别?
s1 是一个对象  abc;
s2 是两个对象 new String?跟abc??
如果是他们在内存中是什么样子?

5 个回复

倒序浏览
String s1 = "abc"  实际上就是把一个在堆中开辟好的堆内存空间的使用权交给了str1对象,

String s2 = new String("abc")
如果使用new关键字,不管如何都会再开辟一个新的空间,但是此时,内容还是abc,所以上面的代码相当于是开辟了两个内存空间,而真正使用的是用关键字new开辟的空间,另一个就是垃圾空间了。

但是我的经验是:对于字符串的操作就采用直接赋值,即第一种方式完成,而不要采用构造方法传递字符串的方式完成,这样可以避免产生垃圾空间。
回复 使用道具 举报
String s1 = "abc"
这个语句执行的操作是:在方法区的常量池中查找是否存在"abc"字符串,若存在就将此字符串的地址赋给s1,若不存在就在常量池中开辟一个空间,并将"abc"存入这个空间,并将地址赋给s1.
String s2 = new String("abc")
这一句执行的操作是:首先在堆内存中开辟一个空间存放"abc",并将指向这个对象的引用(即abc的地址)传给s2,然后在方法区的常量池中查找是否存在"abc",若存在则将堆内存空间中的对象与常量池中的"abc"关联,若没有则在常量池中开辟一个空间存放"abc",并将其与堆内存中的对象关联。
所以s1和s2这两个字符串中的值相等,但所指向的内存地址不相等,一个在堆内存中,一个在常量池中。
回复 使用道具 举报
jvm在启动时,在内存中开辟了一块空间叫做字符串池(string pool)用于存放字符串常量。
每一个常量字符都是一个匿名String类对象。
String s1="abc" ,jvm先到字符串池中查看,有没有一个内容是"abc"的String类对象,有就让s1直接指向这个对象,没有,就新建一个,再让s1指向。
所以你如果再写一个String s2="abc"  ,字符串池中并没有新建对象,只不过让s2指向了"abc"对象,所以s1==s2;
但是当你String s3=new String("abc");后,先查看字符串池里有没有内容"abc"的对象。有,就在池中创建一个拷贝到堆(heap)中;没有,就直接在堆中创建对象。两种情况都把堆内存中的地址返回给s3.
很明显,s1,s2都不等于s3.
回复 使用道具 举报
String s1="abc"
Java运行环境有一个字符串池,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给s1,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给s1

String s2=new String("abc")
不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc",然后将其付给s2——新建的字符串"abc"不是在字符串池中
回复 使用道具 举报
楼主天天快乐,吉祥如意!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马