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

集合03 Collection (List) - Java

List

  • ArrayList
    • ArrayList注意事项
    • ArrayList底层操作机制-源码分析(重点)
  • Vector
    • Vector基本介绍
  • ——Vector和ArrayList比较
    • Vector底层结构和源码分析
  • LinkedList
    • 基本介绍
    • LinkedList的底层结构和操作机制
    • LinkedList的增删改查
  • ——LinkedList和ArrayList比较

ArrayList

ArrayList注意事项

  1. permits all elements, including null 。ArrayList 可以加入null,并且多个。
  2. ArrayList是由数组来实现数据存储的。
  3. ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码,在多线程情况下,不建议使用ArrayList。
    public static void main(String[] args) {ArrayList arrayList = new ArrayList();arrayList.add(null);arrayList.add(2);arrayList.add(null);arrayList.add("hello");System.out.println(arrayList);}

在这里插入图片描述
在这里插入图片描述

ArrayList底层操作机制-源码分析(重点)

  1. ArrayList中维护了一个Object类型的数组elementData。[debug看源码] transient Object[] elementData;
    transient表示瞬间,短暂的。表示该属性不会被序列化/串行化。
  2. 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
  3. 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容 elementData为1.5倍。

点击链接跳转看韩顺平老师的视频讲解

注意,IDEA 默认情况下,Debug 显示的数据是简化后的,如果希望看到完整的数据需要做设置。
在这里插入图片描述

Vector

Vector基本介绍

import java.util.Vector;

  1. Vector类的定义说明
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  1. Vector底层也是一个对象数组 protected Object[] elementData;
  2. Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
public synchronized E get(int index){if (index >= elementCount)throw new ArraylndexOutOfBoundsException(index);return elementData(index);}

4)在开发中,需要线程同步安全时,考虑使用Vector
在这里插入图片描述

——Vector和ArrayList比较

在这里插入图片描述

Vector底层结构和源码分析

//无参构造器
//有参数的构造
Vector vector = new Vector();
for (int i = 0; i < 10; i++) {vector.add(i);
}
vector.add(100);
System.out.println("vector=" + vector);
1. new Vector() 底层public Vector() {this(10);}
补充:如果是  Vector vector = new Vector(8);走的方法:public Vector(int initialCapacity) {this(initialCapacity, 0);}
其中有一个装箱过程
2. vector.add(i)
2.1  //下面这个方法就添加数据到vector集合public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}2.2  //确定是否需要扩容 条件 : minCapacity - elementData.length>0private void ensureCapacityHelper(int minCapacity) {// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法//newCapacity = oldCapacity + ((capacityIncrement > 0) ?//                             capacityIncrement : oldCapacity);//就是扩容两倍.private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}

LinkedList

基本介绍

  1. LinkedList底层实现了双向链表和双端队列特点
  2. 可以添加任意元素(元素可以重复),包括null
  3. 线程不安全,没有实现同步

LinkedList的底层结构和操作机制

  1. LinkedList底层维护了一个双向链表
  2. LinkedList中维护了两个属性 first和 last分别指向首节点和尾节点
  3. 每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过 prev指向前一个,通过 next指向后一个节点。最终实现双向链表
  4. 所以 LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高
  5. 模拟一个简单的双向链表代码【代码】

见LinkedList01.java

LinkedList的增删改查

见LinkedListCRUD.java

public static void main(String[] args) {LinkedList linkedList = new LinkedList();linkedList.add(1);linkedList.add(2);linkedList.add(3);System.out.println("linkedList=" + linkedList);//演示一个删除结点的linkedList.remove(); // 这里默认删除的是第一个结点//linkedList.remove(2);System.out.println("linkedList=" + linkedList);//修改某个结点对象linkedList.set(1, 999);System.out.println("linkedList=" + linkedList);//得到某个结点对象//get(1) 是得到双向链表的第二个对象Object o = linkedList.get(1);System.out.println(o);//999//因为LinkedList 是 实现了List接口, 遍历方式System.out.println("===LinkeList遍历迭代器====");Iterator iterator = linkedList.iterator();while (iterator.hasNext()) {Object next =  iterator.next();System.out.println("next=" + next);}System.out.println("===LinkeList遍历增强for====");for (Object o1 : linkedList) {System.out.println("o1=" + o1);}System.out.println("===LinkeList遍历普通for====");for (int i = 0; i < linkedList.size(); i++) {System.out.println(linkedList.get(i));}
}

debug查看源码学习


有很多种删除方式

linkedList.remove();//默认删除第一个节点


——LinkedList和ArrayList比较

在这里插入图片描述

本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03

http://www.lryc.cn/news/258537.html

相关文章:

  • 国产化软件突围!怿星科技eStation产品荣获2023铃轩奖“前瞻优秀奖”
  • 如何解决Redis热Key问题?
  • react Hooks之useId
  • 2023年全球软件开发大会(QCon广州站2023)-核心PPT资料下载
  • MicroSD 卡 使用读卡器 读取速度测试
  • Selenium+Unittest+HTMLTestRunner框架更改为Selenium+Pytest+Allure(一)
  • LoRA(Low-Rank Adaptation)
  • 【银行测试】第三方支付功能测试点+贷款常问面试题(详细)
  • 前端:HTML+CSS+JavaScript实现轮播图2
  • 使用条件格式突出显示单元格数据-sdk
  • java面试题-Dubbo和zookeeper运行原理
  • XSS漏洞 深度解析 XSS_labs靶场
  • C++的左值、右值、左值引用和右值引用
  • 罗技鼠标使用接收器和电脑重新配对
  • 高项备考葵花宝典-项目进度管理输入、输出、工具和技术(下,很详细考试必过)
  • GumbleSoftmax感性理解--可导式输出随机类别
  • ROS gazebo 机器人仿真,环境与robot建模,添加相机 lidar,控制robot运动
  • 人体关键点检测3:Android实现人体关键点检测(人体姿势估计)含源码 可实时检测
  • 踩坑记录:uniapp中scroll-view的scroll-top不生效问题;
  • YOLOX 学习笔记
  • 第3节:Vue3 v-bind指令
  • Token 和 N-Gram、Bag-of-Words 模型释义
  • 【go语言实践】基础篇 - 流程控制
  • Linux:gdb的简单使用
  • NestJS的微服务实现
  • Debian 终端Shell命令行长路径改为短路径
  • Ansible变量是什么?如何实现任务的循环?
  • 随机梯度下降的代码实现
  • 渐进推导中常用的一些结论
  • 网络安全等级保护V2.0测评指标