Java--集合篇

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底层机制及源码解析
HashMap底层机制.png

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,维护数组+双向链表
  • 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分别如何实现去重的
image.png

该内容笔记源自B站韩顺平零基础30天学Java视频,如有侵权,请私信删除文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 集合的概述 集合的由来 在介绍集合之前,应先了解java中对于不同的数据类型应该用什么来记录。 当需要在Java程...
    YMeng_Zhang阅读 337评论 0 1
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,974评论 0 13
  • 一、Java 集合简介 (一) Java集合简介 1、Java 集合定义:(1)一个 Java 对象可以在内部持有...
    瀑月流光阅读 289评论 0 1
  • 集合框架概述 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一...
    zqyadam阅读 291评论 0 0
  • 学习目的 了解集合的概念 掌握java集合的分类以及作用 掌握java集合的对象创建,以及常用方法的使用 熟悉ja...
    从前的小余儿阅读 215评论 0 0