关于集合中一些常考的知识点总结「建议收藏」

关于集合中一些常考的知识点总结「建议收藏」本章主要总结了集合的一些基础但有重点的知识点,例如他们的底层数据结构以及集合之间的区别,其中HashMap最为重点。集合Java的集合框架中可以分为两大类:第一类是按照单个元素存储的Co

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本章主要总结了集合的一些基础但有重点的知识点,例如他们的底层数据结构以及集合之间的区别,其中 HashMap 最为重点。

集合

Java的集合框架中可以分为两大类:第一类是按照单个元素存储的 Collection 集合,其中 Set, List, Queue 都实现了 Collection 接口。第二类是按照 Key-Value 存储的 Map 集合。

List

List常量的两个子类分别是 ArrayList 和 LinkedList 这两个集合。

(1)、ArrayList 的特点。

A. ArrayList 底层数据结构是数组,数组的特点就是可以快速随机访问,直接根据下标定位,缺点是插入和删除速度比较慢,需要移动元素。

B. ArrayList 每次扩容之后的大小为之前的 1.5 倍。默认初始容量大小为 10。

(2)、LinkedList 的特点

LinkedList 底层数据结构是双向链表,链表的特点就是随机访问速度慢,必须一个一个遍历,不能直接通过下标定位,不过在插入、删除方面速度就比较快。不过由于链表是内存分配不要求连续,内存的利用率比较高。

LinkedList 还实现了另外一个接口Deque,即 double-ended queue,使得 LinkedList 同时具有队列的特性。

(3)、vector 的特点

vector 和 ArrayList 基本一样,不过 Vector 是线程安全的,而 ArrayList 是线程不安全的,

ArrayList 和 LinkedList 都是线程不安全的集合。

Map

Map 是一种 key-value 的集合,其常用的集合实现类有 HashMap, HashTable, TreeMap。

(1)、HashMap(重重点)

HashMap 的底层数据结构是 链表 + 数组,如果对他的底层结构不大懂的可以看我之前写的一篇文章:HashMap的存取原理你知道多少

HashMap 在进行 put 操作时,允许 key 和 value 为 null,且是线程不安全的,所以 HashMap 的性能非常好,只不过在多线程的环境下使用,需要给他加上对应的锁

重点数据:HashMap 的默认容量为 capacity = 16, 默认扩容因子 loadFactor = 0.75,至于扩容因子有什么用,下面会涉及到。

不过需要注意的是,HashMap 内部用变量 threshold 变量来表示 HashMap 中能放入的元素个数,且在 threshold 不超过最大值前提下, threshold = loadFactor * capacity。

也就是说,当元素的个数达到 threshold 之后,就会触发 HashMap 的扩容,而不是达到 capacity 才触发扩容。每次扩容之后的容量为之前的 2 倍

而 ArrayList 则是元素达到 capacity 时才触发扩容。

还有一个需要注意的是,HashMap 容量并不会在 new 的时候分配,而是在第一次 put 的时候才完成创建的。

public V put(K key, V value){
    if(table == EMPTY_TABLE){
        // 初始化
        inflateTable(threshold);
    }
}

默认初始化容量大小 capacity = 16,如果我们在初始化的时候指定了容量的大小 initialCapacity,则会先计算出比 initialCapacity 大的 2 的幂存入 threshold,并且也会把初始化容量置为 capacity = threshold。例如当我们指定初始容量 initialCapacity = 26 的话,则 threshold = 32, capacity = 32。

(2)、HashTable的特点

a. HashTable 和 HashMap 在工作原理上几乎一样,不过 HashTable 是线程安全的,如图

关于集合中一些常考的知识点总结「建议收藏」

不过锁是直接加在方法外面,所以在多线程环境下,性能极差。

不过在多线程的环境下,我们优先使用 ConcurrentHashMap 集合,这个集合在工作原理上也几乎和前面两个一样,但它是线程安全的,并且不像 HashTable 那样,把整个方法都给加锁了,而是把方法里面的关键代码加锁了,如图:

关于集合中一些常考的知识点总结「建议收藏」

所以在处理速度上比较快。

b. HashTable 不允许 key 和 value 为 null。

