一:set集合框架体系图

二:set集合介绍

Set接口继承了Collection接口,含有许多常用的方法。

int size();返回集合的长度
boolean isEmpty();判断集合是否为空
boolean contains(Object o);是否包含某个值
boolean add(E e);添加元素
boolean remove(Object o);删除元素

Set接口的存储特点是无序不可重复,可以存放唯一一个null值,Set的常用实现类有HashSet,TreeSet。
Set集合的遍历方式有三种

1:直接打印System.out.println(set);

2:增强for循环遍历

3:迭代器遍历

Set集合的实现类

HashSet

1:HashSet实现了Cloneable, Serializable两个接口。

Cloneable:实现了clone()方法可以实现克隆功能
Serializable:表示可以被序列化传输。

2:HashSet的底层结构
HashSet的底层是通过HashMap实现
HashMap是通过数组加链表加红黑树实现的。

①:add()方法
调用Map集合中的put方法。
将要添加的元素作为Map集合中的key,PRESENT作为Map集合中的Value;
PERSENT的值为new Object( );
HashCode相同会发生什么?
产生hash碰撞,hash码相同,则通过key的equals()方法比较值是否相同.
key值不相等:则会在该节点的链表结构上新增一个节点(如果链表长度>=8且 数组节点数>=64 链表结构就会转换成红黑树)
key值相等:则用新的value替换旧的value

②:remove()方法
也调用的是Map集合中的remove方法

③:contains()方法

由此可见HashSet的底层是借助与HashMap实现的,底层的初始化原理,扩容原理都和HashSet集合相同·
3.HashSet的去重原理

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);else {Node<K,V> e; K k;//如果Hash相同并且数值相同直接替换即可if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;//如果p是一个红黑树结点else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);break;}if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;if (++size > threshold)resize();afterNodeInsertion(evict);return null;}

TreeSet

1.TreeSet是一个有序的集合,它的作用是提供有序的Set集合。它继承了AbstractSet抽象类,实现了NavigableSet,Cloneable,Serializable接。它是非线程安全的,TreeSet是基于TreeMap实现的
TreeMap是通过红黑树实现的
2.TreeSet的基本使用

如果我们像使用HashSet一样使用TreeSet这样是否会报错呢?
答案是报错

如何解决呢?解决办法有两种
解决方法一:(自然排序)、
在Student类中实现Comparable接口,重写compareTo方法即可

解决方法二:定制排序
在创建TreeMap对象时,传入一个Comparator接口,并实现里面的compare方法。

3.TreeSet的构造方法
TreeSet提供了五种构造方法。

①:无参构造方法,创建一个TreeMap类。
public TreeSet() {
this(new TreeMap<E,Object>());
}
②: 指定TreeSet的比较器
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
③:创建一个TreeSet,并将Collection c集合中的元素加入到TreeSet中
public TreeSet(Collection<? extends E> c) {
this();
addAll©;
}
④:构造一个包含相同元素并使用与指定排序集相同的顺序的新树集。
public TreeSet(SortedSet s) {
this(s.comparator());
addAll(s);
}
⑤:构造一个由指定的可导航地图支持的集合。
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}

4.TreeSet的去重方法:前面讲到hashSet去重的方法是hashcode和equals方法判断相同则覆盖,TreeSet是通过compareTo方法的返回值来判断是否相同,如果返回值为0则认定是重复元素

5.TreeSet的常用方法

