1、ArrayList
一、ArrayList扩容机制
1、ArrayList中维护了一个Object类型的数组elementData.[]
2、当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10(minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity)),如果需要再次扩容,则扩容elementData为1.5倍。
3、如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
2、 Vector
一、Vector介绍
1、Vector底层也是一个对象数组,protected Object[] elementData;
2、Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
3、开发中,需要线程同步安全时,考虑使用Vector
二、Vector和ArrayList的比较
ArrayList 可变数组 jdk1.2 不安全,效率高 如果有参构造1.5倍,如果无参:1.此第一次10,2.从第二次开始按1.5倍扩
Vector 可变数组 jdk1.0 安全,效率不高 如果无参,默认10,满后就按2倍扩容。如果指定大小,则每次直接按2倍扩
详细的可以追溯到ArrayList和Vector的源码,自己测试
3、 LinkedList
一、LinkedList介绍
1、LinkedLis底层实现了双向链表和双端队列特点
2、可以添加任意元素(元素可重复),包括null
3、线程不安全,非线程同步
二、LinkedList的底层操作机制
1、LinkedList底层维护了一个双向链表
2、LinkedList中维护了两个属性first和last分别指向首节点和尾节点
3、每个节点(Node对象),里面维护了prev和next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表
4、所以LinkedList的元素的**增加和删除**,不是通过数组来完成的,相对来说效率较高。
三、ArrayList和LinkedList的比较(两者均为线程不安全的,建议在单线程中使用)
ArrayList 底层结构:可变数组 增删的效率较低,数组扩容 改查的效率较高
LinkedList 底层结构:双向链表 增删的效率较高,通过链表追加 改查的效率较低
如何选择ArrayList和LinekedList:
1)如果我们改查的操作多,选择ArrayList
2)如果我们增删的操作多,选择LinkedList
3)一般来说,在程序中,80%-90%都是查询,因此大部分情况下选择ArrayList
4、Set
一、set接口基本介绍
1、Set底层实现了数组+链表
2、无序(添加和取出的顺序不一致),没有索引
3、不允许重复元素,所以最多包含一个null
5、HashSet
1)HashSet实现了set接口
2)HashSet实际上是HashMap
3)可以存放null值,但只能有一个
4)HashSet不保证元素是有序的,取决于hash后,再确定索引的结果
5)不能有重复元素/对象
6、Map
1)Map与Collection并列存在,用于保存具有映射关系的数据:Key-Value
2)Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中
3)Map中的key不允许重复,原因和HashSet一样。
4)Map中的value可以重复
5)Map的key可以为null,value也可以为null,注意key为null,只能有一个,value为null,可以多个
6)常用String作为Map的key
7)key和value之间存在单向的一对一的关系,即通过指定的key总能找到对应的value。
8)Map存放的数据key-value是存放在一个Node中的,因为Node实现了Entry接口,有些书上也说一对k-v就是一个Entry
一、Map体系的继承图
Map接口的子类有:HashTable---Properties、HashMap---LinkedHashMap 、SortedMap---TreeMap
二、Map接口常用方法
1)put:添加
2)remove:根据键删除映射关系
3)get:根据键获取值
4)size:获取元素个数
5)isEmpty:判断个数是否为0
6)clear:清除
7)containsKey:查找键是否存在
三、Map接口的遍历方法
1)containsKey:查找键是否存在
2)keySet:获取所有的键
3)entrySet,获取所有关系
4)values:获取所有的值
四、HashMap小结
1)Map接口的常用实现类:HashMap、HashTable和Properties
2)HashMap是Map接口使用频率最高的实现类
3)HashMap是以key-val对的方式来存储数据
4)Key不能重复,但是value可以重复,允许使用nuul键和null值
5)如果添加相同的key,则会覆盖原来的key-val,等同于修改(key不会替换,val会替换)
6)与HashSet一样,不保证映射的顺序,因为底层是以Hash表的方式来存储的
7)HashMap没有实现同步,因此是线程不安全的
五、HashMap底层机制及源码解析
1)(k,v)是一个Node实现了Map.Entry<K,V>,查看HashMap的源码可以看到
2)jdk7的hashMap底层实现【数组+链表】,jdk8底层【数组+链表+红黑树】
5.1、HashMap的扩容机制
1)HashMap底层维护了Node类型的数组table,默认为null
2)当创建对象时,将加载因子(loadfactor)初始化为0.75
3)当添加key-val时,通过key的哈希值得到在table的索引。然后判断该索引处是否又元素 ,如果没有元素则直接添加。如果该索引处有元素,继续判断该元素的key是否和准备加入的key相等,如果相等,则直接替换val;如果不相等需要判断是树结构还是链表结构,做出相应处理,如果添加时发现容量不够则需要扩容。
4)第一次添加,则需要扩容table容量为16,临界值(threshold)为12
5)以后再扩容,则需扩容table容量为原来的2倍,临界值为原来的2倍,即24,依次类推
6)在Java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认是8),并且table大小>=MIN_TREEIFY_CAPACITY(默认64),就会进行树化(红黑树)
六、HashTable
6.1、HashTable基本介绍
1)存放的元素是键值对:即K-V
2)hashtable的键和值都不能为null
3)hashtable使用方法基本上和hashmap一样
4)hashtable是线程安全的,hashmap是线程不安全的
6.2、 Map接口实现类-Properties
- 基本介绍
1.Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存数据
2.它的使用特点和Hashtable类似
3.Properties还可以用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改
4.说明:工作后xxx.Properties文件通常为配置文件,这个知识点在IO流举例。
七、总结-开发中如何选择集合实现类
在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集实现类特性进行选择,分许入下:
- 1、先判断存储的类型(一组对象或一组键值对)
- 2、一组对象:Collection接口
- 允许重复:list
增删多:LinekList【底层维护了一个双向链表】
改查多:ArrayList【底层维护了Object类型的可变数组】 - 不允许重复:Set
无序:HashSet【底层是HashMap,维护了一个哈希表 即(数组+链表+红黑树)】
排序:TreeSet
插入和取出顺序一致:LinkedHashSet,维护数组+双向链表
- 允许重复:list
- 3、一组键值对:Map
键无需:HashMap【底层是:哈希表 jdk7:数组+链表,jdk8:数组+链表+红黑树】
键排序:TreeMap
键插入和取出顺序一致:LinkedHashMap
读取文件:Properties
七、Collections工具类1:
Collections工具类介绍
1)Collections是一个操作Set、List和Map等集合的工具
2)Collections中提供了一系列静态的方法对集合元进行排序、查询和修改等操作排序操作:(均为static方法)
1)reverse(List):反转List中元素的顺序
2)shuffle(List):对List集合元素进行随机排序
3)sort(List):根据元素的自然顺序对指定List集合元素按升序排序
4)sort(List,Comparator):根据指定的Comoarator产生的顺序对List集合元素进行排序
5)swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换
- 查找、替换
1)Object max(Collection):根据元素的自然顺序,返回给定集中最大的元素
2)Object max(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素
3)Object min(Collection)
4)Object min(Collection,Comparator)
5)int frequency(Collection,Object):返回指定集合中指定元素的出现次数
6)void copy(List dest,List src):将src中的内容复制到dest中
7)boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换掉List对象的所有旧值
九、HashSet和TreeSet分别如何实现去重的
该内容笔记源自B站韩顺平零基础30天学Java视频,如有侵权,请私信删除文章。