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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 悟佛修道 高级黑马   /  2013-5-22 09:39  /  1489 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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两个对象有何区别啊?

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

4 个回复

倒序浏览
这是java优化内存的机制,如果是两个相同的字符串,就没必要再使用不同的内存地址了。

要注意的是,如果是 new 出来的,即使它们的内容一样,地址也不相同。
回复 使用道具 举报
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;

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
字符串双引用的值如果相同,JVM是不会在字符串池里再创建一个String对象的,而new一个String对象,JVM就会在堆内存中创建一个新的对象,无论你创建对象的值是否和已有对象相同。
回复 使用道具 举报
谢谢各位,原来是这样 。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马