Java HashSet

Java HashSet

继承于Set接口,不允许有重复的元素

1. 继承结构
java.lang.Object
|_ java.util.AbstractCollection<E>
|_ java.util.AbstractSet<E>
|_ java.util.HashSet<E>

2. 主要方法
add(Object)
addAll(Collection)
remove(object)
removeAll(Collection)
size()
iterator()
toArray()
clear()
isEmpty()
contain(object)
containAll(Collection)

3. 不允许出现相同的项
Set集合中不允许出现相同的项,Set集合在用Add()方法添加一个新项时,首先会调用equals(Object o)来比较新项和已有的某项是否相等,而不是用==来判断相等性,所以对于字符串等已重写equals方法的类,是按值来比较相等性的
Java代码
  1. Set<String> setA=(Set<String>)HashSet();
  2. setA.add(String());
  3. setA.add(String());
  4. setA.add(String());
  5. setA.add(String());
  6. setA.add(String());
  7. System.out.println(+setA.size());
  8. Iterator<String> ite=setA.iterator();
  9. (ite.hasNext()){
  10. stem.out.println(ite.next());
  11. }
Set<String> setA=(Set<String>)new HashSet(); 
  
    setA.add(new String("ABC"));
    setA.add(new String("CC"));
    setA.add(new String("ABC"));
    setA.add(new String("BB"));
    setA.add(new String("ABC"));

    System.out.println("size="+setA.size()); //3, 相同的项不存储
     
    Iterator<String> ite=setA.iterator();
     
    while(ite.hasNext()){
 System.out.println(ite.next());//CC BB ABC

    }

4. 哈希算法
在set类型的集合中,如何判断元素是否重复呢,这就需要使用Object.equals方法,但如果元素很多了,添加一个新元素时,比较的次数 就很多,例如已经有100个元素了,添加第101个元素时,就要和前面的元素比较100次,效率很低。

JAVA中采用哈希表的原理,哈希是个人名,它提出了哈希算法的概念,哈希算法也称为散列算法,是将数据依据酸法直接指定到一个地址上,

hascode实际上是返回的对象存储的物理地址

HashSet类按照哈希算法来存取对象,当向集合中加入一个新对象时,会调用对象的HashCode()方法得到对象的哈希码,然后根据这个码计算出对象在集合中存储的位置。

Object类中定义了hashCode()和equals(Object o)方法,如果object1.equals(object2),那么说明这两个引用变量指向同一个对象,那么object1 and object2的hashCode也一定相等

为了保证HashSet能正常工作,要求当两个对象用equals比较相等时,hashCode也要相等,否则就会有可能加入两个相同的项。
Java代码
  1. Person {
  2. String name;
  3. Integer age;
  4. Integer getAge() {
  5. age;
  6. }
  7. setAge(Integer age) {
  8. .age = age;
  9. }
  10. String getName() {
  11. name;
  12. }
  13. setName(String name) {
  14. .name = name;
  15. }
  16. equals(Object o){
  17. (==o);
  18. (!(oPerson))
  19. ;
  20. Person p=(Person)o;
  21. (.name.equals(p.getName()))
  22. ;
  23. ;
  24. }
  25. }
  26. Set<Person> setA=(Set<Person>)HashSet();
  27. Person A=Person();
  28. A.setAge();
  29. A.setName();
  30. Person B=Person();
  31. B.setAge();
  32. B.setName();
  33. setA.add(A);
  34. setA.add(B);
  35. System.out.println(+setA.size());
public class Person {
 private String name;
 private Integer age;
 public Integer getAge() {
    return age;
 }
 public void setAge(Integer age) {
    this.age = age;
 }
 public String getName() {
    return name;
 }
 public void setName(String name) {
    this.name = name;
 }
         public boolean equals(Object o){
   if(this==o)return true;
  
   if(!(o instanceof Person))
  return false;
  
   final Person p=(Person)o;
   if(this.name.equals(p.getName()))
  return true;
   else
  return false;
  
 }
  }

  Set<Person> setA=(Set<Person>)new HashSet(); 
  Person A=new Person();
  A.setAge(24);
  A.setName("Jack");
  
  
  Person B=new Person();
  B.setAge(24);
  B.setName("Jack");
  
  setA.add(A);
  setA.add(B);
  System.out.println("size="+setA.size());  //2

虽然A与B用equals比较相等,但因为HashCode不同,HashSet为A和B计算出了不同的存储位置,于是把他们放到了集合的不同位置

可以重写hascode和equas方法

例如:
Java代码
  1. hasCode(){
  2. result;
  3. result=(.name==?:name.hashCode());
  4. result=*result+(.age==?:age.hashCode());
  5. result;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值