java中TreeSet集合如何实现元素的判重
2023-09-14 08:57:54 时间
public class TreeSet E extends AbstractSet E
implements NavigableSet E , Cloneable, java.io.Serializable
private transient NavigableMap E,Object
//NavigableMap继承SortedMap, 二者都是接口,在TreeMap中有实现
private static final Object PRESENT = new Object();
TreeSet(NavigableMap E,Object m) {
this.m = m;
////第一种构造方法
public TreeSet(Comparator ? super E comparator) {
this(new TreeMap (comparator));
////第二种构造方法
public TreeSet() {
this(new TreeMap E,Object
..........
public boolean add(E e) {
return m.put(e, PRESENT)==null;
再看一下 TreeMap 中是如何实现的 put()函数的
public V put(K key, V value) {
Entry K,V t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry (key, value, null);
size = 1;
modCount++;
return null;
int cmp;
Entry K,V parent;
// split comparator and comparable paths
Comparator ? super K cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp 0)
t = t.left;
else if (cmp 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
else {
if (key == null)
throw new NullPointerException();
Comparable ? super K k = (Comparable ? super K ) key;
do {
parent = t;
cmp = k.compareTo(t.key);
if (cmp 0)
t = t.left;
else if (cmp 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
Entry K,V e = new Entry (key, value, parent);
if (cmp 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
size++;
modCount++;
return null;
也就是说TreeSet内部实现使用TreeMap这个类来完成的
TreeSet的内部实现元素之间是否相等?
如果指定了Comparator(也就是利用第一种构造方法), 那么就用其中的compare方法进行比较
否则就用Comparable中的compareTo()方法进行元素的比较
import java.util.*;
public class CompTest{
public static void main(String args[]){
Set myClass st = new TreeSet myClass
st.add(new myClass(1, "fd"));
st.add(new myClass(2, "fff"));
st.add(new myClass(2, "tttt"));
st.add(new myClass(1, "fd"));
for(Iterator myClass it = st.iterator(); it.hasNext();)
System.out.println(it.next());
class myClass implements Comparable myClass {
public int x;
public String name;
public myClass(int x, String name){
this.x=x;
this.name=name;
public int compareTo(myClass tmp){
if(this.x==tmp.x)
return this.name.compareTo(tmp.name);
else return this.x-tmp.x;
public String toString(){
return x+" "+name;
}
【Java 数据结构】TreeMap和TreeSet的介绍 TreeMap 和 TreeSet 是Java中利用搜索树实现的 Map 和 Set,它们的底层是红黑树,而红黑树是一棵近似平衡的二叉搜索树,关于红黑树相关知识后续讲解。本期主要是学会 TreeMap 和 TreeSet 的使用,以及知道他们的特点即可。
Java集合学习3:Set集合-TreeSet 基于hashcode计算元素存放位置。 当存入元素的哈希码相同时,会调用equals进行确认,如果为true,则拒绝后者存入。
java集合类史上最细讲解 - TreeSet,TreeMap篇 1.TreeSet概述 TreeSet实现了Set接口,与HashSet不同的时,他是有序集合,底层是一个TreeMap 默认按照升序排列,代码示例:
Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同 《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。 这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star、fork哈 文章首发于我的个人博客: www.how2playlife.com 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳。
Java容器深入浅出之HashSet、TreeSet和EnumSet Java集合中的Set接口,定义的是一类无顺序的、不可重复的对象集合。如果尝试添加相同的元素,add()方法会返回false,同时添加失败。Set接口包括3个主要的实现类:HashSet、TreeSet和EnumSet。
【Java 数据结构】TreeMap和TreeSet的介绍 TreeMap 和 TreeSet 是Java中利用搜索树实现的 Map 和 Set,它们的底层是红黑树,而红黑树是一棵近似平衡的二叉搜索树,关于红黑树相关知识后续讲解。本期主要是学会 TreeMap 和 TreeSet 的使用,以及知道他们的特点即可。
Java集合学习3:Set集合-TreeSet 基于hashcode计算元素存放位置。 当存入元素的哈希码相同时,会调用equals进行确认,如果为true,则拒绝后者存入。
java集合类史上最细讲解 - TreeSet,TreeMap篇 1.TreeSet概述 TreeSet实现了Set接口,与HashSet不同的时,他是有序集合,底层是一个TreeMap 默认按照升序排列,代码示例:
Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同 《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。 这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star、fork哈 文章首发于我的个人博客: www.how2playlife.com 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳。
Java容器深入浅出之HashSet、TreeSet和EnumSet Java集合中的Set接口,定义的是一类无顺序的、不可重复的对象集合。如果尝试添加相同的元素,add()方法会返回false,同时添加失败。Set接口包括3个主要的实现类:HashSet、TreeSet和EnumSet。
相关文章
- java:在Conllection接口中实际上也规定了两个可以将集合变成对象数组的操作
- Java实现 LeetCode 705 设计哈希集合(使用数组保存有没有被用过)
- Java实现 LeetCode 705 设计哈希集合(使用数组保存有没有被用过)
- Java实现 LeetCode 645 错误的集合(暴力)
- Java实现 蓝桥杯VIP 算法训练 集合运算
- Java实现 蓝桥杯VIP 算法训练 集合运算
- 【JAVA】java中split以"." 、""、“|”分隔字符串
- 【JAVA】Java循环语句中的continue跳转进入下一次循环是否判断循环条件
- Java核心类库篇4——集合
- Java的agent机制简述
- Atitit java播放器调音速率快慢的实现 目录 1.1. 原理 本质上是改变采样率即可1 2. 使用Java增加/降低AudioInputStream的音频播放速度(Increase/dec
- Java 集合:Collection,List,ArrayList,Vector,LinkedList(实现方式,对比)
- 【Java】java 环境配置(详细教程)
- 【java】EJB(Enterprise Java Bean)概述
- Java集合:HashMap底层实现和原理(源码解析)
- java基础之集合List-ArrayList、LinkedList、Vector的差别
- Java集合框架实现自定义排序
- Java Instrumentation 内存马——主要是利用Instrumentation Java API来做内存注入,会用到反射机制,文中提到检测思路:注入jar包-> dump已加载class字节码->反编译成java代码-> 源码webshell检测
- JAVA中所有与集合有关的实现类都是这六个接口的实现类
- 【java】Java 中泛型的实现原理
- 【java】Java并发编程--Java实现多线程的4种方式
- java学习笔记——Collection集合、迭代器、泛型、扑克牌案例
- java实体比较集合排序