java.util.TreeSet源码分析
TreeSet是基于TreeMap实现的,元素的顺序取决于元素自身的自然顺序或者在构造时提供的比较器。
对于add,remove,contains操作,保证log(n)的时间复杂度。
因为Set接口的定义根据equals方法,但是TreeSet接口约定元素的顺序基于compareTo或者compare方法,所以它们要保持一致性才能保证程序不会出错。
TreeSet不是同步化的,运行在多线程环境下需要外部同步化或调用SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));方法。
迭代器是快速失败的。
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
实例变量
//TreeSet的实现基于TreeMap(TreeMap实现NavigableMap),内部维护一个NavigableMap
private transient NavigableMap<E,Object> m; //作用是把TreeSet的元素存入TreeMap中时,元素作为键,PRESENT作为值
private static final Object PRESENT = new Object();
构造器
//这个构造器不是导出API,在下面构造器有使用这个构造器
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
} //调用第一个的构造器,创建一个空的TreeSet,不提供比较器,使用元素自然顺序
public TreeSet() {
this(new TreeMap<E,Object>());
} //调用第一个构造器,提供比较器,比较器由TreeMap维护,TreeSet本身没有比较器
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
} //通过Collection的子类构造TreeSet,不提供比较器,使用元素的自然顺序
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
} //通过SortedSet的子类构造TreeSet,SortedSet本身可能有比较器,如果有,使用该比较器,否则使用元素自然顺序
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
迭代器
//返回升序迭代器
public Iterator<E> iterator() {
return m.navigableKeySet().iterator();
} //返回降序迭代器
public Iterator<E> descendingIterator() {
return m.descendingKeySet().iterator();
}
返回一个降序的TreeSet
public NavigableSet<E> descendingSet() {
return new TreeSet<>(m.descendingMap());
}
一些基本操作
//Set含有的元素个数
public int size() {
return m.size();
} //判断是否为空,其实就是size会否为0
public boolean isEmpty() {
return m.isEmpty();
} //Set是否包含元素o
public boolean contains(Object o) {
return m.containsKey(o);
} //增加一个元素,可以看到e作为键,PRESENT作为值
public boolean add(E e) {
return m.put(e, PRESENT)==null;
} //删除一个元素,根据删除返回的结果是否和PRESENT等同来返回是否删除成功
public boolean remove(Object o) {
return m.remove(o)==PRESENT;
} //清空Set
public void clear() {
m.clear();
}
返回子集合的操作
//fromElement开始元素,toElement结束元素,fromInclusive,toInclusive表示是否包含边界,跟下面的返回子集合操作的参数意义一样
public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
E toElement, boolean toInclusive) {
return new TreeSet<>(m.subMap(fromElement, fromInclusive,
toElement, toInclusive));
} public NavigableSet<E> headSet(E toElement, boolean inclusive) {
return new TreeSet<>(m.headMap(toElement, inclusive));
} public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
return new TreeSet<>(m.tailMap(fromElement, inclusive));
} public SortedSet<E> subSet(E fromElement, E toElement) {
return subSet(fromElement, true, toElement, false);
} public SortedSet<E> headSet(E toElement) {
return headSet(toElement, false);
} public SortedSet<E> tailSet(E fromElement) {
return tailSet(fromElement, true);
}
返回比较器
public Comparator<? super E> comparator() {
return m.comparator();
}
返回某些特定元素的操作
//返回集合的第一个元素
public E first() {
return m.firstKey();
} //返回集合的最后一个元素
public E last() {
return m.lastKey();
} //返回比e小的最大元素,不包括e
public E lower(E e) {
return m.lowerKey(e);
} //返回比e小的最大元素,包括e
public E floor(E e) {
return m.floorKey(e);
} //返回比e大的最小元素,包括e
public E ceiling(E e) {
return m.ceilingKey(e);
} //返回比e大的最小元素,不包括e
public E higher(E e) {
return m.higherKey(e);
} //返回并删除第一个元素
public E pollFirst() {
Map.Entry<E,?> e = m.pollFirstEntry();
return (e == null) ? null : e.getKey();
} //返回并删除最后一个元素
public E pollLast() {
Map.Entry<E,?> e = m.pollLastEntry();
return (e == null) ? null : e.getKey();
}
支持clone
public Object clone() {
TreeSet<E> clone;
try {
clone = (TreeSet<E>) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
clone.m = new TreeMap<>(m);
return clone;
}
支持序列化和反序列化
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
// Write out any hidden stuff
s.defaultWriteObject(); // Write out Comparator
s.writeObject(m.comparator()); // Write out size
s.writeInt(m.size()); // Write out all elements in the proper order.
for (E e : m.keySet())
s.writeObject(e);
} private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in any hidden stuff
s.defaultReadObject(); // Read in Comparator
@SuppressWarnings("unchecked")
Comparator<? super E> c = (Comparator<? super E>) s.readObject(); // Create backing TreeMap
TreeMap<E,Object> tm = new TreeMap<>(c);
m = tm; // Read in size
int size = s.readInt(); tm.readTreeSet(size, s, PRESENT);
}
java.util.TreeSet源码分析的更多相关文章
- java.util.Collection源码分析和深度讲解
写在开头 java.util.Collection 作为Java开发最常用的接口之一,我们经常使用,今天我带大家一起研究一下Collection接口,希望对大家以后的编程以及系统设计能有所帮助,本文所 ...
- java.util.HashMap源码分析
在java jdk8中对HashMap的源码进行了优化,在jdk7中,HashMap处理“碰撞”的时候,都是采用链表来存储,当碰撞的结点很多时,查询时间是O(n). 在jdk8中,HashMap处理“ ...
- java.util.AbstractStringBuilder源码分析
AbstractStringBuilder是一个抽象类,是StringBuilder和StringBuffer的父类,分析它的源码对StringBuilder和StringBuffer代码的理解有很大 ...
- java.util.Hashtable源码分析
Hashtable实现一个键值映射的表.任何非null的object可以用作key和value. 为了能存取对象,放在表里的对象必须实现hashCode和equals方法. 一个Hashtable有两 ...
- java.util.Dictionary源码分析
Dictionary是一个抽象类,Hashtable是它的一个子类. 类的声明:/** The <code>Dictionary</code> class is the abs ...
- java.util.TreeMap源码分析
TreeMap的实现基于红黑树,排列的顺序根据key的大小,或者在创建时提供的比较器,取决于使用哪个构造器. 对于,containsKey,get,put,remove操作,保证时间复杂度为log(n ...
- java.util.LinkedList源码分析
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, D ...
- java.util.ArrayList源码分析
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess ...
- java.util.HashSet源码分析
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java. ...
随机推荐
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- 比较全面的MySQL优化参考
本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要 ...
- XCode4中的文本查找和文本替换功能
转自:http://blog.csdn.net/zhuzhihai1988/article/details/7843186 1.如果是在打开的文档范围内: 查找: Command+ F ...
- [原创]SQL SERVER 2008R2安装
配置系统环境说明 操作系统:Windows 7 操作系统版本:旗舰版 SP1 操作系统位数:x64 注:其它系统配置也基本相似,只是可能菜单的名字或者所处位置不一样,具体的配置如有不同,请自行搜索 安 ...
- 代码片段---判断一文件是不是字符设备如果是把它拷贝到 /dev目录下
#!/bin/sh myfile=/home/liu 这个是文件的路径 fd = `ls -l myfile` 获取文件的所有属性 fp= ${fd::} if ["$fp" = ...
- MySQL无视密码进入Server
在[mysqld]的段中加上一句:skip-grant-tables 如下 [mysqld] skip-grant-tables 即可不输入密码就可以进入mysql server,然后就可以随便修改数 ...
- C#操作XML(带命名空间)
之前文章讲述了使用c# xpath如何操作xml文件,在实际开发项目中,遇到的很多xml文件都是带有命名空间的,如果还是用之前的代码获取,那将获取到null.本文讲解操作代码有命名空间的Xml文件,以 ...
- jquery datatable[表格处理]
最近在公司实习发现一个额功能强大的表格解决方案,了解了一下,先总结如下: 1.官网:http://www.datatables.net/ 2.需要特别注意:被dataTable处理的table对象,必 ...
- Cache的原理、设计及实现
Cache的原理.设计及实现 前言 虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构.指令结构.信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特 ...
- C# 使用代码来操作 IIS
由于需要维护网站的时候,可以自动将所有的站点HTTP重定向到指定的静态页面上. 要操作 IIS 主要使用到的是“Microsoft.Web.Administration.dll”. 该类库不可以在引用 ...