关于Java Collections应知应会

npm报错 npm WARN deprecated....的问题解决方式 报错 :npm WARN deprecated … 现象:无法进行有效的vue项目的部署以及npm install 命令的执行。 原因一:版本问题 说明:由于npm的版本过低或者过高导致的报错 检查版本: npm -v 如果版本是比较旧的,或者是最新的,这里可以进行对npm的更新和回退。 更新npm版本: npm updated -d 查看可以更新的版本 npm install -g npm 默认安装最新版本 安装回退指定的版本: npm updated -d 查看所有的版本 npm -g i. 阅读详情

翻译 By Long Luo

下面这些问题Stackoverflow上关于Java collections提问和讨论最多的问题。在你阅读这些问题之前,有必要先阅读下这篇文章3分钟速读:图解Java Collections的接口以及类层级关系。

1. 什么时候用LinkedList?什么时候用ArrayList?

ArrayList本质上是一个数组。它的元素可以直接通过索引值直接访问。但是如果数组已经满了,那么需要重新分配一个更大的数组并且将全部的元素移动到新的数组需要花费O(n)的时间。当然从现有的数组中增加或者删除一个元素都需要移动现有的元素。这个可能是使用ArrayList中最大的不便之处。

LinkedList是一个双端链表。正因为如此,如果要获取一个链表中间的元素,需要从链表的头部开始查找。另一方面,增加或者删除链表中的元素将会很快,因为只需要在本地修改即可。

下表总结了最快情况下的比较需要耗费时间:

Method Arraylist LinkedList
get(index) O(1) O(n)
add(E) O(n) O(1)
add(E, index) O(n) O(n)
remove(index) O(n) O(n)
Iterator.remove() O(n) O(1)
Iterator.add(E) O(n) O(1)

不管运行时间,当大型列表需要额外考虑内存占用。LinkedList每个node至少需要2个额外的指针用于连接前后2个node。而在ArrayList中只需要数组存储元素值即可。

2. 当遍历容器时,高效等价于移除元素的操作?

最正确的方式就是在遍历容器时用Iterator.remove()去修改一个容器,如下代码所示:

Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
// do something
itr.remove();
}

另外一个非常高频的使用但是不正确的代码是这样的:

for(Integer i: list) {
list.remove(i);
}

运行上面的代码时你会得到一个ConcurrentModificationException。原因是因为一个迭代器自生成之后(在for循环中),用于横贯这个列表。与此同时,这个列表同时也被Iterator.remove()修改了。在Java语言中,当一个线程在修改一个容器时而另外一个线程在遍历它是不允许的。

3. 如何将List转换成int[]?

最快捷的方式可能是用Apache Commons Lang库中的ArrayUtils。

int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

在JDK中,没有快捷方式。请注意你不能使用List.toArray(),因为那会将列表转换成Integer[]。正确的方式应该是这样的:

int[] array = new int[list.size()];
for(int i=0; i < list.size(); i++) {
array[i] = list.get(i);
}

4. 如何将int[]转换成List?

最快捷的方式可能是用Apache Commons Lang库中的ArrayUtils,如下所示:

List list = Arrays.asList(ArrayUtils.toObject(array));

JDK中,同样没有快捷方式:

int[] array = {1,2,3,4,5};
List<Integer> list = new ArrayList<Integer>();
for(int i: array) {
list.add(i);
}

5. 过滤一个容器最佳方式是什么?

你可以使用第三方包,比如Guava或者Apache Commons Lang来填充这个功能,他们都提供了一个filter()方法(in Collections2 of Guava and in CollectionUtils of Apache)。filter()方法会返回一个预先判断的元素。

JDK中,实现就会困难多了。一个好消息是Java 8中,会加入断言。但是现在,你必须使用迭代器用于遍历整个容器。

Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
int i = itr.next();
if (i > 5) { // filter all ints bigger than 5
itr.remove();
}
}

当然你也可以模仿Guava或者Apache的实现方式去实现,通过引入一个新的Predicate接口。大部分高级开发者会这样做。

public interface Predicate<T> {
boolean test(T o);
}

public static <T> void filter(Collection<T> collection, Predicate<T> predicate) {
if ((collection != null) && (predicate != null)) {
Iterator<T> itr = collection.iterator();
while(itr.hasNext()) {
T obj = itr.next();
if (!predicate.test(obj)) {
itr.remove();
}
}
}
}

你可以使用下面的代码去过滤一个容器:

filter(list, new Predicate<Integer>() {
public boolean test(Integer i) {
return i <= 5;
}
});

