当前位置: 首页 > news >正文

JAVA集合学习和源码分析

一、结构

List和Set继承了Collection接口,Collection继承了Iterable

Object类是所有类的根类,包括集合类,集合类中的元素通常是对象,继承了Object类中的一些基本方法,例如toString()equals()hashCode()

Collection的增强for底层就是简化版本的迭代器遍历,可以DEBUG看到过程。

对集合的遍历:https://blog.csdn.net/m0_63297646/article/details/131843515

二、List

1、ArrayList

  • 线程不安全

  • 有序(添加和取出顺序一致),可重复,可以添加多个null

  • 默认大小是10,扩容是1.5倍

  • 每个元素都有对应的顺序索引,即支持索引。get()体现。

常用方法:

  • add()/addAll()

  • set()

  • get()

  • remove()

  • size()

  • isEmpty()

  • indexOf()

  • contains()

  • replaceAll()

  • subList()

底层:

  • ArrayList维护一个Object类型的数组elementData,就是一个空数组

  • 当创建ArrayList对象时,如果使用的是无参构造器,初始容量是0,第一次添加扩容到10,如果再扩容是1.5倍

  • 如果是指定大小的构造器,初始是指定大小,再次扩容是1.5倍

transient避免序列化

(1)无参构造

确认最小容量,赋值为10

modCount记录集合被修改的次数,此时minCapacity是10,但是elementData是空,就需要扩容

向右移动一位,就是除以2,比如初始化是个空数组,那么在newCapacity的时候还是0,所以第一次扩容不是直接扩,是在第一个if才扩容赋值为10,copyOf后都是null

(2)有参构造

同上

2、Vector

  • 线程安全的,操作方法带有synchronized

  • 默认10,扩容是2倍

底层:

(1)扩容

确定是否需要扩容

int类型初始化是0,所以newCapacity是两倍

(2)克隆

实现了Cloneable接口

调用 Object 类的 clone 方法,创建一个浅拷贝,对于数组元素,使用 Arrays.copyOf 方法进行深拷贝,重置副本的修改次数

3、LinkedList

  • 线程不安全

  • 双向链表和双端队列

  • 添加元素可重复,可添加null

LinkedList维护了两个属性first和last指向首节点和尾节点,每个节点对象,又维护了prev、next、itm三个属性,通过prev指向前一个,next指向后一个节点,实现双向链表。

常用方法:

【带有first和last就是实现了Deque,常用的是实现Queue】

add(E e):实现了List接口。在链表后添加一个元素;

addFirst(E e)/push(E e)、addLast(E e):实现了Deque接口。在链表头部/尾部插入一个元素;

offerFirst(E e)、offerLast(E e):实现了Deque接口。在链表头部插入一个元素,成功返回true,失败false

offer(E e):实现了Queue接口。将指定的元素插入到队列的末尾,成功返回true,失败false

peek():获取第一个元素,但是不移除;

poll():查询并移除第一个元素 ;

remove() :移除链表中第一个元素;

底层:

(1)add

first = null, last = null

第一个节点加入的时候,first和last都指向newNode,prev=next=null

再加入一个节点, l指向第一个节点的last,再将l赋值到newNode的prev,将第一个节点的last指向newNode,此时l指向的是第一个节点不为空,将l的next指向newNode,完成链表,size=modCount=2

(2)removeFirst

4、比较

ArrayListLinkedListVector
底层结构可变数组双向链表可变数组
线程安全不安全(Collections.synchronizedList)不安全安全(synchronized)
初始值10,扩容1.5倍10,扩容2倍空链表
有序,可重复,多个null有序,可重复,多
效率增删较低,查找快(索引)增删较高,查找慢(顺序遍历)
适用大部分频繁插入和删除

5、拓展【synchronizedList

Collections.synchronizedList方法接受一个普通的List作为参数,并返回一个具有同步方法的List。可以使用这个同步的List在多线程环境中进行操作。尽管synchronizedList提供了一些基本的同步,但在复合操作(例如迭代和修改)时,仍然需要手动同步以确保线程安全。

https://www.cnblogs.com/jiading/articles/13038607.html

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
​
public class ManualSynchronizationExample {public static void main(String[] args) {// 创建一个普通的ArrayListList<String> normalList = new ArrayList<>();
​// 使用Collections.synchronizedList方法创建线程安全的ListList<String> synchronizedList = Collections.synchronizedList(normalList);
​// 创建两个线程,一个线程向列表中添加元素,另一个线程遍历列表Thread addThread = new Thread(() -> {for (int i = 0; i < 1000; i++) {addElement(synchronizedList, "Element" + i);}});
​Thread iterateThread = new Thread(() -> {iterateList(synchronizedList);});
​// 启动线程addThread.start();iterateThread.start();
​// 等待两个线程执行完成try {addThread.join();iterateThread.join();} catch (InterruptedException e) {e.printStackTrace();}}
​// 使用 synchronized 关键字确保对列表的安全添加操作private synchronized static void addElement(List<String> list, String element) {list.add(element);}
​// 使用 synchronized 关键字确保对列表的安全遍历操作private synchronized static void iterateList(List<String> list) {for (String element : list) {// 在迭代过程中对列表进行操作System.out.println(element);}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入理解JVM虚拟机第二十二篇:详解JVM当中与操作数栈相关的字节码指令
  • 041:vue中 el-table每个单元格包含多个数据项处理
  • 第五章 nfs服务器
  • 安卓常见设计模式12------观察者模式(Kotlin版、Livedata、Flow)
  • Linux imu6ull驱动- led
  • vue项目pdf文件的预览
  • SpringData、SparkStreaming和Flink集成Elasticsearch
  • 在gitlab中指定自定义 CI/CD 配置文件
  • C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割
  • GEE案例——使用Sentinel-1 影像进行分析RVI指数进行计算
  • n-gram语言模型——句子概率分布计算与平滑
  • RPC 框架 openfeign 介绍和学习使用总结
  • C/C++输出硬币翻转 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
  • 用java把服务器某个目录日志实时打印出来
  • 如何接入电商数据(淘宝/京东)API接口的对接获取(商品详情|价格|SKU)
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • es6
  • ES6 ...操作符
  • Git学习与使用心得(1)—— 初始化
  • Objective-C 中关联引用的概念
  • Sass 快速入门教程
  • vue--为什么data属性必须是一个函数
  • 笨办法学C 练习34:动态数组
  • 测试如何在敏捷团队中工作?
  • 大整数乘法-表格法
  • 多线程 start 和 run 方法到底有什么区别?
  • 基于游标的分页接口实现
  • 计算机常识 - 收藏集 - 掘金
  • 理解在java “”i=i++;”所发生的事情
  • 思维导图—你不知道的JavaScript中卷
  • 一天一个设计模式之JS实现——适配器模式
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ‌移动管家手机智能控制汽车系统
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • (1)STL算法之遍历容器
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (floyd+补集) poj 3275
  • (规划)24届春招和25届暑假实习路线准备规划
  • (黑马点评)二、短信登录功能实现
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (图)IntelliTrace Tools 跟踪云端程序
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转) 深度模型优化性能 调参
  • (转)JAVA中的堆栈
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET 4.0中的泛型协变和反变
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core中Emit的使用
  • .net 简单实现MD5
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET分布式缓存Memcached从入门到实战
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @RequestBody与@ResponseBody的使用
  • @RequestMapping-占位符映射
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限