c++ list容器获取第n给元素_Java总结之容器家族--Collection*

一、概述

Collection是[收集品]的意思,这里称[容器],是java中的一个接口,位于java.util包下

Collection下有三大接口:List(列表)、Set(集合)、Queue(队列)

9cd9800bcb632d79a871e6b343d44290.png
b3a1d39cf09f010685a7e34c27195081.png

容器接口子类及方法

二、List接口

List:列表,顾名思义是一种表结构,核心方法:

  • 按索引插入元素 void add(int var1, E var2)
  • 按索引删除元素 E remove(int var1);
  • 按索引修改元素 E set(int var1, E var2)
  • 按索引查询元素 E get(int var1)

特点:

1.增删改查操作都可以按照索引进行精确的控制,所以是元素的有序排列

2.允许相同元素

6f9ad3551a6be1e34d7aef3d954e8cb0.png

List子类

List是java中使用频率非常高的一个接口,最要的子类:ArrayList、Vector、LinkedList

1.其中ArrayList、Vector是AbstractList-->AbstractCollection-->Collection 路线

2.LinkedList不止实现了List,还实现了Deque,就像得到两个师傅的真传,招式(方法)更多一些

Queue接口是队列(先进先出),Deque接口(双端队列)是Queue的弟子,两头都能随意进出

所以根据需求即可当栈也可当队列,LinkedList得到了Deque的真传,所以也可以

关于抽象类:

抽象类一般是先实现接口,或者拓展一些子类公用方法,总之就是把能做的先做了。

有种天下父母心的感觉,就像AbstractList对ArrayList说:我能帮你做的尽量都做了,接下来就看你的了。

public abstract class AbstractCollection implements Collectionpublic abstract class AbstractSequentialList extends AbstractList public abstract class AbstractList extends AbstractCollection implements List

1.ArrayList:数组列表

e063118043843c4b88df7f5fecc4318a.png

ArrayList

2.LinkedList:链式列表

7ee80c4f0d1957946c06454b6237e6e8.png

LinkedList

3.Vector、ArrayList与 LinkedList的比较

可以说Vector、ArrayList是亲兄弟,LinkedList算个堂兄

f0f87a3f9a524f2f4d20ad29004ce7a3.png
尾添加测试[add(E)]
461a09d859014c9c0460b00d4767e84a.png
操作数opCount=1000W:插入的位置与耗时比较
54cef01df0b9bdc2441d81150ba88368.png
可见ArrayList越往后插入越快,因为要变动的元素越少LinkedList从两头到中间速度变慢,取决于链表的查询机制,总的来说,随机添加LinkedList比较有优势些,只是末尾添加ArrayList较好

数组和双链表两种数据结构:

数组:定点添加,后面元素都要往后挪个位,O(n)-------双链表:耗时在找到那个定点,添加很快,综合O(n)数组:定点删除,后面元素都要往前挪个位,O(n)-------双链表:耗时在找到那个定点,删除很快,综合O(n)数组:定点查询,数组自带索引光环,O(1) -------双链表:一个一个挨着找 O(n)数组:定点修改,数组自带索引光环,O(1) -------双链表:耗时在找到那个定点,修改很快,综合O(n)

综上所属:

随机访问、修改性能:Vector、ArrayList>LinkedList 考虑到Vector、ArrayList添加或删除时: 1.可能伴随扩容/缩容, 2.当元素个数巨大时,可能造成大量空闲空间 3.数组连续开辟空间,会造成储存空间的碎片化 的这些问题,在大量添加或删除操作使用LinkedList是更好的选择 因为双链表:1.双链表的添加/删除耗时在查找工作,而双链表查询时会查看索引在前半还是后半来决定从头查询或从尾查询,从而最差情况只需size/2,而数组最差情况为size2.链表不需要开辟连续空间,从而避免储存空间的碎片化  另外在数据非常巨大的时候:LinkedList基于双链表,需要new 巨大数量的节点(Node),Vector、ArrayList只是开辟空间,所以更好一些,所以根据需求酌情处理

4.关于 Vector

