集合03 Collection (List) - Java

news2024/10/6 4:02:20

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>0
   private void ensureCapacityHelper(int minCapacity) {
       // overflow-conscious code
       if (minCapacity - elementData.length > 0)
           grow(minCapacity);
   }
 2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法
     //newCapacity = oldCapacity + ((capacityIncrement > 0) ?
     //                             capacityIncrement : oldCapacity);
     //就是扩容两倍.
   private void grow(int minCapacity) {
       // overflow-conscious code
       int 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.coloradmin.cn/o/1306222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用CHAT 写农业产品管理制度

问CHAT&#xff1a;茶叶种植基地农业投入品管理制度 CHAT回复&#xff1a;茶业种植基地农业投入品管理制度是规范茶叶种植管理、保证产品质量与安全&#xff0c;提升作物生产效益的重要环节。 以下是对于茶叶种植基地农业投入品管理制度的一些基本措施建议&#xff1a; 1. 投…

C# 使用异步委托获取线程返回值

写在前面 异步委托主要用于解决 ThreadPool.QueueUserWorkItem 没有提供获取线程执行完成后的返回值问题。异步委托只能在.Net Framework 框架下使用&#xff0c;.Net Core中会报平台错误&#xff0c;而且使用Task.Result来获取返回值&#xff0c;可以达成同样的目的&#xff…

Android--Jetpack--数据库Room详解一

人生何须万种愁&#xff0c;千里云烟一笑收 一&#xff0c;定义 Room也是一个ORM框架&#xff0c;它在SQLite上提供了一个抽象层&#xff0c;屏蔽了部分底层的细节&#xff0c;使用对象对数据库进行操作&#xff0c;进行CRUD就像对象调用方法一样的简单。 二&#xff0c;角色介…

靠谱的车- 华为OD统一考试(C卷)

靠谱的车- 华为OD统一考试&#xff08;C卷&#xff09; OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xf…

HTML+CSS高频面试题

面试题目录 前言1.讲一下盒模型&#xff0c;普通盒模型和怪异盒模型有什么区别2.CSS如何实现居中3.讲一下flex弹性盒布局4.CSS常见的选择器有哪些&#xff1f;优先级5.长度单位px 、em、rem的区别6.position属性的值有哪些7.display属性的值有哪些&#xff0c;分别有什么作用8.…

TCP/IP详解——IP协议,IP选路

文章目录 1. IP 编址1.1 IP 报文头部1.2 进制之间的转换1.3 网络通信1.4 有类 IP 编制的缺陷1.5 变长子网掩码1.6 网关1.7 IP 包分片1.7.1 IP 包分片实例1.7.2 IP 分片注意事项1.7.3 Wireshark 抓取 IP 包分片1.7.4 OmniPeek 抓取 IP 包分片1.7.5 ICMP 不可达差错&#xff08;需…

【生物信息学】scRNA-seq数据分析(一):质控~细胞筛选~高表达基因筛选

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 质控2. 细胞筛选3. 高表达基因筛选 一、实验介绍 质控~ 细胞筛选 ~高表达基因筛选 二、实验环境 1. 配置虚拟环境 可使用如下指令&#xff1a; conda create -n bio python3.…

bugku--社工-初步收集

打开是这么个东西 下面的刷钻软件可以下载 御剑扫一下目录&#xff0c;发现个登录界面 打开刷钻软件抓个包看一下 发现这么两条数据 user 和 pass base64 解码 user:Username: YnVna3VrdUAxNjMuY29t pass:Password: WFNMUk9DUE1OV1daUURaTA 解码发现是163的邮箱账号密码 登…

Vulnhub-DC-2 靶机复现完整过程

环境准备&#xff1a; kali: NAT模式 网段 &#xff1a;192.168.200.0 DC-2: NAT模式 网段 &#xff1a;192.168.200.0 保证靶机和攻击机在一个网段上 信息收集 收集同网段存货主机IP地址 nmap -sP ip地址 arp-scan -l显示错误页面&#xff0c;显然是重定向错误&#xff0c…

独立完成软件的功能的测试(2)

独立完成软件的功能的测试&#xff08;2&#xff09; &#xff08;12.13&#xff09; 1. 对穷举场景设计测试点&#xff08;等价类划分法&#xff09; 等价类划分法的概念&#xff1a; 说明&#xff1a;数据有共同特征&#xff0c;成功失败分类&#xff1a; 有效&#xff1a…

CSS的三大特性(层叠性、继承性、优先级---------很重要)

CSS 有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级。 层叠性 场景&#xff1a;相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突 的问题 原则&#xff1a;  样式冲突&am…

如何从eureka-server上进行服务发现,负载均衡远程调用服务

在spring cloud的maven的pom文件中添加eureka-client的依赖坐标 <!--eureka-client依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependen…

Linux(20):软件安装:原始码与 Tarball

开放源码的软件安装与升级 在Windows系统上面的软件都是一模一样的&#xff0c;【无法修改该软件的源代码】&#xff0c;因此&#xff0c;万一想要增加或者减少该软件的某些功能时&#xff0c;无能为力。。。 Linux 上面的软件几乎都是经过 GPL 的授权&#xff0c;所以每个软件…

99基于matlab的小波分解和小波能量熵函数

基于matlab的小波分解和小波能量熵函数&#xff0c;通过GUI界面导入西储大学轴承故障数据&#xff0c;以可视化的图对结果进行展现。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 99小波分解和小波能量熵函数 (xiaohongshu.com)https://www.xiaohongshu.co…

提升数据可视化:拖拽编辑自动汇总,树形数据表格展示新方式

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 树形结构是一种非常常见的数据结构&#xff0c;它由一组以层次关系排列的节点组成。树的结构类似于自然界中的一…

如何使用内网穿透实现iStoreOS软路由R4S公网远程访问局域网电脑桌面

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址…

【数据库】基于有效性确认的并发访问控制原理及调度流程,乐观无锁模式,冲突较少下的最优模型

使用有效性确认的并发控制 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专…

orb-slam2学习总结

目录 视觉SLAM 1、地图初始化 2、ORB_SLAM地图初始化流程 3、ORB特征提取及匹配 1、对极几何 2、对极约束 &#xff08;epipolar constraint&#xff09; 3、基础矩阵F、本质矩阵E 5、单目尺度不确定性 6、单应矩阵&#xff08;Homography Matrix&#xff09; 6.1 什么是单应矩…

没有明确的报错信息,阿里云国际版Windows服务器无法远程连接

在远程连接失败时&#xff0c;如果您没有收到系统返回的报错信息&#xff0c;并且ECS实例是运行中的状态&#xff0c;然后再根据以下步骤进行排查&#xff1a; 步骤一&#xff1a;使用阿里云Workbench工具测试远程登录 步骤二&#xff1a;检查是否有收到黑洞通知 步骤三&…

Zygote 进程启动过程

首语 在Android系统中&#xff0c;DVM(Dalvik虚拟机)和ART、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程创建的&#xff0c;也可以将其称之为孵化器&#xff0c;它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程。 Zygote进程是在…