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日在郑州大学拉开序幕。全国大学生物联网设…

flatform installer web 安装php_web安装平台-微软web服务器配置安装工具(Web Platform Installer)5.0 官方最新版-东坡下载...

这里为您提供的是微软官方的web服务器配置安装工具(Web Platform Installer),他可以帮助你快速的配置你所需要各种web环境。Web服务器又称为WWW服务器&#xff0c;它是放置一般网站的服务器。一台Web服务器上可以建立多个网站&#xff0c;各网站的拥有者只需要把做好的网页和相…

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

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

用python祝福父亲节_父亲节给爸爸的祝福语微信48条

父亲节给爸爸的祝福语微信48条撑起亲情的保护伞&#xff0c;风雨再大也不怕&#xff1b;摘下严厉的面具&#xff0c;再硬的心也柔软&#xff1b;望着沧桑的背影&#xff0c;感动常在心间。父爱如山&#xff0c;父亲是永远的靠山。父亲节快乐&#xff01;下面是小编为大家整理推…

mac python运行按哪个键_#mac python如何使用教程#怎么在mac终端运行python程序

mac如何投屏手机1.首先&#xff0c;解iPhone&#xff0c;然后用手指从下往上&#xff0c;打开控心&#xff0c;在其中就可以找到AirPlay了屏幕镜像。2.接来下就来教大家如何使用AirPlay吧&#xff0c;首先将手机和电脑连接在同一WiFi网络之下&#xff0c;这是投屏成功的前提条件…

informatica 许可_Informatica安装教程

11.打开\961_Server_Installer_win32-x86\Server\install.exe&#xff1b;22.选中 安装Informatica 9.6.1 点下一步&#xff1b;33.继续 下一步44. 选取许可证密钥文件&#xff0c;修改安装目录&#xff0c;点下一步&#xff1b;55. 点 “安装”&#xff0c;直到安装…

python读取微信收款_python 处理微信对账单数据的实例代码

下面一段代码给大家介绍python 处理微信对账单数据&#xff0c;具体代码如下所示&#xff1a;#下载对账单并存储到数据库app.route("/bill/",methods["GET","POST"])def download_bill(date):pay MyWeiXinPay()#自己的支付类bill pay.download_…

mouseup 左键_javascript中mouseup事件丢失的原因与解决办法

这篇文章主要跟大家介绍了关于Javascript中mouseup事件丢失的原因与解决办法的相关资料&#xff0c;文中给出详细的示例代码供大家参考学习&#xff0c;需要的朋友们下面跟着小编一起来学习学习吧。前言当实现类似Excel选中区域的功能时&#xff0c;经常出现 mouseup 事件丢失的…

sqlite数据库主键自增_sqlite 中主键id自增的方法(转)

困扰了一段时间&#xff0c;先前的解决方法是定义静态变量rid0&#xff0c;然后把rid插入数据库的id列中&#xff0c;但是每次重启的时候&#xff0c;rid就自动从0开始&#xff0c;就会导致有相同的id&#xff0c;插入数据库发生错误。今天在网上又查了一下&#xff0c;发现了以…

万兆网卡实际吞吐量_案例探索 | 千兆/万兆网卡每秒转发包数处理能力上限到底有多大?...

“侦破”网卡传输能力的“个”案 作者:李烨楠 一个平静的下午,在某监控大厅,应急召集令发出,一时间应急电话、汇报、询问声音响成一片。这是怎么了?原来某重要+系统应用交易严重超时,业务产生大量积压,无法顺利进行。 一、问题到底出在哪里? 系统架构简单明了:后台为O…

android shell检查是否锁屏_android打开关闭屏幕

打开和关闭手机屏幕方法&#xff1a;1.关闭屏幕//设备管理者private DevicePolicyManager mDevicePolicyManager;//关屏组件private ComponentName mCompName;onCreate(){mDevicePolicyManager (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);// 申请…

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

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

mysqlfront连接MySQL错误_使用MySql-Front远程连接MySQL失败的解决办法

新安装的mysql默认是root用户&#xff0c;且密码为空&#xff0c;默认端口是3306。通过SSH可以连接并且登录&#xff0c;但是使用MySQL-Front等客户端连接失败。解决办法&#xff1a;1.确认Linux防火墙3306端口打开。在/etc/sysconfig/iptables文件中&#xff0c;添加一行&…

mysql数据库多少张表会影响性能_mysql数据库多少张表会影响性能

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

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

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

odp 加固 mysql_creator是一款为php框架odp的脚手架工具

creator项目介绍creator是一款为php框架odp的脚手架工具&#xff0c;主要用于生成dao层&#xff0c;dataService层&#xff0c;pageService层,controller层,action层,避免重复性劳动和提高工作效率软件架构软件架构说明使用说明(ps:配置已支持当前项目组文件路径,放置在app同级…

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;我们只需稍微做一下配…