6. 什么是将一个列表转换成Set最轻松方式?

有2种方法都可以做到,取决于你如何定义相等。第一种方法是将一个列表放入HashSet中,然后通过hashCode()去识别进行复制。在大部分情况下,可以正常运行。但是如果你需要指定一种比较方式的话,当你可以定义你自己的比较器的话你需要使用第二种方法。

Set<Integer> set = new HashSet<Integer>(list);
Set<Integer> set = new TreeSet<Integer>(aComparator);
set.addAll(list);

7. 如何将ArrayList中重复的元素移除?

这个问题和上一个问题非常有关系。

如果你不关心ArrayList中元素的顺序,聪明的方式是将列表放入set中,用于移除重复的元素,然后重新移回list中。代码如下所示:

ArrayList** list = ... // initial a list with duplicate elements
Set<Integer> set = new HashSet<Integer>(list);
list.clear();
list.addAll(set);

如果你不关心顺序,在标准JDK中,你可以将列表放入LinkedHashSet中,那样元素顺序不变。

8. 容器排序

Java语言中,对容器排序有好几种方法。所有的方法都是基于容器的姿容顺序或者特定的比较器。自然顺序下,你也需要去实现元素的比较接口。

Collections.sort()可以遍历列表。javadoc中说明了这种排序是稳定的,同时性能是nlog(n)。

PriorityQueue提供了一个排好序的队列。PriorityQueue和Collections.sort()的不同点在于,PriorityQueue一直都维持着一个排好序的队列,但是你只能从队列中获取到头结点。你不可以随机获取其内部元素,比如使用PriorityQueue.get(4)。

如果在容器中不存在重复,TreeSet是另外一个选择。和PriorityQueue一样,在生命周期内都维持着排好序的set。你可以从TreeSet中获取到最低和最高的元素,但是你仍然不能随机访问其元素。

简单来说, Collections.sort()只是一个临时的排好序列表。PriorityQueue和TreeSet始终是排好序的,但是代价就是不能通过索引访问其元素。

9. Collections.emptyList() vs new instance

这个问题同样适用于比较emptyMap()和emptySet()。

2个方法都会返回一个空的列表,但是 Collections.emptyList()返回了一个不变的列表。这意味着你不可以忘空的列表中增加新的元素。在此背景下,每次Collections.emptyList()调用实际上并不会创造一个空表的实例。同时,它会服用已存在的空的实例。如果你对设计模式的Singleton熟悉的话,你会明白我说的意思。如果你频繁调用的话,会有更好的性能。

10. Collections.copy

有2种方法可以实现复制源列表到目的列表。一种方法是使用ArrayList的构造器:

ArrayList<Integer> dstList = new ArrayList<Integer>(srcList);

另外一种方法是使用Collections.copy()。注意第一行,我们首先分配了一个列表,这个列表最少长度就是目的列表长度。按照javadoc稳定,目的列表最少也是源列表长度。

ArrayList<Integer> dstList = new ArrayList<Integer>(srcList.size());
Collections.copy(dstList, srcList);

2种方法都市浅拷贝,那么这2种方法的不同点在哪里?

首先,Collections.copy()不会重新分配目的列表的容量,即使目的列表没有足够的空间去容纳全部的源列表。当然,会抛出IndexOutOfBoundsException异常。你可能会问这样做的好处是什么?原因之一就是可以保证方法可以在线性的时间内跑完,同时当你想复用数组而不是重新在ArrayList中分配出一个新列表来的更加合适。

Collections.copy()只能用于列表,但是ArrayList的参数可以是容器类,所以应用更广泛。

以上!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf 作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo... 立即下载

相关推荐

从零开始玩转机械臂:用Matlab+Robotics Toolbox实现四自由度机械臂运动仿真

本文详细介绍了如何利用Matlab及其Robotics Toolbox工具箱,从零开始构建并仿真一个四自由度机械臂。通过D-H参数建模、正向运动学验证、交互式操控以及轨迹规划等实践步骤,帮助初学者在虚拟环境中直观理解机器人运动学核心概念,为后续硬件实现奠定坚实基础。

weixin_29055699的博客 324

Java必知必会-基础篇

《Java必知必会》是一档专为Java学习者设计的专栏,旨在帮助读者系统地掌握Java编程语言的核心知识,从基础语法到高级特性,从理论应用到实战演练,一站式解决你的Java学习难题

制定持续可量化的目标,不断坚持。 1627

从“氛围编程“到“智能体工程“:AI编程范式的认知跃迁与工程实践

