Java核心技术 卷1-总结-12

Java核心技术 卷1-总结-12

  • 具体的集合
    • 链表
    • 数组列表

具体的集合

下表中除了以 Map结尾的类之外, 其他类都实现了 Collection 接口,而以 Map结尾的类实现了 Map 接口。

集合类型描述
ArrayList一种可以动态增长和缩减的索引序列
LinkedList一种可以在任何位置进行高效地插入和删除操作的有序序列
ArrayDeque一种用循环数组实现的双端队列
HashSet一种没有重复元素的无序集合
TreeSet一种有序集
EnumSet一种包含枚举类型值的集
LinkedHashSet一种可以记住元素插入次序的集
PriorityQueue一种允许高效删除最小元素的集合
HashMap一种存储键/值关联的数据结构
TreeMap一种键值有序排列的映射表
EnumMap一种键值属于枚举类型的映射表
LinkedHashMap一种可以记住键/值项添加次序的映射表
WeakHashMap一种其值无用武之地后可以被垃圾回收器回收的映射表
IdentityHashMap一种用==而不是用equals比较键值的映射表

在这里插入图片描述

链表

数组和数组列表(如 ArrayList)都有一个重大的缺陷。就是从数组的中间位置删除一个元素要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。在数组中间的位置上插入一个元素也会涉及到元素搬移。
在这里插入图片描述

链表(linked list)解决了这个问题。 数组在连续的存储位置上存放对象引用,链表却将每个对象存放在独立的结点中。每个结点还存放着序列中下一个结点的引用。在Java中,所有链表实际上都是双向链接的—即每个结点还存放着指向前驱结点的引用。
在这里插入图片描述
从链表中间删除一个元素只需要更新被删除元素附近的链接。
在这里插入图片描述

Java集合类库提供了一个类LinkedList,在下面的代码示例中,先添加3个元素,然后再将第2个元素删除:

List<String> staff = new LinkedList<>();//LinkedList implements List 
staff.add("Amy");
staff.add("Bob");
staff.add("Carl");
Iterator iter = staff.iterator();
String first = iter.next();//visit first element 
String second = iter.next();//visit second element 
iter.remove();// remove last visited element

链表与泛型集合之间有一个重要的区别。链表是一个有序集合(ordered collection)。 LinkedList.add方法将对象添加到链表的尾部。但是,常常需要将元素添加到链表的中间。由于迭代器是描述集合中位置的,所以这种依赖于位置的add方法将由迭代器负责。只有对自然有序的集合使用迭代器添加元素才有实际意义。例如,集合(set)类型中的元素完全无序。因此,在Iterator接口中就没有add方法。

相反地,集合类库提供了子接口ListIterator,其中包含 add方法:

interface ListIterator<E> extends Iterator<E> {
	void add(E element);
}

Collection.add不同,这个方法不返回boolean类型的值,它假定添加操作总会改变链表。另外,ListIterator接口有两个方法,可以用来反向遍历链表。

E previous()
boolean hasPrevious()

next方法一样,previous方法返回越过的对象。

LinkedList类的listiterator方法返回一个实现了ListIterator接口的迭代器对象。

ListIterator<String> iter = staff.listIterator();

Add方法在迭代器位置之前添加一个新对象。例如,下面的代码将越过链表中的第一个元素,并在第二个元素之前添加"Juliet"

List<String> staff = new LinkedList<>();
staff.add("Amy");
staff.add("Bob");
staff.add("Carl");
ListIterator<String> iter = staff.listIterator();
iter.next();// skip past first element 
iter.add("Juliet");

如果多次调用add方法,将按照提供的次序把元素添加到链表中。它们被依次添加到迭代器当前位置之前。

当用一个刚刚由Iterator方法返回,并且指向链表表头的迭代器调用add操作时,新添加的元素将变成列表的新表头。当迭代器越过链表的最后一个元素时(即hasNext返回false),添加的元素将变成列表的新表尾。如果链表有n个元素,有n+1个位置可以添加新元素。

LinkedListset方法用一个新元素取代调用nextprevious方法返回的上一个元素。例如,下面的代码将用一个新值取代链表的第一个元素:

ListIterator<String> iter = list.listIterator();
String oldValue = iter.next();// returns first element 
iter.set(newValue);// sets first element to newValue

如果在某个迭代器修改集合时,另一个迭代器对其进行遍历,一定会出现混乱的状况。例如,一个迭代器指向另一个迭代器刚刚删除的元素前面,现在这个迭代器就是无效的,并且不应该再使用。 链表迭代器的设计使它能够检测到这种修改。如果迭代器发现它的集合被另一个迭代器修改了,或是被该集合自身的方法修改了,就会抛出一个ConcurrentModificationException异常。例如下面这段代码:

List<String> list = . . . ;
ListIterator<String> iter1= list.listIterator();
ListIterator<String> iter2= list.listIterator();
iter1.next();
iter1.remove();
iter2.next();// throws ConcurrentModi ficationException

iter2检测出这个链表被从外部修改了,所以对iter2.next的调用抛出了一个ConcurrentModificationException异常。

