Java基础学习之集合底层原理

作者:!0 ! 时间:2023-09-30 22:16:40 

一、Collection集合

Java基础学习之集合底层原理

Collection接口是单列集合类的父接口,这种集合可以将数据一个一个的存放到集合中。它有两个重要的子接口,分别是 java.util.List 和 java.util.Set

二、List接口

1、特点

  •  List是一种有序的集合

  • List是一种带索引的集合

  • List是一种可以存放重复数据的集合

2、List接口三个主要实现类

Java基础学习之集合底层原理

3、【面试题】ArrayList、LinkedList、Vector的区别

①ArrayList:线程不安全,查询效率高,插入、删除效率低;底层使用数组存储;
②LinkedList:对于频繁的插入、删除操作效率比ArrayList高,但是查询效率低;底层使用双向链表;
③Vector:线程安全,查询效率高,插入、删除效率低;底层使用数组存储;

源码分析:ArrayList

jdk7

创建对象时底层会创建一个长度为10的数组,默认情况下,扩容为原来的1.5倍,同时将数组复制到新数组中。

jkd8

创建对象时底层不会创建长度为10的数组,而是等到有数据添加进来时才创建。(节约空间,提高效率)

Vector

jdk7和8中创建对象时,底层都创建了长度为10的数组,扩容为原来的2倍

三、Set(Set底层是由Map实现的,所以一般都是问Map)

1、特点

能存储无序、不可重复的元素。
底层:数组+链表

2、无序性

无序性:不等于随机性。存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的。

3、不可重复性

保证添加的元素照equals()判断时,不能返回true.即:相同的元素只能添加一个。

四、Map

1、特点

无序的,不可重复的,由K-V键值对组成。

2、HashMap的源码分析

  • jdk7

在创建对象之后,底层会创建长度为16的一维数组Entry,当元素个数超过加载因子乘以数组长度时,并且当前添加元素发生了碰撞,就会进行扩容,扩容为原来的2倍,并复制到新数组中

  • jdk8

在创建对象之后底层没有创建长度为16的数组;
首次添加元素时才创建长度为16的数组
jkd8中数Node[],jdk7时Entry[](就只有名字不同)
jdk7底层是数组+链表;而jdk8中是数组+链表+红黑树
形成链表时,jdk7是新元素指向旧元素;jdk8是旧元素指向新元素(防止高并发造成的死循环)
当链表长度大于8并且数组长度大于64时,才会变成红黑树(提高查找效率)

3、LinkedHashMap

继承于HashMap,用于实现LUR算法

4、Hashtable

线程安全的,k-v都不能为空。
创建对象时默认为11,扩容为原来的2倍加1

来源:https://blog.csdn.net/qq_44713772/article/details/117261817

标签:Java,集合,底层原理
0
投稿

猜你喜欢

  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)

    2022-11-14 18:37:22
  • Java高级面试题小结

    2023-11-23 07:34:00
  • Java Scala实现数据库增删查改操作详解

    2022-02-03 05:09:22
  • Android实现声音采集回声与回声消除

    2022-09-28 12:13:17
  • Android自定义圆形进度条

    2021-08-01 14:29:28
  • 国内分布式框架Dubbo使用详解

    2022-05-10 13:38:27
  • C#设计模式之Singleton模式

    2022-03-28 09:01:31
  • 详解Java并发包中线程池ThreadPoolExecutor

    2022-03-23 19:57:20
  • Spring Boot集成MyBatis的方法

    2021-11-03 23:11:05
  • 使用异步方式调用同步方法(实例详解)

    2023-03-29 16:38:21
  • Springboot公共字段填充及ThreadLocal模块改进方案

    2023-11-17 22:58:39
  • JVM中有哪些内存区域及其作用

    2023-07-13 05:28:33
  • 发布 Android library 到 Maven 解析

    2022-11-01 22:20:13
  • Android 实现切圆图作为头像使用实例

    2023-04-29 04:08:08
  • 高斯混合模型与EM算法图文详解

    2022-10-02 12:05:02
  • 一文带你了解SpringBoot的启动原理

    2023-11-28 20:44:42
  • C#基于XNA生成随机颜色的方法

    2021-07-05 08:34:50
  • vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离

    2021-06-16 04:05:47
  • Mybatis selectKey 如何返回新增用户的id值

    2022-07-14 05:10:38
  • idea手动刷新git分支的详细教程

    2022-04-05 11:53:43
  • asp之家 软件编程 m.aspxhome.com