顺便提一下只有Vector容器对象可以用vector.elements()获取Enumeration对象,其他列表的需要自定义

在合并字节输入流SequenceInputStream时需要传递一个Enumeration对象,Vector有了用处

SequenceInputStream​(Enumeration extends InputStream> e)Vector类对集合的元素操作时都加了synchronized,保证线程安全。但使得效率下降:如  public synchronized boolean add(E e) { modCount++; add(e, elementData, elementCount); return true; } 所谓同步:即当一个Iterator被正在被使用,另一个线程对Vector添加或删除元素,这时调用Iterator的方法时将抛出异常public synchronized void replaceAll(UnaryOperator operator) { Objects.requireNonNull(operator); final int expectedModCount = modCount; final Object[] es = elementData; final int size = elementCount; for (int i = 0; modCount == expectedModCount && i < size; i++) es[i] = operator.apply(elementAt(es, i)); if (modCount != expectedModCount) throw new ConcurrentModificationException(); modCount++; } 可以看到很多关于修改的方法当:modCount != expectedModCount时都会扔一个ConcurrentModificationException异常也就是期望的修改次数与真实的修改次数不一致时sa

三、Set接口

集合:数学上的集合性质:

  1. 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合
  2. 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
  3. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。

Set的操作比较少,基本上也就是Collection传下来的方法

Set一般基于Map来实现:HashSet、LinkedHashSet、TreeSet的特性,根本上是HashMap、LinkedHashMap、TreeMap的特性

1.HashSet

HashSet内部有一个HashMap map成员变量,增删实际上是使用map的方法

按照哈希的顺序:hashCode(),equals(Object obj)

底层实现:HashMap

748abab76edfcf265490e877304366ba.png

HashSet

private transient HashMap map; public HashSet() { map = new HashMap<>();}public boolean add(E e) { return map.put(e, PRESENT)==null;}public boolean remove(Object o) { return map.remove(o)==PRESENT;}

2.LinkedHashSet

LinkedHashSet是HashSet的子类,源码少得可怜,基本上都是调用父类(HashSet)的构造方法

基于一个由链表实现的哈希表,保留了元素插入顺序

底层实现:LinkedHashMap

c418f21bc21fc8f40b8496deb74f11ac.png

LinkedHashSet

LinkedHashSet中:

public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true);}

3.TreeSet---有序集合

实现NavigableSet:使用元素的compareTo对元素进行排序,也可使用Comparator自定义比较器

TreeSet多拜了一个师傅:NavigableSet-->SortedSet 使用方法也多几个

底层实现:TreeMap

public TreeSet() { this(new TreeMap<>()); }
0b982ea675c7a3fef22e2ad988e0c795.png

TreeSet

HashSet hashSet = new HashSet<>(); hashSet.add("赵"); hashSet.add("钱"); hashSet.add("孙"); hashSet.add("李");  //按照哈希的顺序:hashCode(),equals(Object obj) System.out.println(hashSet);//[钱, 赵, 孙, 李]  LinkedHashSet linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("赵"); linkedHashSet.add("钱"); linkedHashSet.add("孙"); linkedHashSet.add("李"); //基于链表实现了插入的顺序 System.out.println(linkedHashSet);//[赵, 钱, 孙, 李]  TreeSet treeSet = new TreeSet<>(); treeSet.add("赵"); treeSet.add("钱"); treeSet.add("孙"); treeSet.add("李"); //按照compareTo()的排序 System.out.println(treeSet);//[孙, 李, 赵, 钱]
18af6e255fe49fa107ab9e24f831177c.png

四、Queue

关于队列,是一直先进先出的线性数据结构,使用场合比较狭窄

子类常见的有PriorityQueue(优先队列)和上文提到的LinkedList。

0314c1c6fdd0d06bc9c1aa4e71c89420.png

queue

PriorityQueue

PriorityQueue优先队列,是基于数组实现的二叉堆来实现的特殊队列,具有完全二叉树的性质。

每次从优先队列中取出来的元素要么是最大值或最小值(最大堆/最小堆)

Collection的简单总结就酱紫

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

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

