黑马程序员技术交流社区
标题:
求解:java –string类的问题
[打印本页]
作者:
小丑的媳妇2
时间:
2013-3-7 00:44
标题:
求解:java –string类的问题
大家知道,符串对象是一种特殊的对象.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);
求大侠看一下请问 前面三条语句分别创建了几个对象,分别是什么.后面的输出分别是什么
作者:
小丑的媳妇2
时间:
2013-3-7 00:45
补充:
如果是这样的:
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());
求最后输出是什么
作者:
wahaha
时间:
2013-3-7 01:06
本帖最后由 夏添 于 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:25
本帖最后由 夏晓彤 于 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是同一个
作者:
amen0205
时间:
2013-3-7 01:40
String s = new String(“abc”);//创建了2个对象,一个是new String()调用String类的构造函数创建的,而这个构造函数接受的参数时字符串“abc” 这是第二个 这都在堆里面
String s1 = “abc”;// 一个 发现字符串池中没有''abc" 就在字符串池中创建了一个赋值给s1
String s2 = new String(“abc”); 1个 一个是new String()调用String类的构造函数创建的,至于参数呢 因为这时字符串池中已经有''abc"了 直接传递给参数就行了 不用创建 也在堆里
System.out.println(s == s1); 这样你就知道了 s对象在堆中,s1在字符串池中 s2也在堆中,当然和s地址值不一样 所以都是false。
System.out.println(s == s2);
System.out.println(s1 == s2);
复制代码
你二楼的问题 我楼上已经回答过了 不再赘述
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2