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视频,如有侵权,请私信删除文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

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