第十四章 集合(List)

一、集合框架体系

集合:
(1)可以动态保存任意多个对象
(2)提供了一系列方便的操作对象的方法
在这里插入图片描述
在这里插入图片描述

二、Collection

1. Collection 接口常用方法

(1)add:添加单个元素
(2)remove:删除指定元素
(3)contains:查找元素是否存在
(4)size:获取元素个数
(5)isEmpty:判断是否为空
(6)clear:清空
(7)addAll:添加多个元素
(8)containsAIl:查找多个元素是否都存在
(9)removeAll:删除多个元素

public class Demo {public static void main(String[] args) {Collection list = new ArrayList();// add:添加单个元素list.add("jack");list.add(10);//list.add(new Integer(10))list.add(true);System.out.println("list=" + list);// remove:删除指定元素//list.remove(0);//删除第一个元素list.remove(true);//指定删除某个元素System.out.println("list=" + list);// contains:查找元素是否存在System.out.println(list.contains("jack"));//true// size:获取元素个数System.out.println(list.size());//2// isEmpty:判断是否为空System.out.println(list.isEmpty());//false// clear:清空list.clear();System.out.println("list=" + list);// list=[]// addAll:添加多个元素Collection list2 = new ArrayList();list2.add("红楼梦");list2.add("三国演义");list.addAll(list2);System.out.println("list=" + list); // list=[红楼梦, 三国演义]// containsAll:查找多个元素是否都存在System.out.println(list.containsAll(list2));//true// removeAll:删除多个元素list.add("聊斋");list.removeAll(list2);System.out.println("list=" + list);// list=[聊斋]}
}

2. Collection 接口遍历元素方式1,使用 Iterator(迭代器)

(1)Iterator 对象称为迭代器,主要用于遍历 Collection集合 中的元素。
(2)所有实现了 Collection接口 的集合类都有一个 iterator() 方法,用以返口一个实现了Iterator接口 的对象,即可以返回一个迭代器。
(3)Iterator 仅用于遍历集合,lterator 本身并不存放对象。

public class Test {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);// list.iterator() 重置迭代器,可重复Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {Integer next = iterator.next();System.out.println(next);}}
}

3. Collection 接口遍历元素方式2,for循环增强

增强 for 循环,可以代替 iterator 迭代器,特点:增强 for 本质就是迭代器。只能用于遍历集合或数组。

public class Test {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);for (Integer e : list) {System.out.println(e);}}
}

三、List

1. List 接口基本介绍

(1)List 接口是 Collection 接口的子接口。
(2)List 集合类中元素 有序(即添加顺序和取出顺序一致)、且 可重复
(3)List 集合中的每个元素都有其对应的顺序索引,即 支持索引
(4)List 容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

2. List 集合里添加了一些根据索引来操作集合元素的方法

(1)void add (int index, Object ele):在 index 位置插入 ele 元素。
(2)boolean addAll (int index, Collection eles):从 index 位置开始将 eles 中的所有元素添加进来。
(3)Object get (int index):获取指定 index 位置的元素。
(4)int indexOf (Object obj):返回 obj 在集合中首次出现的位置。
(5)int lastlndexOf (Object obj):返回 obj 在当前集合中末次出现的位置。
(6)Object remove (int index):移除指定 index 位置的元素,并返回此元素。
(7)Object set (int index, Object ele):设置指定 index 位置的元素为 ele,相当于是替换。
(8)List subList (int fromlndex,int tolndex):返回从 fromlndex 到(tolndex -1)位置的子集合。

public class Test {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("乔峰");list.add("段誉");list.add(1, "虚竹");list.add("Tom");System.out.println(list); // [乔峰, 虚竹, 段誉, Tom]List<String> list2 = new ArrayList<>();list2.add("Jack");list2.add("Tom");list.addAll(1, list2);System.out.println(list); // [乔峰, Jack, Tom, 虚竹, 段誉, Tom]System.out.println(list.get(1)); // JackSystem.out.println(list.indexOf("Tom")); // 2System.out.println(list.lastIndexOf("Tom")); // 5list.remove(5);System.out.println(list); // [乔峰, Jack, Tom, 虚竹, 段誉]list.set(2, "Mike");System.out.println(list); // [乔峰, Jack, Mike, 虚竹, 段誉]System.out.println(list.subList(0, 2)); // [乔峰, Jack]}
}

四、ArrayList(P509)

1. ArrayList的注意事项

(1)ArrayList 可以加入 null,并且多个。
(2)ArrayList 是由数组来实现数据存储的。
(3)ArrayList 基本等同于 Vector。ArrayList 是线程不安全(执行效率高),在多线程情况下,不建议使用 ArrayList。

2. ArrayList的底层操作机制源码分析(P510)

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

