From 077ef09c8b5c09af6e49965aeddf72047d3c1993 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Tue, 14 Apr 2020 10:33:24 +0800 Subject: [PATCH] =?UTF-8?q?Create=20HashSet=20=E5=92=8C=20TreeSet.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blogs/集合/HashSet 和 TreeSet.md | 50 +++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 blogs/集合/HashSet 和 TreeSet.md diff --git a/blogs/集合/HashSet 和 TreeSet.md b/blogs/集合/HashSet 和 TreeSet.md new file mode 100644 index 0000000..a35947f --- /dev/null +++ b/blogs/集合/HashSet 和 TreeSet.md @@ -0,0 +1,50 @@ +--- +HashSet 和 TreeSet 源码解析 +--- + +#### HashSet + +HashSet 就是维护一个不包含重复元素的集合。 + +它的实现很简单,就是通过 HashMap 来做的。 + +```java +public class HashSet + extends AbstractSet + implements Set, Cloneable, java.io.Serializable +{ + private transient HashMap map; + private static final Object PRESENT = new Object(); + + public HashSet() { + map = new HashMap<>(); + } + + public boolean add(E e) { + return map.put(e, PRESENT)==null; + } +} +``` + +#### TreeSet + +TreeSet 大致的结构和 HashSet 相似,底层组合的是 TreeMap,所以继承了 TreeMap key 能够排序的功能,迭代的时候,也可以按照 key 的排序顺序进行迭代。 + +```java +public class TreeSet extends AbstractSet + implements NavigableSet, Cloneable, java.io.Serializable +{ + private transient NavigableMap m; + private static final Object PRESENT = new Object(); + + public TreeSet() { + this(new TreeMap<>()); + } + + public boolean add(E e) { + return m.put(e, PRESENT)==null; + } +} +``` + +但是和 HashSet 不同的是,TreeSet 可以实现从头或从尾进行遍历,这时是 TreeSet 定义接口,让 TreeMap 去实现的。 \ No newline at end of file