Java基础学习之集合底层原理
作者:!0 ! 发布时间:2023-09-30 22:16:40
一、Collection集合
Collection接口是单列集合类的父接口,这种集合可以将数据一个一个的存放到集合中。它有两个重要的子接口,分别是 java.util.List 和 java.util.Set
二、List接口
1、特点
List是一种有序的集合
List是一种带索引的集合
List是一种可以存放重复数据的集合
2、List接口三个主要实现类
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


猜你喜欢
- 判断JSONObject是否存在某个KeyJSONObject jsonObj = new JSONObject();jsonObj.put
- 需求:有一个列表,列表中有一个edittext(只能输整形),外部有一个整形变量Int,每次改变列表中其中一项的edittext的值时,外部
- 概述 wsimport是jdk自带的命令,可以根据wsdl文档生成客户端中间代码,基于生成的代码编写客户端,可以省很多麻烦。先看两张截图:使
- 注意:导包的时候API 11之前: android.text.ClipboardManagerAPI 11之后: android.conte
- 近日沉醉于熟悉公司新项目的过程,不断地接触新的应用场景与实现技术,对于我是一种学不来的进步,实践是检验真理的唯一标准。我们今天就浅浅的谈一谈
- 本文实例为大家分享了Android实现接近传感器的具体代码,供大家参考,具体内容如下1.接近传感器检测物体与听筒(手机)的距离,单位是厘米。
- oshi查看cpu信息OSHI可以跨平台查看服务器信息,其中cpu负载信息为当前占用CPU的时间。需要在一段时间内获取两次,然后相减得出这段
- 最近在做wifi的相关的东西,打印WifiInfo的时候 无意间发现一个参数,改参数可以查看是否连接成功了指定wifi,但是这是隐藏的,遂将
- maven打包指定jdk的版本问题今天遇到个问题,项目中新写了一个接口,其中用到了lambda表达式,本地跑是没问题的,但提交到gitLab
- /// 构造随机数 种子static int GetRandomSeed(){ byte[] byt
- 一、叙述当Spring的事件(Application Event)为Bean和Bean之间的消息同步提供了支持。当一个Bean处理完成一个任
- Mybatis多层嵌套查询三张表:user article blog表的存储sql文件/*Navicat MySQL Data Transf
- 由于公司项目的需求,需要绘制一条竖直的间断线作为分割线。这个可坑了爹了,以前只搞过水平的间断线,只要通过shape也可以简单的画出来,但是千
- 知乎是一个真实的网络问答社区,社区氛围友好、理性、认真,连接各行各业的精英。他们分享着彼此的专业知识、经验和见解,为中文互联网源源不断地提供
- 1、lock是可中断锁,而synchronized 不是可中断锁线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁
- 概览阿里巴巴在2018年7月份发布Nacos, Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。并表示在6-8个
- 本文实例为大家分享了Winform实现导入导出Excel文件的具体代码,供大家参考,具体内容如下/// <summary> &n
- 前言spring框架作为JavaEE框架领域的一款重要的开源框架,在企业应用开发中有着很重要的作用,同时Spring框架及其子框架很多,所以
- 一、进行粒子效果生成练习1、生成一个空项目Assets->Import Package->Custom Package->
- 这篇文章主要介绍了Java实现TCP/IP协议的收发数据(服务端)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参