第十四章 集合(List)

一、集合框架体系

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

二、Collection

1. Collection 接口常用方法

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

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.mzph.cn/news/494571.shtml

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

相关文章

【文末送书】知识体系目录

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、HDZ核心组成员&#x1f4aa;、C站周榜第一✌ &#x1f345; 粉丝专属福利&#xff1a;简历模板、PPT模板、知识体系、面试题库、技术互助。直接去文末领取 &#…

《日本制造业白皮书2018》深度解读:非连续创新、现场力、互联工业

日本三大部门共同撰写《日本制造业白皮书》作者&#xff1a;胡权来源&#xff1a; 工业4.0研究院2018年6月14日&#xff0c;日本经济产业省&#xff08;简称经产省&#xff09;发布了2018年的《日本制造业白皮书》。要了解日本制造业的情况&#xff0c;就全面性和系统性而言&am…

耗时n年,38页《数据仓库知识体系.pdf》(数据岗位必备)

文末下载PDF 文章很长&#xff0c;前言一定要看 拥有本篇文章&#xff0c;意味着你拥有一本完善的书籍&#xff0c;本篇文章整理了数据仓库领域&#xff0c;几乎所有的知识点&#xff0c;文章内容主要来源于以下几个方面&#xff1a; 源于「数据仓库交流群」资深数据仓库工程…

使用detours实现劫持

第一步&#xff1a;下载detours3.0&#xff0c;安装detours 第二步&#xff1a;构建库文件&#xff0c;nmake编译 第三步&#xff1a;包含库文件和头文件 #include “detours.h” //载入头文件 #pragma comment(lib,”detours.lib”) //表明要使用静态库 第四步&#xf…

Gartner2018新兴技术成熟度曲线:人机界线日益模糊!

来源&#xff1a;云头条摘要&#xff1a;Gartner公司的2018年新兴技术成熟度曲线上35项值得关注的代表性技术揭露了五种明显的新兴技术趋势&#xff0c;它们将模糊人与机器之间的界线。2018年新兴技术成熟度曲线是从2000多种技术筛选出来的。Gartner公司的2018年新兴技术成熟度…

1万字,阿珊学习笔记《前端基础知识》小白入门导读(建议收藏)

&#x1f345; 作者&#xff1a;阿珊 &#x1f345; 作者简介&#xff1a;95后前端小姐姐&#xff0c;蓝桥签约作者&#xff0c;欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 &#x1f345; 包邮送书&…

①万字《详解canvas api画图》小白前端入门教程(建议收藏)

&#x1f345; 作者&#xff1a;阿珊 &#x1f345; 作者简介&#xff1a;95后前端小姐姐&#xff0c;蓝桥签约作者&#xff0c;欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 &#x1f345; 包邮送书&…

新科技快速指南系列之“量子计算”:历史、现在与未来

来源&#xff1a;36Kr摘要&#xff1a;当计算机变更小或者变更快时&#xff0c;就会发生下一个大事件&#xff08;Big Things&#xff09;。量子计算的出现&#xff0c;是为了追求技术史上最大的性能提升。当计算机变更小或者变更快时&#xff0c;就会发生下一个大事件&#xf…

使用C与C++混合编程封装UDP协议

引入头文件&#xff0c;导入lib文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <WinSock2.h>#pragma comment(lib,"Ws2_32.lib")2. 在头文件中声明&#xff0c;由于是C中调用C代码需要使用extern关键字extern …

数据倾斜?几招把你安排的板板正正的!

&#x1f345; 作者&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、HDZ核心组成员&#x1f4aa;、C站总榜前10名✌ &#x1f345; 粉丝专属福利&#xff1a;文末公号「信息技术智库」回复「资料」领取 &#x1f345; 如觉得文章不错&…

数据解读:资本追逐的14个人工智能细分领域

来源&#xff1a;亿欧摘要&#xff1a; 2014年后&#xff0c;人工智能逐渐成为中国私募市场的“宠儿”&#xff0c;投资风口也逐渐形成。亿欧智库最新推出的《2018中国人工智能投资市场研究报告》中&#xff0c;挖掘了14个行业中最受追捧的细分领域。2012年&#xff0c;深度学习…

【举栗说明】JavaScript作用域,一次性给你总结!

&#x1f345; 作者&#xff1a;阿珊 &#x1f345; 作者简介&#xff1a;95后前端小姐姐&#xff0c;蓝桥签约作者&#xff0c;欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 &#x1f345; 包邮送书&…

反思腾讯:大数据与AI时代的危与机

来源&#xff1a;华尔街见闻摘要&#xff1a;过去十数年&#xff0c;腾讯从一个桌面即时通讯工具进化成为一个庞大的数字帝国&#xff0c;是全球互联网公司失控性进化的先行者和光辉典范。过去十数年&#xff0c;腾讯从一个桌面即时通讯工具进化成为一个庞大的数字帝国&#xf…

poj 1015(dp)

看的解题报告。。http://blog.csdn.net/lyy289065406/article/details/6671105 View Code 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <algorithm>5 6 using namespace std;7 8 int dp[22][805];9 int path[22][805]; …

cocos2dx实现经典飞机大战

游戏开始层 #ifndef __LayerGameStart_H__ #define __LayerGameStart_H__ #include "cocos2d.h" USING_NS_CC;class LayerGameStart :public CCLayer { public:static CCScene * scene();CREATE_FUNC(LayerGameStart);bool init();void addStartGamePicture();void …

【包邮送书活动】20211018期-开奖通知

奖品&#xff1a;包邮实体书 参与方式&#xff1a;CSDN点赞评论收藏文章即可参与、或公众号 开奖通知方式&#xff08;老是有人中奖联系不上&#xff0c;我很郁闷&#xff09;&#xff1a;朋友圈、blink、私信、发文 抽奖程序说明&#xff1a;https://notomato.blog.csdn.ne…

Cocos2dx实现象棋之布局

开始界面 #ifndef SCENESTART_H #define SCENESTART_H #include "cocos2d.h" #include "SceneGame.h" USING_NS_CC;class SceneStart : public CCLayer { public://SceneStart();static CCScene * scene();CREATE_FUNC(SceneStart)bool init();bool ccTou…

《画解算法》3. 无重复字符的最长子串【python3丨简单】

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家、C站总榜第8&#x1f3c6;、HDZ核心组成员。欢迎点赞、收藏、评论 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abca…

【关注】人类的智力是如何发展起来的?《自然》发布三大科学假说

来源&#xff1a;天大神经工程摘要&#xff1a;我们人类的远祖——著名的阿法南方古猿Lucy生活在三至四百万年前&#xff0c;身体构造介于现代人类与动物之间。我们人类的远祖——著名的阿法南方古猿Lucy生活在三至四百万年前&#xff0c;身体构造介于现代人类与动物之间。南方…

工业4.0进行时:增强现实技术如何变革制造业

来源&#xff1a;资本实验室摘要&#xff1a;说到增强现实&#xff0c;很多人可能首先会想到曾在一夜之间席卷全球&#xff0c;风靡世界的精灵宝可梦AR游戏。聚焦前沿科技创新与传统产业升级说到增强现实&#xff0c;很多人可能首先会想到曾在一夜之间席卷全球&#xff0c;风靡…