`

HashSet与TreeSet对重复元素的判断不同之处

    博客分类:
  • J2SE
 
阅读更多

 

HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。

HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。

 

HashMap 的 put 与 HashSet 的 add

 

于 HashSet 的 add() 方法添加集合元素时实际上转变为调用 HashMap 的 put() 方法来添加 key-value 对。HashMap 的 put() 方法首先调用.hashCode() 判断返回值相等,如果返回值相等则再通过 equals 比较也返回 true,最终认为key对象是相等的已经在HashMap中存在了。

 

 

TreeMap 的 put 与 TreeSet 的 add

TreeMap中调用put方法添加键值时,调用对象的它的 compareTo(或 compare)方法对所有键进行比较,此方法饭回0,则认为两个键就是相等的。

 

TreeSet添加元素的时候,调用compareTo或compare方法来定位元素的位置,也就是返回compareTo或compare返回0则认为是同一个位置的元素,即相同元素

 

package com.test.treeSet;

import java.util.*;

public class TestTreeSet {
	public static void p(Object obj){
		System.out.println(obj);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MyComparator m = new MyComparator();
		HashSet<Student> set1 = new HashSet<Student>();
		TreeSet<Student> set2 = new TreeSet<Student>(m);
		
		Student s1 = new Student("001","郭玲玲",100);
		Student s2 = new Student("002","刘德华",100);
		Student s3 = new Student("003","林志玲",80);
		Student s4 = new Student("003","郭玲玲",90);
	
		set1.add(s1);
		set1.add(s2);
		set1.add(s3);
		set1.add(s4);
	/*		
		p(set1);
		
		set2.add(s1);
		set2.add(s2);
		set2.add(s3);
		set2.add(s4);
		
		p(set2);*/
/*		
		TreeMap<Student, String> map = new TreeMap<Student, String>(m);
		map.put(s1, s1.num);
		map.put(s2, s2.num);
		map.put(s3, s3.num);
		map.put(s4, s4.num);
		p(map);
*/
	}
	

}
class Student{
	public String name;
	public String num;
	public int score;
	public Student(String num, String name, int score) {
		super();
		this.num = num;
		this.name = name;
		this.score = score;
	}
	@Override
	public String toString() {
		return this.num+" "+this.name+" "+this.score;
	}
	
	@Override
	public boolean equals(Object obj) {
		System.out.println("equals");
		Student s = (Student)obj;
		return this.num.equals(s.num);
	}
	@Override
	public int hashCode() {
		System.out.println("hashCode");
		return this.num.hashCode();
	}
	
}
class MyComparator implements Comparator<Student>{

	public int compare(Student s1, Student s2) {
		System.out.println("调用了compare()");
		if(s1.num.equals(s2.num) ){ //成绩等学号不等
			return 0; //按学号比较
		}else if( s1.score==s2.score &&!s1.num.equals(s2.num) ){
			return s1.num.compareTo(s2.num);
		}
		
		return s1.score-s2.score;

	}
	
}
 

 

分享到:
评论

相关推荐

    HashSet和TreeSet.doc

    在添加元素时,如果两个对象的 `hashCode()` 返回相同的值,那么它们会被放在同一个桶(bucket)中,此时 `equals()` 方法会用来区分这两个元素是否真的相同,以避免添加重复元素。由于 HashSet 的迭代顺序不是固定...

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    HashSet是基于HashMap实现的无序不重复元素集合。当向HashSet中添加元素时,它实际上是将元素作为键存入HashMap,值则忽略。因此,HashSet判断元素是否重复的方式与HashMap类似:首先计算元素的哈希值,然后通过...

    详解Java中HashSet和TreeSet的区别

    简单地说,HashSet 集合判断两个元素相等的标准是两个对象通过 equals 方法比较相等,并且两个对象的 hashCode() 方法返回值相等。 需要注意的是,如果要把一个对象放入 HashSet 中,重写该对象对应类的 equals ...

    treemap treeset hashset hashmap 简要介绍

    综上所述,选择`TreeMap`、`TreeSet`、`HashSet`还是`HashMap`,主要取决于具体的应用需求,比如是否需要保持元素的排序,是否允许重复元素,以及对插入、删除和查找操作速度的要求。正确理解并使用这些集合类,可以...

    day18-集合-中(HashSet&TreeSet&比较器).zip

    `HashSet`是基于`HashMap`实现的,它不保证元素的顺序,允许包含null值但不允许有重复元素。`HashSet`的插入、删除和查找操作的时间复杂度通常为O(1),这是因为它们依赖于哈希函数的快速定位能力。当我们向`HashSet`...

    集合的概念及应用和HashSet保证数据不重复的原理

    例如,List接口(如ArrayList和LinkedList)适用于需要保持元素顺序且可能有重复元素的情况;Set接口(如HashSet、TreeSet)则确保元素唯一性,不保证顺序,适用于去重或存储不需排序的独特元素;而Map接口(如...

    ThinkinginJava之Set接口、HashSet源码学习.pdf

    然而,Set接口的独特之处在于它确保了集合中的元素都是唯一的。Set接口不允许插入重复的元素,且最多只能有一个null值。 在Set接口的实现中,HashSet是最常见的类之一。HashSet类实现了Set接口,其内部基于HashMap...

    java集合类源码分析之Set详解.docx

    TreeSet是SortedSet接口的唯一实现类,不同于HashSet,TreeSet是有序的,它内部基于红黑树(一种自平衡的二叉搜索树)。TreeSet的元素根据它们的自然排序或比较器排序,因此它不允许存储null元素。TreeSet提供了额外...

    java中set接口使用方法详解

    与HashSet不同,TreeSet内部基于TreeMap实现,它维护了元素的排序。元素的排序可以是自然排序,即实现`Comparable`接口并重写`compareTo()`方法,也可以是客户排序,即创建一个实现了`Comparator`接口的类并在构造...

    集合笔记整理.doc

    Set接口不允许存储重复元素,它的实现类有HashSet和TreeSet。HashSet是基于哈希表实现,无序且不保证元素的插入顺序;TreeSet则通过红黑树实现,可以对元素进行排序。 3. **操作方法**:Collection接口提供了多种...

    Java集合Collection、List、Set、Map使用详解

    **HashSet与TreeSet的区别** - 数据结构:HashSet使用哈希表,元素无序且不可重复;TreeSet使用红黑树,元素自动排序且不可重复。 - 操作性能:HashSet插入和查找速度快,但不保证元素顺序;TreeSet插入和查找速度略...

    Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`方法将返回`false`。Set集合不保持元素的插入顺序,这意味着当你遍历集合时,元素的顺序可能与...

    java 运用集的相关类(Set)

    在Java中,Set接口是集合框架的一部分,它代表了不包含重复元素的无序集合。本篇将深入探讨Java中Set接口及其相关的实现类,以及如何在实际编程中运用。 Set接口继承自Collection接口,其主要特性是元素的唯一性,...

    Set实现类1

    在实际开发中,选择HashSet还是TreeSet取决于需求:HashSet适合快速查找且对元素顺序无要求的情况;而TreeSet适用于需要排序或者导航查找的场景。正确实现元素类的equals()和hashCode()方法对于保证HashSet的唯一性...

    Java-Java集合体系-List-Set

    - 当需要存储不重复元素并按特定顺序排列时,可以选择TreeSet。 - 对于键值对的存储,HashMap适用于无序快速查找,而TreeMap适用于有序查找。 理解并熟练运用Java集合体系中的List、Set、Map接口及其实现类,对于...

    Java习题六.docx

    知识点:Map 是一种键值对的集合,每个元素都是一个键值对,键是唯一的,值可以重复。 4. List 集合的主要实现类有 ArrayList、LinkedList,Set 集合的主要实现类有 HashSet、TreeSet,Map 集合的主要实现类有 ...

    collecter集合总结

    集合总结 ...* 如果需要存储无顺序的元素,选择 Set 集合,首先选择 HashSet,如果需要对元素进行排序,可以选择 TreeSet。 集合是 Java 中一个非常重要的概念,选择合适的集合可以提高程序的效率和性能。

    java后端面试题答案.pdf

    List特点在于其元素有序,即插入顺序与遍历顺序一致,并且可以包含重复元素。实现List接口的类比如ArrayList和LinkedList,支持通过下标索引快速访问元素,也可以通过迭代器进行遍历。而Set的特点在于元素无序,不...

    对Java中Set的深入研究

    本篇文章将详细介绍`Set`接口的实现机制及其内部工作原理,包括如何判断元素是否重复、不同类型的`Set`实现类的特点与应用场景等。 #### 二、Set接口概述 在Java中,`Set`接口定义如下: ```java public ...

    模拟双色球筛选过程生成随机数

    在Java中,我们可以利用HashSet或者TreeSet来存储不重复的元素。这两个集合都遵循“唯一性”原则,即不允许有重复的元素。HashSet在性能上通常优于TreeSet,因为它不需要维护元素的排序顺序,但在某些情况下,如果...

Global site tag (gtag.js) - Google Analytics