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;
}
}
分享到:
相关推荐
在添加元素时,如果两个对象的 `hashCode()` 返回相同的值,那么它们会被放在同一个桶(bucket)中,此时 `equals()` 方法会用来区分这两个元素是否真的相同,以避免添加重复元素。由于 HashSet 的迭代顺序不是固定...
HashSet是基于HashMap实现的无序不重复元素集合。当向HashSet中添加元素时,它实际上是将元素作为键存入HashMap,值则忽略。因此,HashSet判断元素是否重复的方式与HashMap类似:首先计算元素的哈希值,然后通过...
简单地说,HashSet 集合判断两个元素相等的标准是两个对象通过 equals 方法比较相等,并且两个对象的 hashCode() 方法返回值相等。 需要注意的是,如果要把一个对象放入 HashSet 中,重写该对象对应类的 equals ...
综上所述,选择`TreeMap`、`TreeSet`、`HashSet`还是`HashMap`,主要取决于具体的应用需求,比如是否需要保持元素的排序,是否允许重复元素,以及对插入、删除和查找操作速度的要求。正确理解并使用这些集合类,可以...
`HashSet`是基于`HashMap`实现的,它不保证元素的顺序,允许包含null值但不允许有重复元素。`HashSet`的插入、删除和查找操作的时间复杂度通常为O(1),这是因为它们依赖于哈希函数的快速定位能力。当我们向`HashSet`...
例如,List接口(如ArrayList和LinkedList)适用于需要保持元素顺序且可能有重复元素的情况;Set接口(如HashSet、TreeSet)则确保元素唯一性,不保证顺序,适用于去重或存储不需排序的独特元素;而Map接口(如...
然而,Set接口的独特之处在于它确保了集合中的元素都是唯一的。Set接口不允许插入重复的元素,且最多只能有一个null值。 在Set接口的实现中,HashSet是最常见的类之一。HashSet类实现了Set接口,其内部基于HashMap...
TreeSet是SortedSet接口的唯一实现类,不同于HashSet,TreeSet是有序的,它内部基于红黑树(一种自平衡的二叉搜索树)。TreeSet的元素根据它们的自然排序或比较器排序,因此它不允许存储null元素。TreeSet提供了额外...
与HashSet不同,TreeSet内部基于TreeMap实现,它维护了元素的排序。元素的排序可以是自然排序,即实现`Comparable`接口并重写`compareTo()`方法,也可以是客户排序,即创建一个实现了`Comparator`接口的类并在构造...
Set接口不允许存储重复元素,它的实现类有HashSet和TreeSet。HashSet是基于哈希表实现,无序且不保证元素的插入顺序;TreeSet则通过红黑树实现,可以对元素进行排序。 3. **操作方法**:Collection接口提供了多种...
**HashSet与TreeSet的区别** - 数据结构:HashSet使用哈希表,元素无序且不可重复;TreeSet使用红黑树,元素自动排序且不可重复。 - 操作性能:HashSet插入和查找速度快,但不保证元素顺序;TreeSet插入和查找速度略...
首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`方法将返回`false`。Set集合不保持元素的插入顺序,这意味着当你遍历集合时,元素的顺序可能与...
在Java中,Set接口是集合框架的一部分,它代表了不包含重复元素的无序集合。本篇将深入探讨Java中Set接口及其相关的实现类,以及如何在实际编程中运用。 Set接口继承自Collection接口,其主要特性是元素的唯一性,...
在实际开发中,选择HashSet还是TreeSet取决于需求:HashSet适合快速查找且对元素顺序无要求的情况;而TreeSet适用于需要排序或者导航查找的场景。正确实现元素类的equals()和hashCode()方法对于保证HashSet的唯一性...
- 当需要存储不重复元素并按特定顺序排列时,可以选择TreeSet。 - 对于键值对的存储,HashMap适用于无序快速查找,而TreeMap适用于有序查找。 理解并熟练运用Java集合体系中的List、Set、Map接口及其实现类,对于...
知识点:Map 是一种键值对的集合,每个元素都是一个键值对,键是唯一的,值可以重复。 4. List 集合的主要实现类有 ArrayList、LinkedList,Set 集合的主要实现类有 HashSet、TreeSet,Map 集合的主要实现类有 ...
集合总结 ...* 如果需要存储无顺序的元素,选择 Set 集合,首先选择 HashSet,如果需要对元素进行排序,可以选择 TreeSet。 集合是 Java 中一个非常重要的概念,选择合适的集合可以提高程序的效率和性能。
List特点在于其元素有序,即插入顺序与遍历顺序一致,并且可以包含重复元素。实现List接口的类比如ArrayList和LinkedList,支持通过下标索引快速访问元素,也可以通过迭代器进行遍历。而Set的特点在于元素无序,不...
本篇文章将详细介绍`Set`接口的实现机制及其内部工作原理,包括如何判断元素是否重复、不同类型的`Set`实现类的特点与应用场景等。 #### 二、Set接口概述 在Java中,`Set`接口定义如下: ```java public ...
在Java中,我们可以利用HashSet或者TreeSet来存储不重复的元素。这两个集合都遵循“唯一性”原则,即不允许有重复的元素。HashSet在性能上通常优于TreeSet,因为它不需要维护元素的排序顺序,但在某些情况下,如果...