c. HashMap 的迭代器是 fail-fast 机制(快速失败机制), 而 HashTable 则是 fail-safe 机制(快速安全),如果不知道 fail-fast 与 fail-safe 的,可以看我之前写 的一篇文章:谈谈fail-fast与fail-safe

(3)、LinkedHashMap 的特点

LinkedHashMap 是 HashMap 的一个子类,我们知道 HashMap是在插入的时候是根据哈希码来选择位置的,是无序的,而 LinkedHashMap 在插入的时候具有双向链表的特性,内部使用链表维护了插入的顺序,能够保证输出的顺序和输入时的相同。

LinkedHashMap 也是线程不安全的,并且允许 key-value 为 null。

(4)、TreeMap

TreesMap 的底层数据结构是红黑树,和 HashMap 不同,它的 get, put, remove 操作都是 O(logn) 的时间复杂度,并且元素是有序的。

同样,TreeMap 也是线程不安全的。

Set

Set 是一种不允许出现重复元素的集合类型,常用的三个实现类是 HashSet、TreeSet 和 LinkedHashSet。

(1)、HashSet

HashSet 实际上是用 HashMap 来实现的,如图

关于集合中一些常考的知识点总结「建议收藏」

只是 Value 被固定为一个静态对象

关于集合中一些常考的知识点总结「建议收藏」

使用 Key 来保证集合元素的唯一性,不过它不保证集合元素的顺序。

(2)、TreeSet

TreeSet 也是用 TreeMap 来实现的,底层为树结构,TreeSet 则能够保证集合元素是有序的。

(3)、LinkedHashSet

LinkedHashSet 继承 HashSet,具有 HashSet 优点,不过与 HashSet 不同的是,LinkedHashSet 内部使用了链表来维护元素的插入顺序。

这些知识点如果都能自己打开源码配合看一下,很多有关集合的面试题就可以应付了。

最后推广下我的公众号:苦逼的码农戳我即可关注,文章都会首发于我的公众号,期待各路英雄的关注交流。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168165.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux 修改用户密码「建议收藏」

    Linux 修改用户密码「建议收藏」Linux修改密码用passwd命令,用root用户运行passwd,passwduser_name可以设置或修改任何用户的密码,普通用户运行passwd只能修改它自己的密码。[root@localhost~]#passwd##修改root用户密码Changingpasswordforuserroot..Newpassword:##输入新密码Retypene…

    2022年6月3日
    111
  • itextpdf生成表格的常见用法

    itextpdf生成表格的常见用法随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。在前面的文章介绍了itextpdf基本用法和使用itextpdf生成图片,itextpdf还可以实现很多功能,非常强大,今天主要介绍如何使用itextpdf生成表格式的pdf,在实际项目中也非常常用,首先举一个非常…

    2022年6月14日
    37
  • 2021版idea激活码99年_在线激活

    (2021版idea激活码99年)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~K…

    2022年3月22日
    125
  • Tomcat部署WAR包访问不带项目名的方式

    Tomcat部署WAR包访问不带项目名的方式1、将项目打成WAR包放在Tomcat的webapps目录下2、在Tomcat的安装目录的conf下找到server.xml的文件,如:D:\apache-tomcat-9.0.8\conf\server.xml3、在Host标签里边添加<Hostname=”localhost”appBase=”webapps”unpackWARs=”true”…

    2022年5月16日
    124
  • 2020-10-24 今年的1024

    2020-10-24 今年的1024作为一个伪程序员,写下自己的感受吧1.想靠编程这个饭碗吃饭,就要把这个技术搞扎实,说其他都都没有用;2.找到自己的用武之地,有自己的特点,有自己的能力才可以。3.坚持每天学习,每天总结,这是一生的好习惯【我是做不到】;4.考虑自己的年龄,找到自己年龄段该有的能力,该做的事情;…

    2022年6月24日
    24
  • C语言如何计算数组的长度

    C语言如何计算数组的长度(1)借助sizeof()函数:#include&lt;stdio.h&gt;intmain(){ //定义一个整型数组,并进行初始化赋值9个数据:  intarr[]={1,2,3,4,5,6,7,8,9}; intlength=0; //计算数组中数据长度: //所有数据的字节数除以一个数据的字节数即为数据的个数:  length=sizeof(arr)/…

    2022年7月27日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号