相关文章

eclipemaven本地仓库依赖_只用一招,让你Maven依赖下载速度快如闪电

一、背景众所周知&#xff0c;Maven对于依赖的管理让我们程序员感觉爽的不要不要的&#xff0c;但是由于这货是国外出的&#xff0c;所以在我们从中央仓库下载依赖的时候&#xff0c;速度如蜗牛一般&#xff0c;让人不能忍&#xff0c;并且这也是大多数程序员都会遇到的问题。今…

和华为杯_2019全国大学生物联网设计竞赛(华为杯)拉开序幕

由教育部高等学校计算机类专业教学指导委员会主办&#xff0c;四川大学承办&#xff0c;华为协办&#xff0c;上海交通大学和机械工业出版社华章公司联合支持的2019年全国大学生物联网设计竞赛(华为杯)全国巡回技术讲座暨宣传活动5月9日在郑州大学拉开序幕。全国大学生物联网设…

e.printstacktrace()为什么没有输出信息_不输入内容,能不能直接输出内容?

这段时间&#xff0c;我确信了一件事。想要输出内容&#xff0c;不需要“先输入”。直接输出&#xff0c;是能做到的。网络上流行一种观点&#xff1a;先输入&#xff0c;再输出&#xff01;我认为这是错的。人可以不输入知识&#xff0c;直接输出内容。人在世界上活了这些年。…

int mysql_「MYSQL」MYSQL中的int(11)到底代表什么意思?

一、前言在工作中经常要与mysql打交道&#xff0c;但是对mysql的各个字段类型一直都是一知半解&#xff0c;因此写本文总结记录一番。二、简介对于int类型的一些基础知识其实上图已经说的很明白了&#xff0c;在这里想讨论下常用的int(11)代表什么意思&#xff0c;很长时间以来…

mysql初级数据库_MYSQL初级数据库操作

MYSQL是个好东西啊&#xff0c;只是比较会折腾人&#xff0c;所以我先记录一下MySQL 数据备份的基础知识&#xff0c;省得以后又去东找西找Windows文件名、目录名不区分大小写&#xff0c;Linux区分大小写查看MySQL中的数据库这里有一个shop的数据库&#xff0c;information_sc…

java中的mod运算_Java中的运算符与控制语句

运算符与控制语句是Java语言中运用最为基础也是最为广泛的&#xff0c;所以今天就详细的介绍下运算符与控制语句。一、运算符1.算数运算符1).单目运算符&#xff1a; 、- 、 、-- A&#xff1a; 表示 a.正号&#xff08;一般省略&#xff09;&#xff1b;b.加法运算&#xff1b…

mysql如何查看表拥有的键_如何查看表或列的所有外键?

白板的微信表&#xff1a;SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHEREREFERENCED_TABLE_SCHEMA ANDREFERENCED_TABLE_NAME TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFER…

laravel 自带的用户登录视图路径_Laravel实现找回密码及密码重置,详细操作

Laravel实现找回密码及密码重置功能在php实现与在这里实现会有什么区别呢&#xff0c;下面我们来看看Laravel中的例子&#xff0c;在php中就不介绍了大家都懂的。忘记密码是应用中常见的场景之一&#xff0c;Laravel5也提供了对密码重置的支持&#xff0c;我们只需稍微做一下配…

yii不能没有提示验证错误信息_安装Mac系统时提示”应用程序副本不能验证 它在下载过程...”的解决方法...

在安装旧版本macOS系统时&#xff0c;比如macOS Mojave 10.14、macOS Sierra、OS X El Capitan、OS X Yosemite、OS X Mavericks等系统&#xff0c;会出现错误无法安装&#xff1a;“应用程序副本不能验证 它在下载过程中可能已遭破坏或篡改”&#xff0c;“This copy of the I…

mysql hugepage_因未配置Hugepage会话数添增悲剧案例

今天一朋友反馈他们的一个数据库hang住了,通过ssh也不能登录系统,他们没有办法重启系统解决问题,现在想让我帮忙找出问题原因分析awr得出询问朋友,他们的库一般session保持在200个左右,这次突然飙升到750以上,属于异常情况分析监听日志看到在截图的时间内,整体访问较频繁,某个i…