为了避免发生并发修改的异常,需要遵循下述规则:可以根据需要给容器附加许多的迭代器,但是这些迭代器只能读取列表。另外,再单独附加一个既能读又能写的迭代器。

有一种简单的方法可以检测到并发修改的问题。集合可以跟踪改写操作(诸如添加或删除元素)的次数。每个迭代器都维护一个独立的计数值。在每个迭代器方法的开始处检查自己改写操作的计数值是否与集合的改写操作计数值一致。如果不一致,抛出一个ConcurrentModificationException异常。

Collection接口中声明了许多用于对链表操作的有用方法。其中大部分方法都是在LinkedList类的超类AbstractCollection中实现的。例如,toString方法调用了所有元素的toString,并产生了一个很长的格式为[A,B,C]的字符串。可以使用contains方法检测某个元素是否出现在链表中。例如,如果链表中包含一个等于“Harry”的字符串,调用staff.contains(“Harry”)后将会返回true

链表不支持快速地随机访问。如果要查看链表中第n个元素,就必须从头开始,越过n-1个元素。没有捷径可走。 鉴于这个原因,在程序需要采用整数索引访问元素时,通常不选用链表。尽管如此,LinkedList类还是提供了一个用来访问某个特定元素的get方法:

LinkedList<String> list = ...;
String obj = list.get(n);

注意:get方法做了微小的优化:如果索引大于size()/2就从列表尾端开始搜索元素。

列表迭代器接口还有一个方法,可以告之当前位置的索引。 实际上,由于Java迭代器指向两个元素之间的位置,所以可以同时产生两个索引:nextIndex方法返回下一次调用next方法时返回元素的整数索引;previousIndex方法返回下一次调用previous方法时返回元素的整数索引。这个索引只比 nextlndex返回的索引值小1。这两个方法的效率非常高,这是因为迭代器保持着当前位置的计数值。

使用链表的唯一理由是尽可能地减少在列表中间插入或删除元素所付出的代价。如果列表只有少数几个元素,就完全可以使用ArrayList 如果需要对集合进行随机访问,就使用数组或ArrayList,而不要使用链表。

数组列表

List 接口用于描述一个有序集合,并且集合中每个元素的位置十分重要。 有两种访问元素的协议:一种是用迭代器,另一种是用getset方法随机地访问每个元素。后者不适用于链表,但对数组却很有用。集合类库提供了ArrayList类,这个类也实现了List接口。ArrayList封装了一个动态再分配的对象数组。

在需要动态数组时,可能会使用Vector类。因为Vector类的所有方法都是同步的。但是,如果由一个线程访问Vector,代码要在同步操作上耗费大量的时间。ArrayList方法不是同步的,因此,在不需要同步时使用ArrayList,而不要使用Vector

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL高级篇——索引的创建与设计原则

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 一、索引的分类与使用 1.1 索引的分类 1.1.1. 普通索引 1.1.2. 唯一性索引 1.1.3. 主键索引&#xff08;唯一非空&#xff09; 1.1.4…

百度ai智能写作工具-百度ai自动写文章

百度AI智能写作工具&#xff1a;让创作更快捷、高效&#xff01; 在当今竞争激烈的文化创意市场中&#xff0c;创作一篇高质量的文章需要投入大量时间和精力。然而&#xff0c;有了百度AI智能写作工具&#xff0c;创作变得更快捷、高效了。 百度AI智能写作工具采用最先进的人…

数据可视化神器!Matplotlib Python教程 | 从入门到精通绘制各种类型的图形和保存图形

大家好&#xff0c;我是爱吃熊掌的鱼&#xff0c;今天我要给大家带来一篇有趣开朗的Matplotlib Python教程。Matplotlib是Python中最流行的数据可视化库之一&#xff0c;它可以帮助我们将数据转化为易于理解的图表和图形。无论你是初学者还是专业人士&#xff0c;Matplotlib都是…

ThreadPoolExecutor源码阅读流程图

1.创建线程池 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), def…

巧用千寻位置GNSS软件| 线路施工放样应用技巧

线路施工放样主要是解决线路工程和水利工程施工中&#xff0c;线路及渠道中线和边坡施工放样编辑的专用程序。千寻位置GNSS软件中完成线路施工放样可按照下述步骤操作。 点击【测量】->【线路施工放样】&#xff0c;选择一条线路放样&#xff0c;如图 5.6-1所示。 图 5.6-1…

IT人员选择光缆的五大原因

基于铜和光纤的信号都会受到衰减&#xff0c;或者波形信号随着距离的推移而减弱。然而&#xff0c;光纤电缆可以在更长的距离上传输数据。事实上&#xff0c;差异是巨大的。 当构建需要长距离、高速和/或高带宽连接的网络时&#xff0c;毫无疑问&#xff1a;光纤电缆会赢得胜利…

在更高的起点创业 专访Aqara重庆服务商,探问「经营秘籍」

