# Set接口
集合(數學意義)結構數據唯一、數據存儲無序,沒有跟索引相關的方法,不能用普通的for循環遍歷,必須使用迭代器遍歷或者增強for循環遍歷。
API:
~~~
?public interface Set<E> extends Collection<E> {
? ? ?// 集合中添加元素
? ? ?boolean add(E e);
? ? ?
? ? ?// 移除集合中的元素
? ? ?boolean remove(Object o);
? ? ?// 清空集合
? ? ?void clear();
? ? ?
? ? ?// 是否包含某個元素
? ? ?boolean contains(Object o);
? ? ?// 是否為空
? ? ?boolean isEmpty();
? ? ?
? ? ?// 返回遍歷集合的迭代器
? ? ?Iterator<E> iterator();
? ? ?
? ? ?// 集合中元素個數
? ? ?int size();
? ? ?
?}
~~~
Set接口的實現類:
******
## HashSet
使用HashMap作為底層數據結構存放數據,HashSet中將要存放的數據作為HashMap的Key,HashMap中的value為一個在HashSet中定義的共享的Object對象。
存放數據的過程需要先計算hash值,在根據hash值和一個表達式計算元素在數組中存放的位置,這和HashMap是一致的。保存在HashSet中的對象一定要重寫hashcode和equals方法。
源碼:
~~~
?public class HashSet<E> extends AbstractSet<E>
? ? ?implements Set<E>, Cloneable, java.io.Serializable {
? ? ?// HashMap保存數據
? ? ?private transient HashMap<E,Object> map;
? ? ?// HashMap中Entry共享的value對象
? ? ?private static final Object PRESENT = new Object();
? ? ?
? ? ?// ---------------------構造方法------------------------
? ? ?public HashSet() {
? ? ? ? ?// 初始化容量為16,負載因子為0.75
? ? ? ? ?map = new HashMap<>();
? ? }
? ? ?public HashSet(int initialCapacity, float loadFactor) {
? ? ? ? ?// 指定初始化容量和負載因子
? ? ? ? ?map = new HashMap<>(initialCapacity, loadFactor);
? ? }
? ? ?// 使用LinkedHashMap作為實現類
? ? ?// dummy僅僅只是來作為和其他構造方法的重載區別,沒有其他意義
? ? ?HashSet(int initialCapacity, float loadFactor, boolean dummy) {
? ? ? ? ?map = new LinkedHashMap<>(initialCapacity, loadFactor);
? ? }
? ? ?
? ? ?//-----------------------操作-------------------------
? ? ?// 添加操作
? ? ?public boolean add(E e) {
? ? ? ? ?// HashMap第一次添加的時候返回null,如果是返回null則證明是添加成功的操作
? ? ? ? ?return map.put(e, PRESENT)==null;
? ? }
? ? ?// 移除操作,
? ? ?public boolean remove(Object o) {
? ? ? ? ?return map.remove(o)==PRESENT;
? ? }
? ? ?// HashSet中沒有獲取元素的操作,只能通過迭代的方式來遍歷數據
? ? ?public Iterator<E> iterator() {
? ? ? ? ?return map.keySet().iterator();
? ? }
? ? ?// 其他操作也基本都是通過HashMap來操作的
?}
~~~
## TreeSet
使用TreeSet保存的數據唯一、按照升序進行排序,對TreeSet進行遍歷也是按照排序后的順序進行遍歷的。由于其需要對數據進行排序,因此對于自定義的引用類型需要實現內部比較器或者外部比較器。否則的話會在創建階段就拋出錯誤。
底層使用TreeMap,使用共享的PRESENT作為value值。
## LinkedHashSet
按照輸入順序進行輸出。在HashSet的基礎上多了一個總鏈表,將放入的元素串在一起,方便有序的遍歷。
- 第一章 Java基礎
- ThreadLocal
- Java異常體系
- Java集合框架
- List接口及其實現類
- Queue接口及其實現類
- Set接口及其實現類
- Map接口及其實現類
- JDK1.8新特性
- Lambda表達式
- 常用函數式接口
- stream流
- 面試
- 第二章 Java虛擬機
- 第一節、運行時數據區
- 第二節、垃圾回收
- 第三節、類加載機制
- 第四節、類文件與字節碼指令
- 第五節、語法糖
- 第六節、運行期優化
- 面試常見問題
- 第三章 并發編程
- 第一節、Java中的線程
- 第二節、Java中的鎖
- 第三節、線程池
- 第四節、并發工具類
- AQS
- 第四章 網絡編程
- WebSocket協議
- Netty
- Netty入門
- Netty-自定義協議
- 面試題
- IO
- 網絡IO模型
- 第五章 操作系統
- IO
- 文件系統的相關概念
- Java幾種文件讀寫方式性能對比
- Socket
- 內存管理
- 進程、線程、協程
- IO模型的演化過程
- 第六章 計算機網絡
- 第七章 消息隊列
- RabbitMQ
- 第八章 開發框架
- Spring
- Spring事務
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 數據庫
- Mysql
- Mysql中的索引
- Mysql中的鎖
- 面試常見問題
- Mysql中的日志
- InnoDB存儲引擎
- 事務
- Redis
- redis的數據類型
- redis數據結構
- Redis主從復制
- 哨兵模式
- 面試題
- Spring Boot整合Lettuce+Redisson實現布隆過濾器
- 集群
- Redis網絡IO模型
- 第十章 設計模式
- 設計模式-七大原則
- 設計模式-單例模式
- 設計模式-備忘錄模式
- 設計模式-原型模式
- 設計模式-責任鏈模式
- 設計模式-過濾模式
- 設計模式-觀察者模式
- 設計模式-工廠方法模式
- 設計模式-抽象工廠模式
- 設計模式-代理模式
- 第十一章 后端開發常用工具、庫
- Docker
- Docker安裝Mysql
- 第十二章 中間件
- ZooKeeper