黑马程序员技术交流社区

标题: 关于set的问题 [打印本页]

作者: 何创    时间: 2012-10-24 12:49
标题: 关于set的问题
今天在想一个问题,大家都知道set集合是不可重复的,但是我想问问,那么用什么方法来区分重复与否?是用==还是equals()?它们有什么区别啊?
作者: 黄邦荣    时间: 2012-10-24 12:52
Set里的元素是不能重复的,用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
作者: 张忠豹    时间: 2012-10-24 12:56
上面那哥们的解释是张孝祥java就业宝典里面的……
TreeSet是用equals方法来区分,Treeset集合中的元素是否相等
HashSet是用hashCode与equals方法来区分,集合中元素是否相等。
作者: up_    时间: 2012-10-24 14:18
Set只是一个接口,下面有众多的实现类,每个类的内部数据结构都不同,所以判断方法也
不一样,使用频率较高的有两个,一个是HashSet,它是通过自己的hashCode()方法得到哈希值,
来确定在HashSet集合中的位置。将元素存入HashSet集合时,会计算对象的哈希值来找到对象应
该放置的位置,如果该位置已有对象存在(它们的哈希值相同),那么会继续使用equals()方法来判断
这两个对象是否相同,如果相同,则不会存入集合,如果不同,则会在已有对象的位置上顺延一位存储该对象。
另一个是TreeSet,是通过自定义比较器来实现TreeSet集合对元素的排序的。
作者: 高正新    时间: 2012-10-24 15:22
Set是一个接口,它的实现类常见的有HashSet,TreeSet。
这里用HashSet来示范一下。
== 比较的是内存地址
  1. import java.util.HashSet;
  2. import java.util.Set;

  3. public class SetTest {
  4.         public static void main(String[] args) {
  5.                 Set s = new HashSet();
  6.                
  7.                 String s1 = "Hello";
  8.                 String s2 = new String("Hello");
  9.                 s.add(s1);
  10.                 s.add(s2);
  11.                 System.out.println(s);
  12.         }
  13. }
复制代码
以上的输出结果是:
[Hello]

而s1 和 s2的地址肯定是不一样的。
所以它们比较的是值。
查阅api可以知道,HashSet从类 java.util.AbstractSet 继承了equals方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2