摘要: 2026年,ClaudeCode负责人鲍里斯·切尔尼提出用“智能体工程”(Agent Engineering)替代流行的“氛围编程”(Vibe Coding),认为后者过于主观,无法体现AI编程的系统化与工程化本质。智能体工程强调记忆系统、工具编排、任务分解、可观测性等核心技术,将AI编程从“玄学辅助”升级为可度量、可规模化的工程学科。本文通过对比术语差异、构建知识体系,并结合代码实例(如带记忆系统的代码生成Agent和可观测性系统),展示了智能体工程的实际应用。行业案例(如ClaudeCode的并

yyq916的博客 1060

Java基础38个必会知识点,你知道几个?

做Java培训很多年了,也面试过很多Java工程师,总的来说,大家对java基础知识的掌握普遍不大好,如果你觉得自己的技术很强,基础很好,可以划走这篇文章啦~如果你是初学者或者是最近需要面试的同学,可以仔细的看一下这篇文章,小源根据实际项目工作需要,并参考了大厂面试的高频问题,汇总整理了38个必会的基础知识点,送给有需要的同学。第一,面向对象、基础。包括面向对象和面向过程的区别,对象和类的关系,类的特性等等。这些知识点呢,是小源精心挑选出来的,对于构建知识体系,我认为是不可或缺的一些点。

好程序员IT教育 244

使用PLINK做GWAS(2)

利用PLINK对单基因控制的性状进行定位,之前一篇文章粗滤的记录了一下使用PLINK的命令,本次博客主要记录一下如何根据SNP芯片的数据制作PLINK的格式,以及分析的步骤,最后数据的可视化。 首先,有的公司给的新片的数据就是一个excel表格,列表示的是样品,行表示的是基因型,基因型用ATCG构成,当然有的基因型是用数字0或者1表示的。下面我拿到的一个数据是15个样品构成的基因型,有13个样品是突变体,2个样品是野生型。 格式如下: 第二步:将此基因型存成csv文件,使用R进行读取,在R中制作pl

samhuairen的专栏 2921

形位公差标注的常见误区与优化策略

本文深入解析机械设计中形位公差标注的常见误区与优化策略,特别针对NX2406用户提供实用技巧。从标注冗余、基准选择到公差值设定等五大误区入手,结合工程图实例展示如何提升标注精度与效率,帮助工程师避免常见错误,优化设计流程,确保零件功能实现与制造可行性。

info6的博客 244

java 语言学习应知应会

java.awt,java.swing,javax.swing,java.event 等包用于图形编程用的包。java.io 包,这个包是用于输入输出操作的 java.net 包,JAVA_HOME,指明 JDK 安装的位置,CLASSPATH,指明类文件的位置,PATH,指明命令的可执 行。JDK,java 开发工具包(类库和运行命令),JRE,java 运行环境,JVM,java 虚拟机(解释。java 程序的运行过程,首先是启动 java 虚拟机,然后就是去找.class 文件,先是从系统的 类。

hhappy0123456789的博客 183

QGIS基于快鸟(QuickBird)影像统计小麦种植面积

​01数据情况 本次选用某地4月份快鸟(QuickBird)影像为例,使用QGIS演示提取小麦播种情况,并按照200米*200米分区计算种植面积的过程。 注:本文对应的操作视频作为今天第二篇推送同时发布,习惯看视频的朋友可以点击观看。 附数据压缩包: 链接:https://pan.baidu.com/s/1JVUS8uAOR61RxC1n9Or9_w 提取码:qgis 含快鸟影像QB_subset.tif和200*200米分区矢量图层200Mgrid.shp。 ...

QGISClass的博客 1979

java基础知识点_Java基础知识点应知应会

前言本文快速回顾了Java中最基础的知识点,用作面试复习,事半功倍。说明参考文章http://how2j.cn/k/j2se-interview/j2se-interview-java/624.htmlhttps://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Java%20%E5%9F%BA%E7%A1%80.md基础知识点面向对象的特性...

weixin_39550410的博客 445

本体(Ontology)概述

认识本体        本体(Ontology)的概念源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体可以在语义层次上描述知识,可以看成描述某个学科领域知识的一个通用概念模型。德国学者Studer在1998年给出了本体的相关定义“本体是共享概念模型的形式化规范说明”。这个定义包含了四层含义:即共享(share)...

baijinswpu的博客 7万+

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

50条必背JAVA知识点(一)

6.Java中的名称命名规范:包名:多单词组成时所有字母都小写:xxxyyyzzz 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个 单词首字母大写:xxxYyyZzz常量名:所有字母都大写。Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的 boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false 用0表示。格式:java 类名。

ybigbear的博客 5638

Cadence PCB 仿真宝典【目录】

欢迎大家来到《Cadence PCB 仿真宝典》该专栏包括【入门篇】【提升篇】【技巧篇】【疑难篇】四个部分,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 3267

Java中Collections.sort()排序详解

java中Collections.sort排序详解java基础—— Collections.sort的两种用法,简单明了 。java List 排序 Collections.sort()Java 中 Comparable 和 Comparator 比较第一种:ComparableComparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Compa

薛瑄的博客 7万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中Collections类详细用法

1、sort(Collection)方法的使用(含义:对集合进行排序)。 例:对已知集合c进行排序? public class Practice { public static void main(String[] args){ List c = new ArrayList(); ...

南 墙 4万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA Collections类

JAVA Collections类中shuffle和sort方法的介绍

qq_53312143的博客 5362

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java:Collections的使用

java集合的核心接口及其实现类的简单使用,Collections工具类使用介绍

xike1024的博客 605

Java中的Collections类

Java中的Collections类Collections概述Collections类的常用方法1.将指定列表按升序排列2.反转指定列表中元素的顺序3.使用默认的随机源随机排列指定的列表测试: Collections概述 是针对集合操作的工具类。此类仅由静态方法组合或返回集合,静态方法可以直接通过类名调用。它包含对集合进行操作的多态算法,“包装器”,返回由指定集合支持的新集合,以及其他一些可能的和最终的。 Collections类的常用方法 1.将指定列表按升序排列 public static &l

qq_41571224的博客 5229

Collection 和 Collections 有什么区别?

Collection定义:Collection 是 Java 集合框架中的一个接口,表示一组对象的集合。它是所有集合类的父接口,为集合操作提供了基本的规范。性质:Collection 是一个抽象的概念,它定义了集合的基本操作,如添加、删除、遍历等。这些操作通过接口中的方法来实现,具体的集合类需要实现这些方法来提供具体的功能。定义:Collections 是 Java 提供的一个工具类,它包含了一系列对集合进行操作的静态方法。性质:Collections 不是一个接口,而是一个具体的类。

2401_87790788的博客 1490

java collections 用法_Java中Collections类详细用法

1、sort(Collection)方法的使用(含义:对集合进行排序)。例:对已知集合c进行排序?public class Practice {public static void main(String[] args){List c = new ArrayList();c.add("l");c.add("o");c.add("v");c.add("e");System.out.println(c...

weixin_29268267的博客 2913

JAVA之Collections集合

一、概念: 1、集合是接口,Collections是所有集合接口的父接口,它的子接口常用的有:Set、List、Map 2、Collections集合接口: 没有约束元素是否重复 定义了集合运算等基本行为 是集合的根接口 3、Set接口(对应于python中的set集合): 继承于Collections 元素不允许重复 元素无序排列 4、List接口(...

weixin_30379973的博客 433

Java基础——Collections

Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能;如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的。Book b5 = new Book(10004, “天龙八部”, 10.4, new GregorianCalendar(2011, 9,Book b5 = new Book(10004, “天龙八部”, 10.4, new GregorianCalendar(2011, 9,

2401_86963172的博客 1020

JAVA中的Collections 类

collections

2401_83377623的博客 973

Java之Collections工具类

Java之Collections工具类增加、排序操作查找、替换操作 增加、排序操作 常用方法有 import java.util.ArrayList; import java.util.Collections; public class CollectionTest01 { public static void main(String[] args) { ArrayList<Integer>list = new ArrayList<>();

HR的博客 2206

java的collections_Java 之 Collections 工具类

一、Collections 概述java.utils.Collections是集合工具类,用来对集合进行操作。Collections 是一个操作 Set、List 和 Map 等集合的工具类。Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法:二、常用方法public static boolean ad...

weixin_33278819的博客 2182

Java-Collections、Map

注意!!!集合和泛型都不支持基本类型,可以写包装类// 目标:掌握Map集合的特点。// Map体系整体特点:HashMap : 按照键,无序,不重复,无索引。值不做要求,键和值都可以是null// 多态 一行经典代码map.put("华为手表", 31);map.put("Java入门到跑路", 2);// 后面重复的键会覆盖前面整个数据!map.put("娃娃", 1);map.put("雨伞", 10);

sjdjjdkd的博客 933
上一篇: Java Array最重要的10个方法
下一篇: 掌握Java: HashMap
tcpipstack
博客等级 码龄14年 329粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值