ip地址自动切换器_网络IP切换器IPProviders下载_IPProviders官方版下载1.1.22

IPProviders官方版是非常强大的ip切换器助手&#xff0c;可以进行ip地址更换&#xff0c;网关和dns更改。使用方法很简单&#xff0c;用户只需要提前设置好ip地址&#xff0c;需要切换的时候就可以任意切换了&#xff0c;让你可以随意切换更改自己的IP地址&#xff0c;非常方便…

mysql心得体会一百字_MYSQL CPU 100%实例详解

MYSQL CPU 100%实例详解2011/7/2 11:19:19作者&#xff1a;xy我要评论(0)自己的一台主机(Windows 2003 IIS PHP MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下。此主机有10个左右的 database, 分别给十个网站调用。据朋友测试&#xff0c;导致 …

mysql联合索引like_MySQL全文索引、联合索引、like查询、json查询速度大比拼

查询背景有一个表tmp_test_course大概有10万条记录&#xff0c;然后有个json字段叫outline&#xff0c;存了一对多关系(保存了多个编码&#xff0c;例如jy1577683381775)我们需要在这10万条数据中检索特定类型的数据&#xff0c;目标总数据量&#xff1a;2931条SELECTCOUNT(*) …

python在线包安装mysql_python安装mysql的依赖包mysql-python操作

一般情况下&#xff0c;使用pip命令安装即可&#xff1a;[rootdthost27 ~]# pip install mysql-python但是在实际工作环境中&#xff0c;往往会安装失败&#xff0c;这是因为系统缺少mysql的相关依赖组件。所以必须先安装mysql-devel类的包&#xff0c;而且必须要对应好mysql客…

收藏列表放入MySQL还是redis_mysql导入redis

程序遍历MySQL然后插入Redis&#xff0c;效率极低。利用redis-cli命令行工具有一个批量插入模式&#xff0c;是专门为批量执行命令设计的。可以把Mysql查询的内容格式化成redis-cli可用数据格式。1&#xff0c; 根据表创建一个sql&#xff0c;将数据转换为redis可用的格式(1) 表…

java markdown转word_一键将 Word 转换为 Markdown

李缘 | | Stata 连享会 (知乎 | 简书 | 码云方法一&#xff1a;Writage Pandoc -- 双剑合璧&#xff01;打开 Writage网页&#xff0c;点击Download&#xff0c;再点击Download Now完成下载网页下载运行安装程序&#xff0c;一般按照默认选项安装就好啦安装重启电脑&#xff0…

deepin安装java_Deepin安装Eclipse

Deepin安装Eclipse系统环境:Deepin 15.5软件环境:Eclipse 4.7官网下载最新版elipse(4.7)安装板或压缩版均启动失败(弹框报错)&#xff0c;原因是deepin默认安装的openjdk1.9的版本,而eclipse支持的最低版本为jdk1.8版本,本机又需要jdk1.7版本的,因此需要修改eclipse启动vm参数才…

简述java在安卓开发中的应用_Java 自定义注解在安卓开发中的简单运用

定义&#xff1a;注解(Annotation)&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、接口、枚举、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说…

java正则表达式 分词_[Java]使用正则表达式实现分词

手工分词稍嫌麻烦&#xff0c;不好维护&#xff0c;而利用正则表达式就利索多了。Java提供了java.util.regex.Matcher&#xff0c;java.util.regex.Pattern类来帮助我们实现此功能。例一&#xff1a;以下程序将把"This is a farm that that raises dairy cattle."中的…

as和java什么关系_深入理解happens-before和as-if-serial语义

概述本文大部分整理自《Java并发编程的艺术》&#xff0c;温故而知新&#xff0c;加深对基础的理解程度。指令序列的重排序我们在编写代码的时候&#xff0c;通常自上而下编写&#xff0c;那么希望执行的顺序&#xff0c;理论上也是逐步串行执行&#xff0c;但是为了提高性能&a…