集合部分知识总结

Set集合

使用:几乎没有自己特有的方法,都是使用Collection中的方法及三种遍历方式(增强for遍历,构造器遍历,forEach方法遍历)

子类:

HashSet:特点:无序,不重复,无索引

底层原理:

哈希值:Java中每个对象都有自己的int哈希值,可以调用hashCode()方法获取,1.每个对象多次调用该方法获取的哈希值都相同2.不同对象哈希值一般都是不同的,特殊情况哈希值可能相同(哈希碰撞)

哈希表结构:

jdk1.8之前:数组+链表

jdk1.8开始:数组+链表+红黑树

哈希表是一种增删会改查性能都还不错的一种数据结构

1.创建hashset对象时,先创建一个长度为16的数组,

2.添加元素时,会调用该对象的hashcode(),获取哈希值,和数组长度取余计算存储位置

3.判断该位置是否由元素,没有时null,直接存储

4.如果有,调用该对象的equals()方法,和已经存储的元素一一对比,相等:直接不存(hashset集合元素不重复的原理),不相等:1.8之前挂载在老元素的上面,1.8开始直接挂载在老元素的下面

5.1.8开始后,挂载的链表如果过长>8,且数组长度>=64,会将链表转换成红黑树

扩容机制:加载因子0.75,如果数组存储的元素是当前数组长度的0.75时,此时数组会自动扩容,创建原数组长度的2倍的新数组,原数组的元素会和新数组的长度重新计算存储位置

LinkedHashSet:

特点:有序,不重复,无索引

底层原理:和hashSet基本一样,多维护了一个双向链表,保证元素有序

TreeSet:

特点:可排序,不重复,无索引

底层原理:

红黑树结构:

普通二叉树:元素存储时是无序的,查找元素时只能一个一个的对比查找,效率极低

二叉查找树:存储元素时,遵循左小右大的原则,查找元素时对比后直接确定在当前元素的左边还是右边,查询效率较高

极端情况下,后面存储的元素永远比前面大,产生一种链表,优惠影响查询效率

平衡二叉树:

还是会遵循左小右大的原则,通过旋转操作,保证左右子树的数高差不超过1,查询效率较高

为了保证极致的平衡,每次增删元素时,都会进行大量的旋转,此时就会影响增删效率

红黑树:

还是会遵循左小右大的原则,通过红黑规则限制旋转次数,从而解决高频旋转的问题,增删改查的性能都还不错

存储元素时,以节点的凡是存储,创建一个节点对象:元素值,父节点地址值,左子节点的地址值,右子节点的地址值,颜色。从根节点依次往下存,遵循左小右大的原则

注意:使用Treeset集合存储元素时,该元素必须要指定排序规则

自然排序

比较器排序

设置排序规则:返回负数,存左边

返回整数存右边

返回0:即将存入的元素不存(不重复原理)

可变参数

概述:是一个形参

格式:数据类型...变量名

传参特点:1.可变参数本质就是一个数组

2.一个形参列表中只允许出现一个可变参数

3.可变参数必须在形参列表的最后

Collections

作用:操作集合的工具类

常见方法:

// 1、public static <T> boolean addAll(Collection<? super T> c, T...elements):为集合批量添加数据 // 2、public static void shuffle(List<?> list):随机打乱List集合中的元素顺序。 // 3、 public static <T> void sort(List<T> list):对List集合中的元素进行升序排序。 // 4、public static <T> void sort(List<T> list, Comparator<? super T> c): 对List集合中元素,按照比较器对象指定的规则进行排序

Map集合

特点:HashMap:针对于键:无序,不重复,无索引

LinkedHashMap:针对于键:有序,不重复,无索引

TreeMap:针对于键:可排序,不重复,无索引

Set底层复用Map键的源码

常见方法:

// 1.put添加元素: 无序,不重复,无索引。 // 2.public int size():获取集合的大小 // 3、public void clear():清空集合 // 4.public boolean isEmpty(): 判断集合是否为空,为空返回true ,反之! // 5.public V get(Object key):根据键获取对应值 // 6. public V remove(Object key):根据键删除整个元素(删除键会返回键的值) // 7.public boolean containsKey(Object key): 判断是否包含某个键 ,包含返回true ,反之 // 8.public boolean containsValue(Object value): 判断是否包含某个值。 // 9.public Set<K> keySet(): 获取Map集合的全部键。 // 10.public Collection<V> values(); 获取Map集合的全部值。 // 11.public boolean putAll(Map<K,V> map); 把其他Map集合的数据倒入到自己集合中来。

三种遍历方式:

方式一:1.获取所有键的set集合keySet(),遍历该集合获取每个键

2.get(key)通过键获取对应的值

方式二:1.获取所有键值对的set集合entrySet(),遍历该集合获取每个键值对对象Entry

2.通过键值对对象entry分别获取getKey()和值getValue()

方式三:forEach(BiConsumer匿名内部类对象),底层使用方式二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值