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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小丑的媳妇2 中级黑马   /  2013-3-7 00:44  /  1255 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家知道,符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改
String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象.
请高手看看如下代码:
String s = new String(“abc”);
String s1 = “abc”;
String s2 = new String(“abc”);
System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);


求大侠看一下请问 前面三条语句分别创建了几个对象,分别是什么.后面的输出分别是什么

4 个回复

倒序浏览
补充:
如果是这样的:
String s = new String(“abc”);
String s1 = “abc”;
String s2 = new String(“abc”);
System.out.println(s == s1.intern());
System.out.println(s == s2.intern());
System.out.println(s1 == s2.intern());
求最后输出是什么
回复 使用道具 举报
本帖最后由 夏添 于 2013-3-7 01:08 编辑

==用于引用变量比较时,是比较地址的

String s = new String(“abc”);//创建两个对象,一个 s = new String() ,一个"abc",暂时这么理解吧,
String s1 = “abc”; //一个对象,"abc"
String s2 = new String(“abc”);//创建两个对象,一个 s = new String() ,一个"abc",暂时这么理解吧,
System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);//两个对象,地址肯定不同的了
输出结果是:false false false

System.out.println(s == s1.intern());//s指向堆中对象,s1.intern()指向池中"abc"
System.out.println(s == s2.intern());//s指向堆中对象,s2.intern()指向池中"abc"
System.out.println(s1 == s2.intern());//s1.intern()指向池中"abc",s2.intern()指向池中"abc"
求最后输出是什么  false  false true
回复 使用道具 举报
本帖最后由 夏晓彤 于 2013-3-7 01:39 编辑

String s = new String("abc")创建了几个对象?有2个,new了一个,"abc"也是一个
先执行String s=new String("abc")它会现在字符串池里构造一个值为"abc"的对象,然后执行new语句后,再把“abc”拷贝到堆里面,在String s1="abc时
当程序看到"abc"后,会先到字符串池里找看有没有"abc",由于执行完第一行语句后字符串池里已经有"abc"了就不再创建,注意这里并没有new的操作,而是直接常量
赋值,所以s1会直接指向这个"abc"而不会在堆里产生新的对象
String s2 = new String(“abc”);时,它先到字符串池里找看有没有"abc",然后执行new语句后,再把“abc”拷贝到堆里面
s和s1,s2分别指向不同的对象
所有System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);
都是false如果是
System.out.println(s。equals( s2));这就是true了
字符串池的abc是同一个

回复 使用道具 举报
  1. String s = new String(“abc”);//创建了2个对象,一个是new String()调用String类的构造函数创建的,而这个构造函数接受的参数时字符串“abc” 这是第二个  这都在堆里面
  2. String s1 = “abc”;// 一个  发现字符串池中没有''abc"  就在字符串池中创建了一个赋值给s1  
  3. String s2 = new String(“abc”); 1个   一个是new String()调用String类的构造函数创建的,至于参数呢 因为这时字符串池中已经有''abc"了  直接传递给参数就行了 不用创建 也在堆里
  4. System.out.println(s == s1);   这样你就知道了  s对象在堆中,s1在字符串池中  s2也在堆中,当然和s地址值不一样  所以都是false。
  5. System.out.println(s == s2);
  6. System.out.println(s1 == s2);
复制代码
你二楼的问题  我楼上已经回答过了  不再赘述
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马