从小众产品到大众选择&#xff0c;智能家居在短短几年内迅速崛起&#xff0c;成为各大Shopping Mall的引流神器。而作为一种新消费&#xff0c;智能家居产品也为品牌和渠道在获客方面提出了新的考验。相比传统建材&#xff0c;智能家居如何快速引流&#xff0c;促进成交&#x…

【MySQL】如何使用MySQL锁(全局锁、表级锁、行级锁)?

文章目录 概述一、全局锁介绍语法特点 二、表级锁介绍表锁元数据锁意向锁 三、行级锁介绍行锁间隙锁&临键锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xf…

怎么把avi文件转换成mp4视频格式,4个高能方法

怎么把avi文件转换成mp4视频格式&#xff1f; 当您下载到avi格式的视频文件时&#xff0c;您可能会选择将其转换为MP4格式的文件。 avi是一种由微软开发的多媒体容器格式&#xff0c;尽管现在已经被认为是老旧的技术&#xff0c;但由于其简单易懂的开发API和Windows的通用性&am…

状态机编程

//定义的枚举 typedef enum { KEY_UP 1, //按键按下 Edge_Lead2, //前沿抖动 KEY_DOWN 3, //按键松开 Edge_Back4, //后沿抖动 } KEY_Status; 主函数&#xff1a; #include "stm32f4xx.h" #include "led.h" #include "delay.h" #include "…

JavaScript—javaEE

文章目录 1.关于JavaScript2.引入的方式3.输入输出4.语法4.1变量4.2基本数据类型4.3运算符4.4数组4.5函数4.6对象 5.dom5.1获取元素5.2操作元素5.3表单控件5.4样式&#xff1a;style属性5.5模仿和服务端交互 6.ajax6.1概念6.2作用6.3Ajax代码6.4Ajax发get请求6.5Ajax发post请求…

学成在线笔记+踩坑(4)——【媒资管理模块】上传图片,Nacos+Gateway+MinIO

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 1. 媒资管理模块简介 1.1 模块介绍 1.2 业务流程 1.2.1 上传课程图片 1.2.2 上传视频 1.2.3 处理视频 1.2.4 审核媒资 1.2.5 绑定媒…

Redis原理

Redis原理 数据结构 动态字符串SDS Redis中key是字符串&#xff0c;value是字符串或字符串集合。不过redis没有直接使用C语言的字符串。因为C中字符串存在问题&#xff1a;①获取字符串长度需要运算②非二进制安全③不可修改。 //c语言&#xff0c;声明字符串&#xff1a; …

字节岗位薪酬体系曝光,看完感叹:不服真不行

曾经的互联网是PC的时代&#xff0c;随着智能手机的普及&#xff0c;移动互联网开始飞速崛起。而字节跳动抓住了这波机遇&#xff0c;2015年&#xff0c;字节跳动全面加码短视频&#xff0c;从那以后&#xff0c;抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节…

媒体宣传的优势与重要性

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传日益成为企业和品牌宣传推广的重要手段&#xff0c;媒体的宣传报道更有权威性&#xff0c;能够帮助品牌进行背书&#xff0c;更有权威性&#xff0c;另外媒体的报道在搜索引擎中…

智能文案改写工具-智能改写工具免费

智能写作机器人 智能写作机器人&#xff0c;这是一种让人类写作变得更加简单的创新技术。它的出现&#xff0c;为内容生产领域带来了巨大的进步&#xff0c;不仅提高了人们的写作效率&#xff0c;还让优质的内容更容易被产生和共享。现在&#xff0c;让我们来了解一下智能写作…

Windows环境下NVM安装后Node/NPM命令无法使用

问题&#xff1a;Windows环境下安装nvm后&#xff0c;使用nvm安装node&#xff0c;无法使用node相关命令。 解决方案&#xff1a;注意安装的时候有两个路径&#xff0c;第一个是nvm所在的路径&#xff0c;第二个是nodejs所在的路径&#xff0c;大家需要在对应的目录下找到路径…

Python爬虫实战——获取电影影评

Python爬虫实战——获取电影影评 前言第三方库的安装示例代码效果演示结尾 前言 使用Python爬取指定电影的影评&#xff0c; 注意&#xff1a;本文仅用于学习交流&#xff0c;禁止用于盈利或侵权行为。 操作系统&#xff1a;windows10 家庭版 开发环境&#xff1a;Pycharm Co…

Linux嵌入式uboot使用tftp网络启动加载zImage、设备树

文章目录 一、前言二、Linux U-boot 相关命令&#xff08;1&#xff09;help 命令&#xff08;2&#xff09;printenv 命令&#xff08;3&#xff09;setenv 函数&#xff08;4&#xff09;saveenv 函数 三、tftp启动linux内核步骤&#xff08;1&#xff09;进入u-boot模式&…

vue:生成二维码 qrcode、vue-qr(二维码中间可带logo)

一、方法一 qrcode qrcode - npm 1.1、安装 yarn add qrcode 1.2、页面引入 import QRCode from qrcode; 1.3、方法里边使用 getQRCodeUrl(){ QRCode.toDataURL(hello world,{color: {dark:"#010599FF",light:"#FFBF60FF"}}).then((url) > {// 获…
最新文章