public class ArrayList_<E> {transient Object[] elementData;private int size;protected transient int modCount = 0;private static final int DEFAULT_CAPACITY = 10;private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};// 无参构造public ArrayList_() {// 创建一个空的数组this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}public ArrayList_(int initialCapacity) {if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} }public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!// 在 elementData[size] 赋值,并且size++elementData[size++] = e;return true;}private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}private void ensureExplicitCapacity(int minCapacity) {// 操作次数modCount++;// overflow-conscious code// 判断是否扩容,如果elementData数组大小不够就扩容if (minCapacity - elementData.length > 0){grow(minCapacity);}}private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;// 扩容方法private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;// 扩容为1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0){newCapacity = minCapacity;}// 防止超过最大值2147483639if (newCapacity - MAX_ARRAY_SIZE > 0){newCapacity = hugeCapacity(minCapacity);}// minCapacity is usually close to size, so this is a win:// Arrays.copyOf 可以保留原先的数据,并扩容elementData = Arrays.copyOf(elementData, newCapacity);}private static int hugeCapacity(int minCapacity) {if (minCapacity < 0){// overflowthrow new OutOfMemoryError();}return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;}
}

五、Vector(P513)

1. Vector 的基本介绍

(1)Vector 类的定义说明

public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable

(2)Vector 底层也是一个对象数组 protected Object[] elementData;
(3)Vector 是线程同步的,即线程安全,Vector 类的操作方法带有 synchronized
(4)在开发中,需要线程同步安全时,考虑使用 Vector。
在这里插入图片描述

2. Vector 的底层操作机制源码分析

Vector 扩容源码类似于 ArrayList

