黑马程序员技术交流社区
标题:
字符串双引号与new对象有何区别
[打印本页]
作者:
悟佛修道
时间:
2013-5-22 09:39
标题:
字符串双引号与new对象有何区别
class HashSetDemo
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
HashSet hs = new HashSet();
sop(hs.add("java01"));
sop(hs.add("java01"));
hs.add("java02");
hs.add("java03");
hs.add("java03");
hs.add("java04");
Iterator it = hs.iterator();
while(it.hasNext())
{
sop(it.next());
}
}
}
复制代码
sop(hs.add("java01"));
sop(hs.add("java01"));
为什么说这两个java01地址值相同?他们不是字符串双引号形式的两个对象吗?两个对象怎么地址值会相同呢?跟new两个对象有何区别啊?
作者:
骑上最爱
时间:
2013-5-22 10:05
这是java优化内存的机制,如果是两个相同的字符串,就没必要再使用不同的内存地址了。
要注意的是,如果是 new 出来的,即使它们的内容一样,地址也不相同。
作者:
翟宝海
时间:
2013-5-22 10:12
JJAVA虚拟机(JVM)中存在着一个字符串池,用于保存String对象,可以被共享使用,值一经创建就不可改变;
String a="abc";这行代码被执行的时候,JAVA虚拟机首先会在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
这段代码一共只生成一个对象"abc",并被保存在字符串池中;如果我们再写一行代码,String b="abc";这个时候JAVA虚拟机会直接在字符串池中查找到已经存在了"abc"这么一个对象,就会将该对象的引用直接返回给b,而不会创建新对象;因此a==b是true;
而当采取String a=new("abc");String b=new("abc");时,是用new()来创建对象的,它会存放在堆中,每调用一次就会创建一个新的对象;这个时候a==b就是false;
作者:
无妄无涯
时间:
2013-5-22 12:34
字符串双引用的值如果相同,JVM是不会在字符串池里再创建一个String对象的,而new一个String对象,JVM就会在堆内存中创建一个新的对象,无论你创建对象的值是否和已有对象相同。
作者:
悟佛修道
时间:
2013-5-22 23:30
谢谢各位,原来是这样 。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2