JavaHigh06-集合的概念浅析

一、单列集合框架结构

Collection接口:单列集合,用来存储一个一个的对象

1、概念:

List和Set是继承Collection的两个子接口,其中List接口存储有序的可重复的数据,Set接口存储无序的不可重复的数据

  • List接口:ArrayList,LinkedList,Vector
  • Set接口:HashSet、LinkedHashSet,TreeSet

2、使用:

集合Collection中存储的如果是自定义类的对象,需要自定义类重写equals()方法。

  • List:equals()方法
  • Set:HashSet、LinkedHashSet需要重写equals()、hashCode()方法;TreeSet不需要重写方法,但是需要存储的对象实现Comparable接口,在此基础上使用compareTo方法实现排序或重写Comparator方法定制排序

3、ArrayList,LinkedList,Vector三者的异同

ArrayList线程不安全,效率更高,底层是Object[]数组存储,扩容一次扩1.5倍;Vector是线程安全的,效率低,扩容一次扩两倍
LinkedList插入删除操作效率高,只要把前后节点断开即可操作,ArrayList则需要一个一个往前往后挪位置

4、HashSet简介

HashSet在初始化时,实际上是创建了一个HashMap对象
HashSet本质是在HashMap基础上,利用HashMap的key不能重复的原理,把所有的value指向同一个Object对象,LinkedHashSet作为HashSet的子类,不同点在于可以按照添加的顺序遍历,遍历性能更佳。
在这里插入图片描述

5、TreeSet简介

TreeSet在初始化时,也是创建了一个TreeMap对象,因此可以照添加对象的指定属性,进行排序
在这里插入图片描述

二、双列集合框架结构

Map接口:双列数据,存储key-value对的数据,类似函数:y=f(x)。其中key和Entry是Set存储,而value是Collection存储。

1、HashMap简介

HashMap是Map的主要实现类,线程不安全,效率高。HashMap的实现原理:

  • HashMap在第一次调用put时,底层创建长度为16的Node[]数组
  • 先调用所在类的hashCode()计算key的哈希值,得到对应的Entry在数组中的存放位置,该位置为空,则添加成功;
  • 该位置不为空,则比较key和以及存在的数据的哈希值,如果都不相同,则添加成功;
  • 如果key的哈希值和以及存在的数据哈希值相同,继续调用key所在类的equals方法比较,如果返回不相同返回false,则添加成功;
  • 如果返回true相同,则替换该key的value为新的value

HashMap扩容机制:

  • 在不断的添加过程中,会涉及到扩容问题,当超出临界值(且要存放的位置非空)时,扩容。默认扩容为原来容量的2倍,并将原来的数据复制过来。
  • 数组长度变为原来的2倍,表现在二进制上就是多了一个高位参与数组下标确定。此时,一个元素通过hash转换坐标的方法计算后,恰好出现一个现象:最高位是0则坐标不变,最高位是1则迁移到对应到“原位置+原数组长度”的位置。

HashMap底层典型属性的属性的说明:

  • DEFAULT_INITIAL_CAPACITY : HashMap的默认容量,16
  • DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75
  • threshold:扩容的临界值,=容量*填充因子:16 * 0.75 => 12
  • TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树:8
  • MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量:64

HashMap如果要实现Value排序,只需要把map.entrySet()传入ArrayList的构造器里,然后调用Collections.Sort方法,传入list和自定义的比较器,然后遍历list即可

2、LinkedHashMap简介

LinkedHashMap的底层结构是HashMap,因为LinkedHashMap继承于HashMap,区别在于:
LinkedHashMap内部提供了Entry,继承于HashMap中的Node。
在遍历元素时,是按照元素添加的顺序实现遍历的,原因是底层添加了一对指针,指向前一个和后一个元素,因此遍历频繁的话,执行效率高于HashMap

3、TreeMap简介

TreeMap按照添加的key-value进行排序,底层是红黑树

4、Hashtable简介

线程安全,效率低,不能存储null的key和value。是单锁,基本上不用。
currentHashMap,也是线程安全的,是分段锁,直接用table保存数据,锁的粒度更小,减少并发冲突的概率

5、Properties简介

是Hashtable的子类常用来处理配置文件,key和value都是String类型

三、Collections
Collections是操作Collection和map的一个工具类,类似数组里的Arrays工具类
常用方法:
reverse(List):反转 List 中元素的顺序
shuffle(List):对 List 集合元素进行随机排序
sort(List):根据元素的自然顺序对指定 List 集合元素升序排序
sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
Object min(Collection):根据元素的自然顺序,返回给定集合中的最小元素
Object min(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最小元素
int frequency(Collection,Object):返回指定集合中指定元素的出现次数
void copy(List dest,List src):将src中的内容复制到dest中
boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所旧值

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值