`
wx1568444409
  • 浏览: 14615 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java HashSet(转javaeye)

 
阅读更多

继承于Set接口,

1、HashSet不能重复存储equals相同的数据 。原因就是equals相同,数据的散列码也就相同(hashCode必须和equals兼容)。大量相同的数据将存放在同一个散列单元所指向的链表中,造成严重的散列冲突,对查找效率是灾难性的。

      2、HashSet的存储是无序的 ,没有前后关系,他并不是线性结构的集合。

      3、hashCode必须和equals必须兼容, 这也是为了第1点。

 

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方法的类,是按值来比较相等性的
  

  1. Set<String> setA=(Set<String>)new HashSet();    
  2.   
  3.  setA.add(new String("ABC"));   
  4.  setA.add(new String("CC"));   
  5.  setA.add(new String("ABC"));   
  6.  setA.add(new String("BB"));   
  7.  setA.add(new String("ABC"));   
  8.   
  9.  System.out.println("size="+setA.size()); //3, 相同的项不存储   
  10.      
  11.  Iterator<String> ite=setA.iterator();   
  12.      
  13.  while(ite.hasNext()){   
  14. stem.out.println(ite.next());//CC BB ABC   
  15.   
  16.  }   
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也要相等,否则就会有可能加入两个相同的项。
  

  1.   public class Person {   
  2. private String name;   
  3. private Integer age;   
  4. public Integer getAge() {   
  5.    return age;   
  6. }   
  7. public void setAge(Integer age) {   
  8.    this.age = age;   
  9. }   
  10. public String getName() {   
  11.    return name;   
  12. }   
  13. public void setName(String name) {   
  14.    this.name = name;   
  15. }   
  16.         public boolean equals(Object o){   
  17.     if(this==o)return true;   
  18.        
  19.     if(!(o instanceof Person))   
  20.     return false;   
  21.        
  22.     final Person p=(Person)o;   
  23.     if(this.name.equals(p.getName()))   
  24.     return true;   
  25.     else  
  26.     return false;   
  27.        
  28. }   
  29.  }   
  30.   
  31.  Set<Person> setA=(Set<Person>)new HashSet();      
  32.  Person A=new Person();   
  33.  A.setAge(24);   
  34.  A.setName("Jack");   
  35.        
  36.        
  37.  Person B=new Person();   
  38.  B.setAge(24);   
  39.  B.setName("Jack");   
  40.        
  41.  setA.add(A);   
  42.  setA.add(B);   
  43.  System.out.println("size="+setA.size());  //2     
  44.   
  45.    
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方法

  例如:
 

  1. public int hasCode(){   
  2. int result;   
  3. result=(this.name==null?0:name.hashCode());   
  4. result=37*result+(this.age==null?0:age.hashCode());   
  5. return result;   
  6.   
  7.   
  8.   
  9.       

转载于:https://my.oschina.net/u/175434/blog/699983

分享到:
评论

相关推荐

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    在Java编程语言中,ArrayList和HashSet是两种常用的集合类,它们各自有其特性和应用场景。在实际开发中,理解它们的差异以及如何有效地利用它们是非常重要的。本篇将深入探讨ArrayList与HashSet的区别,并分析...

    HashSet工作原理_动力节点Java学院整理

    对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:

    java 利用HashSet删除学生

    在Java编程中,HashSet是一个非常重要的集合类,它继承自AbstractSet并实现了Set接口。HashSet不包含重复元素,也不保持元素的顺序。本篇将详细讲解如何利用Java的HashSet类来删除学生对象,以及HashSet的一些核心...

    Java HashSet集合存储遍历学生对象代码实例

    Java HashSet集合存储遍历学生对象代码实例 Java HashSet集合是一种基于哈希表的集合实现,用于存储元素的集合。在本文中,我们将通过一个实例,介绍如何使用Java HashSet集合来存储和遍历学生对象,并解决添加重复...

    java基础练习题 (目前到集合内含三个小综合案例)

    Java集合框架包括接口(如List、Set、Queue)和实现类(如ArrayList、LinkedList、HashSet、HashMap等)。理解各种集合的区别,以及它们的实现方式和应用场景,是提升编程效率的关键。例如,List接口中的ArrayList和...

    java代码转c#

    5. **集合框架**:Java的集合框架包括List、Set和Map,C#也有相似的`List&lt;T&gt;`、`HashSet&lt;T&gt;`和`Dictionary,TValue&gt;`。不过C#的泛型支持更强大,可以指定类型约束。 6. **注解与特性**:Java有注解(Annotation),...

    实例讲解Java HashSet

    Java HashSet 详解 Java HashSet 是 Java 集合框架中的一种重要数据结构,它提供了一个不允许有重复元素的集合。HashSet 是基于 HashMap 实现的,它允许有 null 值,但不记录插入的顺序,也不是线程安全的。 ...

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...

    随机数用hashSet排序

    随机数,HsahSet,排序,输出.随机数,HsahSet,排序,输出.

    Java中HashSet的解读_.docx

    在Java编程语言中,HashSet是一种基于哈希表(HashMap)实现的无序、不重复的集合类。它的核心特点是高效查找、添加和删除元素。在深入解析HashSet之前,我们需要了解其内部使用的HashMap的工作原理。 HashMap是...

    HashSet详解和使用示例_动力节点Java学院整理

    HashSet是Java编程语言中的一种集合类,它是一个不包含重复元素的集合,其内部实现基于HashMap。HashSet不保证元素的顺序,允许存储null元素,并且是非同步的,这意味着在多线程环境下,如果需要保证线程安全,需要...

    HashSet类的用法.pdf

    `HashSet`是Java集合框架的一部分,它实现了`Set`接口。`HashSet`不允许重复的元素,并且不保证元素的顺序。此外,`HashSet`是非同步的,这意味着多线程环境下的安全问题需要通过外部同步机制解决。 #### 二、特点 ...

    hashset类的使用

    在Java语言中,HashSet类是集合框架的重要组成部分,属于Set接口的一个实现。它基于哈希表的原理来存储不重复的元素,其核心在于利用哈希算法快速定位元素存储位置,从而提高数据存取的效率。本篇将详细介绍Java语言...

    HashSet的实现原理

    在Java编程中,HashSet是一种不允许存储重复元素的集合,它实现了Set接口。HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,...

    通过实例学习Java集合框架HashSet

    通过实例学习Java集合框架HashSet HashSet是Java集合框架中的一种重要数据结构,用于存储不重复的元素。通过实例学习Java集合框架HashSet,可以帮助开发者更好地理解和使用HashSet,提高编程效率和代码质量。本文将...

    中文名称转英文拼音

    以下是一些关于“Java中文名称转英文拼音”的核心知识点: 1. **Unicode编码**:首先,理解字符编码至关重要。Java程序默认使用Unicode编码,它是一种包含大部分世界语言的字符集,包括中文。Unicode使得处理不同...

    json工具类,java日期转换,字符串转换等各种工具类

    对于去重,可以先将数组转化为`HashSet`,因为集合类不允许重复元素,然后再转回数组。或者使用Java 8的流(Stream)API,如`distinct()`方法。 5. **集合排序**: `Collections.sort()`方法可用于排序List类型的...

    Java中的HashSet详解和使用示例_动力节点Java学院整理

    Java中的HashSet详解和使用示例 HashSet是Java中一个非常重要的集合类,它继承于AbstractSet,并实现了Set接口。HashSet的主要特点是没有重复元素的集合,它是通过HashMap实现的,不保证元素的顺序,而且HashSet...

    Class005_HashSet.java

    Class005_HashSet.java

Global site tag (gtag.js) - Google Analytics