public class Vector_<E> {protected Object[] elementData;protected int capacityIncrement;protected transient int modCount = 0;protected int elementCount;public Vector_() {this(10);}public Vector_(int initialCapacity) {this(initialCapacity, 0);}public Vector_(int initialCapacity, int capacityIncrement) {super();if (initialCapacity < 0){throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}// 初始化数组this.elementData = new Object[initialCapacity];this.capacityIncrement = capacityIncrement;}public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}private void ensureCapacityHelper(int minCapacity) {// overflow-conscious code// 判断是否扩容if (minCapacity - elementData.length > 0){grow(minCapacity);}}private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;// newCapacity = oldCapacity + oldCapacityint newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0){newCapacity = minCapacity;}elementData = Arrays.copyOf(elementData, newCapacity);}
}

六、LinkedList(P515)

1. LinkedList 说明

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

2. LinkedList 的底层操作机制

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

3. LinkedList 源码解读(P516)

public class LinkedList_<E> {transient int size = 0;protected transient int modCount = 0;transient Node<E> first;transient Node<E> last;private static class Node<E> {E item; // 存放数据Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}public boolean add(E e) {linkLast(e);return true;}void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null) {first = newNode;} else {l.next = newNode;}size++;modCount++;}public E remove() {return removeFirst();}public E removeFirst() {final Node<E> f = first;if (f == null) {throw new NoSuchElementException();}return unlinkFirst(f);}private E unlinkFirst(Node<E> f) {// assert f == first && f != null;final E element = f.item;final Node<E> next = f.next;f.item = null;f.next = null; // help GCfirst = next;if (next == null) {last = null;} else {next.prev = null;}size--;modCount++;return element;}
}

七、ArrayList和LinkedList比较(P517)

在这里插入图片描述
(1)如果我们改查的操作多,选择 ArrayList。
(2)如果我们增删的操作多,选择 LinkedList。
(3)一般来说,在程序中,80%-90%都是查询,因此大部分情况下会选择 ArrayList。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/367812.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cypress测试:7个快速解决问题的调试技巧!

以下为作者观点&#xff1a; 快速编写代码是一项宝贵的技能&#xff0c;但能够有效调试和解决错误和bug&#xff0c;更是一个软件开发人员具有熟练技能的标志。调试是开发过程中的一个关键环节&#xff0c;可以确保软件按预期运行并满足用户需求。 Cypress 调试简介 Cypress …

【Linux】—Xshell、Xftp安装

文章目录 前言一、下载Xshell、Xftp二、安装Xshell三、使用XShell连接Linux服务器四、修改windows的主机映射文件&#xff08;hosts文件&#xff09;五、远程连接hadoop102/hadoop103/hadoop104服务器六、安装Xftp 前言 XShell远程管理工具&#xff0c;可以在Windows界面下来访…

uniapp + vue3 + Script Setup 写法变动 (持续更新)

一、uniapp 应用生命周期&#xff1a; https://uniapp.dcloud.net.cn/tutorial/vue3-composition-api.html 注意&#xff1a; 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 二 、uniapp页面生命周期&#xff1a; https://uniapp.dcloud.net.cn/tutori…

3.js - 色调映射(renderer.toneMapping)

// ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import * as TWEEN…

昇思25天学习打卡营第11天|基于MindSpore通过GPT实现情感分类

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 基于MindSpore通过GPT实现情感分类 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninsta…

【目标检测】DINO

一、引言 论文&#xff1a; DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 作者&#xff1a; IDEA 代码&#xff1a; DINO 注意&#xff1a; 该算法是在Deformable DETR、DAB-DETR、DN-DETR基础上的改进&#xff0c;在学习该算法前&#…

决策树算法的原理与案例实现

一、绪论 1.1 决策树算法的背景介绍 1.2 研究决策树算法的意义 二、决策树算法原理 2.1 决策树的基本概念 2.2 决策树构建的基本思路 2.2 决策树的构建过程 2.3 决策树的剪枝策略 三、决策树算法的优缺点 3.1 决策树算法的优势 3.2 决策树算法的局限性 3.3 决策树算…

Vue报错:Component name “xxx” should always be multi-word vue/multi-word-component

问题&#xff1a;搭建脚手架时报错&#xff0c;具体错误如下&#xff1a; ERROR in [eslint] E:\personalProject\VueProjects\vueproject2\src\components\Student.vue10:14 error Component name "Student" should always be multi-word vue/multi-word-compon…

【分布式数据仓库Hive】常见问题及解决办法

目录 一、启动hive时发现log4j版本和hadoop的版本有冲突 解决办法&#xff1a;删除hive下高版本的slf4j 二、启动hive报错 Exception in thread "main" java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/Object;)V …

Elasticsearch (1):ES基本概念和原理简单介绍

Elasticsearch&#xff08;简称 ES&#xff09;是一款基于 Apache Lucene 的分布式搜索和分析引擎。随着业务的发展&#xff0c;系统中的数据量不断增长&#xff0c;传统的关系型数据库在处理大量模糊查询时效率低下。因此&#xff0c;ES 作为一种高效、灵活和可扩展的全文检索…

分别使用netty和apache.plc4x测试读取modbus协议的设备信号

记录一下常见的工业协议数据读取方法 目录 前言Modbus协议说明Netty 读取测试使用plc4x 读取测试结束语 前言 Modbus 是一种通讯协议&#xff0c;用于在工业控制系统中进行数据通信和控制。Modbus 协议主要分为两种常用的变体&#xff1a;Modbus RTU 和 Modbus TCP/IP Modbus …

嵌入式Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader&#xff0c;uboot 是一个遵循 GPL 协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说&#xff0c;可以在没有系统的情况…

苹果手机收不到短信怎么恢复?90%的人都在这么做

在使用苹果手机的过程中&#xff0c;有时候会遇到无法接收短信的问题。这不仅影响正常的沟通&#xff0c;还可能错过重要的通知和验证码。那么&#xff0c;手机收不到短信怎么恢复呢&#xff1f;别担心&#xff0c;90%的人都在使用这些简单而有效的方法来解决这一问题。 本文将…

Halcon支持向量机

一 支持向量机 1 支持向量机介绍&#xff1a; 支持向量机(Support Vector Machine&#xff0c;SVM)是Corinna Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别表现出许多特有的优势。 2 支持向量机原理: 在n维空间中找到一个分类超平面…

14 卡尔曼滤波及代码实现

文章目录 14 卡尔曼滤波及代码实现14.0 基本概念14.1 公式推导14.2 代码实现 14 卡尔曼滤波及代码实现 14.0 基本概念 卡尔曼滤波是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法。由于观测数据包括系统中的噪声和…

React Native V0.74 — 稳定版已发布

嗨,React Native开发者们, React Native 世界中令人兴奋的消息是,V0.74刚刚在几天前发布,有超过 1600 次提交。亮点如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects让我们深入了解每一个新亮点…

移动智能终端数据安全管理方案

随着信息技术的飞速发展&#xff0c;移动设备已成为企业日常运营不可或缺的工具。特别是随着智能手机和平板电脑等移动设备的普及&#xff0c;这些设备存储了大量的个人和敏感数据&#xff0c;如银行信息、电子邮件等。员工通过智能手机和平板电脑访问企业资源&#xff0c;提高…

【vue3】【vant】 移动端中国传统文化和民间传说案例

更多项目点击&#x1f446;&#x1f446;&#x1f446;完整项目成品专栏 【vue3】【vant】 移动端中国传统文化和民间传说案例 获取源码方式项目说明&#xff1a;其中功能包括项目包含&#xff1a;项目运行环境运行截图和视频 获取源码方式 加Q群&#xff1a;632562109项目说…

Linux_管道通信

目录 一、匿名管道 1、介绍进程间通信 2、理解管道 3、管道通信 4、用户角度看匿名管道 5、内核角度看匿名管道 6、代码实现匿名管道 6.1 创建子进程 6.2 实现通信 7、匿名管道阻塞情况 8、匿名管道的读写原子性 二、命名管道 1、命名管道 1.1 命名管道通信 …

源代码层面分析Appium-inspector工作原理

Appium-inspector功能 Appium Inspector 基于 Appium 框架&#xff0c;Appium 是一个开源工具&#xff0c;用于自动化移动应用&#xff08;iOS 和 Android&#xff09;和桌面应用&#xff08;Windows 和 Mac&#xff09;。Appium 采用了客户端-服务器架构&#xff0c;允许用户通…