public boolean add(E e) {
return m.put(e, PRESENT)==null;
}`
public boolean remove(Object o) {
return m.remove(o)==PRESENT;
}
public void clear() {
m.clear();
}
m为底层的HashMap集合,

LinkedHashSet

LinkedHashSet是一个哈希表和链表的结合,且是一个双向链表
并且linkedHashSet是一个非线程安全的集合。如果有多个线程同时访问当前linkedhashset集合容器,并且有一个线程对当前容器中的元素做了修改,那么必须要在外部实现同步保证数据的准确性。
LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法操作上又与 HashSet 相同

TreeSet和HashSet的区别

1、TreeSet 是二叉树(红黑树)实现的,Treeset中的数据是自动排好序的,不允许放入null值。

2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复。

3、HashSet要求放入的对象实现HashCode()和equals()方法,TreeSet要求放入的对象继承Comparable接口并实现compareTo方法或者在建TreeMap对象时,传入一个Comparator接口,并实现里面的compare方法

Java Set集合详解相关推荐

  1. Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    关注微信公众号:CodingTechWork,一起学习进步. Set集合介绍 Set集合的概念   Set集合类似于一个容器,程序把很多对象保存到Set集合中,Set集合对添加顺序不记录,当有重复的对 ...

  2. java常用集合详解

    文章目录 一.常用集合大纲 1.常用集合框架及介绍 2.集合和数组的区别 二.Collection 集合(接口) 三.List集合(接口) 1.存储遍历方式 2.ArrayList(实现类) 3.Li ...

  3. Java Set集合详解及Set与List的区别

    Set是什么? Java中的Set集合是继承Collection的接口,是一个不包含重复元素的集合. 下图是Set集合的源码. Set和List都是以接口的形式来进行声明.Set主要包含三种存放数据类 ...

  4. Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)

    关注微信公众号:CodingTechWork,一起学习进步. Map Map集合介绍   Map(也称为字典.关联数组)是用于保存具有映射关系的数据,保存两组值,key和value,这两组值可以是任何 ...

  5. Java—List集合详解

    关注微信公众号:CodingTechWork,一起学习进步. List集合介绍 List集合概述   List集合是一个元素有序(每个元素都有对应的顺序索引,第一个元素索引为0).且可重复的集合. L ...

  6. java map集合详解_JAVA干货:Map 集合详解

    java.util.Map集合 Map集合的特点: 1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value) 2.Map集合中的元素,key和value的数据类型可以相同,也可以 ...

  7. 【Java专题】Java泛型集合详解

    一.什么是泛型? 1.先来看不是泛型的ArrayList集合 ArrayList集合的底层是一个object[]数组,但是它跟数组比起来又有很多的优势,它可以存很多不同类型的数据.问题出现在数据被取出 ...

  8. Java~Map集合详解

    文章目录 Map介绍 核心Map 内部哈希:哈希映射技术 常用方法 遍历Map Map介绍 java.util中的集合类包含Java中某些最常用的类,其中最常用的集合类就是List和Map. 并且在集 ...

  9. Java集合详解之Map

    一.首先看看集合框架体系图 从图中可以看到,Map接口扩展了Iterator接口,关于Iterator接口详解请移步:Iterator接口详解 二.Map是什么? Map<k,v>使用键值 ...

最新文章

  1. GitHub开源:一键生成前后端代码神器
  2. 【FPGA】Spartan-6的时钟管理器(CMT)
  3. MongoDB排序异常
  4. json_encode 中文乱码
  5. NoSQL架构实践(二)——以NoSQL为主
  6. JAVA中将带负数的String字符串转换为int型数组方法
  7. KeyMob:我们做的不仅是移动广告聚合 更是靠谱
  8. iOS cell添加点击时改变字体的颜色及背景
  9. java代码 创建文件夹的方法
  10. c盘python27文件夹可以删除嘛_C盘里的空文件夹是不是都能删除啊
  11. 建立景区商城小程序,构建二次消费生态,增加景区收入
  12. 无线系统笔记(1)--梯度、散度、旋度(麦克斯韦先导)
  13. 重整国家资产负债表的核心是谁来买单
  14. Java实现 蓝桥杯VIP 算法训练 调和数列
  15. 网络邻居中打不开计算机,怎么解决Win7 64位旗舰版系统中网上邻居打不开
  16. 图片还原去遮挡_怎么去马赛克 还原图片去掉遮挡软件
  17. unity基础(3)——从Unity Asset store获取资源
  18. linux 安装Docker
  19. html5作品展示的动效,10款绚丽实用的HTML5图表动画应用
  20. lisp语言画地物符号_LISP语言在CAD工程制图中的应用_谢威

热门文章

  1. 安装CTEX时的深坑!血泪啊T_T
  2. 新款UI动态壁纸头像潮图小程序源码
  3. Lifecycle的原理
  4. aws ec2 tomcat部署
  5. jiffies和clock tick
  6. java mysql重要吗_干了三年的Java,你竟然还不会MySQL性能优化
  7. jetson nano安装树莓派摄像头(v2)及调试的方法
  8. figma都有哪些优势,哪些特点让你选择了figma
  9. python学习笔记1——(廖雪峰教程,菜鸟教程)python基础
  10. (完)④、iOS-RAC-在实际开发的使用-以登录注册为例子