`
隐形的翅膀
  • 浏览: 498376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java HashSet

阅读更多
Set(集) 集合中的对象不按特定方式排序,并且没有重复对象
List(列表):集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象
Map(映射):集合中的没一个元素包含键对象和值对象,不允许有重复的键对象

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方法的类,是按值来比较相等性的
  
   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也要相等,否则就会有可能加入两个相同的项。
  
   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方法

  例如:
 
  public int hasCode(){
		int result;
		result=(this.name==null?0:name.hashCode());
		result=37*result+(this.age==null?0:age.hashCode());
		return result;
	}
	

	    
 


5. TreeSet类

当向TreeSet集合中加入一个对象时,会把他插入到有序的对象序列中,

自然排序和客户化排序

JDK中的一些类, Interger,Double,String等实现了 Comparable 接口, 它有一个CompareTo(object o)方法, TreeSet调用CompareTo方法比较对象, 加入持久化对象时应实现Comparable接口,并重写compareTo,equals,hashcode三个方法

客户化排序需要实现java.util.Comparator接口,并重写compare(Object o1, object o2);

public class CustomerComparator implements Comparator{
    public int compare(Object o1, Object o2){
        Customer c1 = (Customer) o1;
        customer c2 = (Customer) o2;
   
         if(c1.getName().compareTo(c2.getName())>0) 
               return -1;
         else
               return 1;
    
          return 0;
    }

}

Set set = new TreeSet(new CustomerComparator());
set.add(new Customer("Tom",15));
set.add(new Customer("Jack",17));
......


6. List只能对集合中的对象按索引位置排序,如果希望LIST中的对象按其他特定方式排序,可以借助Comparator接口和Collections类


Collections.sort(List list)
Collections.sort(List list, Comparator comparator)

分享到:
评论

相关推荐

    java HashSet 集合排序

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

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

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

    实例讲解Java HashSet

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

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

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

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

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

    HashSet类的用法.pdf

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

    随机数用hashSet排序

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

    集合类HashSet

    当我们在HashSet中添加一个元素时,Java会先计算该元素的哈希码,然后根据哈希码决定该元素在底层HashMap中的位置。如果两个元素的哈希码相同,它们会被放在同一个桶(bucket)中。为了避免冲突,Java还使用了equals...

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

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

    关于集合的小例子java

    在Java编程语言中,集合框架是处理对象数组的重要工具,提供了高效的数据组织和操作方式。本教程将聚焦于三个特定的集合类:`Vector`、`Stack`和`HashSet`,通过小型示例来深入理解它们的特点和用法。 首先,`...

    java基本集合类,java基本集合类

    本篇文章将详细讲解Java中的基本集合类ArrayList、LinkedList和Vector,以及HashSet和TreeSet。 1. ArrayList ArrayList是基于动态数组实现的集合类,它允许存储重复元素。默认初始容量为10,当添加元素超过容量时...

    java实现摇奖机简单代码

    2. **避免重复**:为了确保生成的数字不重复,我们可以使用`java.util.HashSet`。HashSet是一个不允许重复元素的集合,每次添加新元素时,如果该元素已存在,添加操作将失败。这样,我们可以通过不断向HashSet中添加...

    java集合框架的使用。集合的运算

    1. 散列集合:在Java中,HashSet是散列集合的一个典型代表。它通过哈希算法来存储元素,确保元素的唯一性。HashSet不保证元素的顺序,但插入和查找速度非常快。例如,你可以创建一个HashSet,然后添加元素,检查元素...

    java 利用HashSet删除学生

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

    Java面试题之HashSet的实现原理

    Java HashSet的实现原理 HashSet是Java集合框架中的一种set实现,它的实现原理主要基于HashMap。下面我们将详细介绍HashSet的实现原理。 首先,HashSet是Set的一个实现,所以它保证了其中没有重复的元素。在...

    java常用API举例

    Java API,全称为Java应用程序接口,是Java编程语言的核心组成部分,包含了各种类库、接口和异常,为开发者提供了丰富的功能,极大地提高了开发效率。本文将深入探讨Java API中的一些常见且重要的类和方法,结合实际...

    详解Java中HashSet和TreeSet的区别

    Java HashSet 和 TreeSet 的区别详解 HashSet 和 TreeSet 是 Java 中两个常用的集合类,它们都实现了 Set 接口,但它们之间有很大的区别。本文将详细介绍 HashSet 和 TreeSet 的区别,帮助大家更好地理解和使用这些...

    Java 对象排序详解.rar_java 对象排序_对象_排序

    总的来说,Java提供了多种方式对对象进行排序,包括ArrayList的`Collections.sort()`,HashSet的转换和排序,以及TreeSet的自然排序和Comparator排序。理解这些机制可以帮助我们更好地控制数据结构的排序行为,从而...

    java 插入新元素

    在Java编程语言中,插入新元素是常见的操作,无论是在数组、集合还是其他数据结构中。下面我们将深入探讨Java中如何向不同的数据结构插入新元素。 1. 数组: Java中的数组是一种固定大小的数据结构,一旦声明,...

Global site tag (gtag.js) - Google Analytics