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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王程 于 2012-8-6 14:46 编辑
  1. class TestDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. String str1=new String("Student");//1
  6. String str2="Student"; //2
  7. String str3=new String("Student");//3
  8. System.out.println(str1==str2);//false
  9. System.out.println(str1.equals(str3));//true
  10. System.out.println(str2==str3);//false
  11. }
  12. }
复制代码
网上看见的题目,运行结果没有什么好说的,但是题目问的是1,2,3,三句话各自创建了几个对象?
我的理解是1处创建了2个对象,2处创建了1个对象,3处依然创建了2个对象,
但正确答案是1处创建了2个,2处没有创建对象,3处创建了一个对象,这我不大理解啊?

6 个回复

倒序浏览
首先这个是内存的问题,
String str1=new String("Student");//1
这行代码,你先分开看,"Student"  这句就创建了一个对象,然后new String("Student");  是利用已经创建了的String对象又创建了一个String对象,也即是1处创建了2个对象,
String str2="Student";   是将上句中已经创建的对象"Student" 的引用赋值给str2, 因为"Student"是一个已经创建了的对象,它是在内存里的一个特殊区域,具体的我记不清了。。。 所以2处没有创建对象
同理
String str3=new String("Student");//3
"Student" 对象已经在1处被创建过了,所以这行代码仅仅是利用"Student" 对象创建了一个String对象,所以3处创建了1个对象
希望对你有帮助


回复 使用道具 举报
使用双引号形式定义字符串时, 先会在缓冲池中查找是否有这个字符串, 有就直接引用, 没有则创建一个.
//1 开始创建的时候缓冲池中没有"student"   说以要创建一个  前面new String()又创建了一个对象
//2 现在缓冲池中查找有没有"student"这个对象,发现//1已经创建了  所以不用创建了 直接引用
//3 接着在缓冲池中查找到//1创建的"student"  然后直接引用   至创建一个new String()就可以了
回复 使用道具 举报
由于频繁创建字符串很耗内存和String类对象是不能被修改的, 为了提高程序性能,所以字符串创建了字符串缓冲池。
使用双引号形式定义字符串时, 先会在缓冲池中查找是否有这个字符串, 有就直接引用, 没有则创建一个.
使用构造函数定义字符串时, 会先在缓冲池外创建一个对象, 然后查找缓冲池内是否有这个字符串, 没有就在池内再创建一个.

字符串.jpg (807.48 KB, 下载次数: 19)

字符串.jpg
回复 使用道具 举报
第一处 为2,因为 在运行这段指令之前,JVM就已经为"Student"在常量池中创建了一个字符串,
             然后用这个字符串的值来初始化堆中用new指令创建出来的新的String对象。所以是两个对象。s指向的是new出来的那个对象。
第二处 为0,因为String类是java中用得很多的类,为了创建String对象的方便,实现了常量池的技术。所以直接
            查找常量池,有Student,就直接指向,没有的话才创建。 很明显 第一处已经已经在常量池中创建了Student对象,所以没有创建新对象。
第三处 为1,同原因2,常量池中已经有Student,无需再创建,只需要在堆内存中new一个对象,所以为1.
回复 使用道具 举报

class TestDemo
{
public static void main(String[] args)
{
String str1=new String("Student");//1
String str2="Student"; //2
String str3=new String("Student");//3
System.out.println(str1==str2);//false
System.out.println(str1.equals(str3));//true
System.out.println(str2==str3);//false
}
}

首先str1"Student"创建对象并加入字符串池中,然而new String()是在堆内存中开辟了空间,创建了对象,而且是独立的。
这时,str2在创建对象加入字符串中时发现已经有了相同的了,就不会创建,就会和str1同指向一个对象。所以说2步没有创建对象

。str3的时候,"Student"创建对象加入字符串池中时又发现了有相同的了,就和str1和str2同指向一个对象。而new String()是

str3在堆内存中新开辟了空间,创建了自己独立的对象。
回复 使用道具 举报
谢谢啦,解释的相当清楚,问题解决了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马