黑马程序员技术交流社区

标题: 字符串双引号与new对象有何区别 [打印本页]

作者: 悟佛修道    时间: 2013-5-22 09:39
标题: 字符串双引号与new对象有何区别
  1. class HashSetDemo
  2. {
  3. public static void sop(Object obj)
  4. {
  5. System.out.println(obj);
  6. }
  7. public static void main(String[] args)
  8. {

  9. HashSet hs = new HashSet();

  10. sop(hs.add("java01"));
  11. sop(hs.add("java01"));
  12. hs.add("java02");
  13. hs.add("java03");
  14. hs.add("java03");
  15. hs.add("java04");

  16. Iterator it = hs.iterator();

  17. while(it.hasNext())
  18. {
  19. sop(it.next());
  20. }
  21. }
  22. }
复制代码
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