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匿名内部类对象),底层使用方式二