java class list_详解Java 集合类 List 的那些坑

现在的一些高级编程语言都会提供各种开箱即用的数据结构的实现,像 Java 编程语言的集合框架中就提供了各种实现,集合类包含 Map 和 Collection 两个大类,其中 Collection 下面的 List 列表是我们经常使用的集合类之一,很多的业务代码都离不开它,今天就来看看 List 列表的一些坑。

第一个坑:Arrays.asList 方法返回的 List 不支持增加、删除操作

例如我们执行以下代码:

List strings = Arrays.asList("m", "g");

strings.add("h");

会抛出 java.lang.UnsupportedOperationException 异常,此时你内心 OS what?明明返回的 ArrayList 为啥不能往里面增加元素,这以后还能好好的增加元素吗? ,然后果断开启 Debug 大法:

5bf47016b1449384e1b5271d0a01c486.png

发现返回的 ArrayList 并不是我们常用的 java.util.ArrayList ,而是 Arrays 的内部类 java.util.Arrays.ArrayList 。进入方法 Arrays.asList 源码如下:

public static List asList(T... a) {

return new ArrayList<>(a);

}

方法返回的是 Arrays 的静态内部类 java.util.Arrays.ArrayList ,该类虽然和 java.util.ArrayList 也继承自抽象类 java.util.AbstractList ,但是通过该类的源码发现它并没有对抽象父类 AbstractList 的 add 方法默认就是抛出 java.lang.UnsupportedOperationException 异常。

c725f0c4542580c1d82e0950749793c4.png

这个坑的根本原因是我们调用返回的 strings 的 add 方法是继承自抽象父类的 add 方法,而抽象父类的方法默认就是抛出 java.lang.UnsupportedOperationException 这个异常。

第二个坑,Arrays.asList 方法返回的新 List 和该方法原始入参数组修改会相互影响

Arrays.asList 方法除了上面这个 不支持增加、删除元素 这个坑之外,还有另外一个坑:

33e3152aac593d0cb7f357a4c0733b3e.png

从以上代码可以发现,对原始数组的修改会影响我们通过 Arrays.asList 方法获得的新 List ,深入 java.util.Arrays.ArrayList 的源码:

private static class ArrayList extends AbstractList

implements RandomAccess, java.io.Serializable

{

private static final long serialVersionUID = -2764017481108945198L;

private final E[] a;

ArrayList(E[] array) {

a = Objects.requireNonNull(array);

}

...

}

可以发现是直接使用了原始的数组,所有当我们使用 Arrays.asList 方式获得的 List 时要特别注意,因为共享了数组,相互修改时可能产生一些意想不到的 Bug。标准的姿势之一是将其作为 ArrayList 构造方法的参数重新 new 一个 List 出来即可(e.g. List stringList = new ArrayList<>(Arrays.asList(arrays)) )或者通过 Guava 库中的 Lists.newArrayList ,将返回的新 List 和原始的数组解耦,就不会再互相影响了。

第三个坑,直接遍历 List 集合删除元素会报错

在直接遍历集合元素时增加、删除元素会报错,比如执行如下代码:

List stringList = Lists.newArrayList("m", "g", "h");

for (String s : stringList) {

if (Arrays.asList("m", "h").contains(s)) {

stringList.remove(s);

}

}

以上代码可以正常编译通过,但是执行时会抛出 java.util.ConcurrentModificationException 异常,查看其源码可以发现,删除元素方法 remove 会使集合结构发生修改,也就是 modCount( 集合实际修改的次数)会修改,在循环过程中,会比较当前 List 的集合实际修改的次数 modCount 与迭代器修改的次数 expectedModCount ,而 expectedModCount 是初始化时的 modCount , 二者不相等,就会报 ConcurrentModificationException 异常。解决方法主要有两种方式,1.使用 ArrayList 的迭代器方式遍历,然后调用其中的方法。2.在 JDK 1.8+ 可以使用 removeIf 方法进行删除操作。

最后扎心一问:调用 ArrayList 的 remove 方法传入 int 基本类型的数字和 Integer 包装类型的数字,执行结果是不是一样的?

到此这篇关于详解Java 集合类 List 的那些坑的文章就介绍到这了,更多相关Java List集合类坑 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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

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

相关文章

中文转数字 java_java将阿拉伯数字转换为中文数字

1.转换为大写中文数字&#xff0c;即钱的金额&#xff0c;http://blog.csdn.net/billfranck/article/details/4470898http://www.cnblogs.com/hongten/p/hongten_java_money.html2.转换为小写中文数字&#xff0c;原文http://www.cnblogs.com/lf6112/archive/2010/09/02/181625…

java scanner类 构造器_java – 不能使用Scanner类,构造函数未定义,方法未定义

问题是你还要声明一个名为Scanner的类.这意味着当你然后声明一个Scanner类型的变量并尝试调用构造函数时,编译器会认为你在谈论你的类.只需将您自己的类更改为其他类(例如Test)&#xff1a;import java.util.Scanner;public class Test {public static void main(String[] args…

java 类加载 双亲委派_Java类加载器和双亲委派机制

前言之前详细介绍了Java类的整个加载过程(类加载机制详解)。虽然&#xff0c;篇幅较长&#xff0c;但是也不要被内容吓到了&#xff0c;其实每个阶段都可以用一句话来概括。1)加载&#xff1a;查找并加载类的二进制字节流数据。2)验证&#xff1a;保证被加载的类的正确性。3)准…

java开源服务框架_Java框架服务

Java从诞生到现在&#xff0c;一路飙升&#xff0c;可以说红遍全球&#xff0c;红到发紫。随着Java的流行&#xff0c;促生了许多java框架&#xff1a;Spring、WebWork、Struts、HIbernate、JDiy、JFinal、Quartz、Velocity、IBATIS、Compiere ERP&CRMSpring Framework【Ja…

java项目导入不了怎么办_Myeclipse导入项目无法部署或者丢失了.setting文件夹怎么办...

1、进入项目目录&#xff0c;找到.project文件&#xff0c;打开。2、找到代码段修改为该项目名称。3、用Myeclipse新建一个web项目&#xff0c;并将其生成的.setting文件夹拷贝到该项目目录下&#xff0c;有如下几个文件&#xff1a;.jsdtscopeorg.eclipse.jst.common.project.…

long转string mybatis_Spring+Mybatis类型转换的问题,oracle数据库中有一个clob类型,怎样在查询以后转换为String类型?...

展开全部首先你的思路就错的&#xff0c;不可能转换成string把大对象读进byte[]public byte[] function(Connection connection,所需参数) throws EMPException{PreparedStatement ps null;ResultSet rs null;byte[] data null;try {.....省略while (rs.next()) {oracle.sql…

mysql union null_mysql – 删除SQL中的SQL JOIN和UNION操作符中的NULL值

[求助]如何仅在字段provider_order中删除NULL值,在我的情况下,表使用JOIN表和UNION这是我的数据库模式和我的SQL查询为了清楚地描述这里我附上图片最佳答案 您不能仅删除行中的该字段.但是,只需使用WHERE子句过滤掉具有空值的记录,就可以摆脱整行.SELECTm.provider_id,m.provid…

win10开发java_win10系统搭建Java开发环境的操作方法

很多小伙伴都遇到过对win10系统搭建Java开发环境进行设置的困惑吧&#xff0c;一些朋友看过网上对win10系统搭建Java开发环境设置的零散处理方法&#xff0c;并没有完完全全明白win10系统搭建Java开发环境的操作方法非常简单&#xff0c;只需要1、双击运行jdk-8u60-windows-x64…

jsp java el表达式_jsp相关笔记,el表达式、jsp标签库(jstl)

一、jsp基础部分1、介绍概念JSP(Java Server Page)&#xff0c;java服务器端页面&#xff0c;可以定义html标签&#xff0c;又可以定义java代码。原理JSP本质上就是一个Servlet2、JSP定义Java代码的方式&#xff1a;定义的java代码&#xff0c;在service方法中。service方法中可…

cstring越界_char*、WCHAR*、vc8中的CString

在vc6中喜欢用CString&#xff0c;因为它用起来方便&#xff0c;可以容易地进行字符串赋值&#xff0c;复制&#xff0c;格式化&#xff0c;甚至相加&#xff0c;然而到了vc8中&#xff0c;这些操作似乎都不能用了。连CString str "Hello World!"&#xff1b;都会报…

java cms bootstrap_thinkcms: Java CMS系统,完善的后台功能,大气的前台页面. 使用springMVC,hibernate,bootstrap,amazeui....

#thinkcmsJava CMS系统&#xff0c;完善的后台功能&#xff0c;大气的前台页面主要技术springmvc-mvc控制层shiro-方便全面的安全控制框架hibernate-orm框架ehcache-缓存框架前端&#xff1a;jquery&#xff0c;bootstrap&#xff0c;amazeui拉完代码将maven相关包拉下来&#…

java 不允许默认构造_java – 如何使用ObjectMapper去除/序列化不可变对象而不使用默认构造函数?...

我想使用com.fasterxml.jackson.databind.ObjectMapper对不可变对象进行序列化和反序列化。不可变类看起来像这样(只有3个内部属性&#xff0c;getter和constructor)&#xff1a;public final class ImportResultItemImpl implements ImportResultItem {private final ImportRe…

java方法不可覆盖_详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了.......

一看Think in Java&#xff0c;遇到个程序classEgg2 {protected classYolk {publicYolk() {System.out.println("Egg2.Yolk()");}public voidf() {System.out.println("Egg2.Yolk.f()");}}private Yolk y newYolk();publicEgg2() {System.out.println(&qu…

有人去瑞幸咖啡java_瑞幸股价暴跌,门店竟然爆单了

本文首发于“全天候科技”作者姚心璐。欢迎下载“见闻VIP”&#xff0c;即时见证历史。昨晚至今&#xff0c;有人被瑞幸疯狂打了1.8折&#xff0c;有人疯狂用1.8折券买入瑞幸咖啡。是不是看上去很迷&#xff1f;这的确是冰火两重天一样的真实存在。4月2日&#xff0c;瑞幸自曝2…

我的世界java版做船_“不要在云了,船的合成用木铲?”我的世界:Java和基岩版的差异...

“不要在云了&#xff0c;你这个云玩家&#xff01;”不知道你没有没有因为某些原因被网友说成是MC的云玩家&#xff0c;我就听到过一个很冤枉的故事。一个已经玩了5年之久的基岩版玩家&#xff0c;被一个玩了一年Java版的玩家硬生生说成是一个云玩家&#xff0c;重点不是这&am…

mysql 5.5免安装配置_mysql的参考文档mysql5.5.21免安装版的配置方法

mysql的5.5版本(与5.1版本有所区别)中my.ini文件的内容。在mysql根目录里新建my.ini文件&#xff0c;用阅读器打开(加入如下内容)[client]#password your_passwordport 3306socket /tmp/mysql.sockdefault-character-setutf8[mysqld]port 3306socket /tmp/mysql.sockskip-…

appium java 点击事件_java – 无法使用Appium在Android中的权限对话框中单击“允许”按钮...

我无法使用AppiumJava在Android的权限对话框中点击“拒绝”或“允许”按钮.在点击这些按钮之前,是否需要添加任何功能&#xff1f;以下是代码&#xff1a;DesiredCapabilities capabilities new DesiredCapabilities();capabilities.setCapability("platformName", …

java线程interu_Intel 10nm服务器U首曝:多线程性能提升118%

Intel 10nm Ice Lake已经应用在轻薄本平台上&#xff0c;当时频率先天不足&#xff0c;而且只能做到4核心&#xff0c;不得不同时祭出14nm Comet Lake予以辅助&#xff0c;而在游戏本、桌面上也不得不继续依赖14nm Comet Lake。根据路线图&#xff0c;服务器平台上Intel今年会先…

java面板换一个斜的圆形_java – 如何从底部设计圆形视图?

我想设计一个从底部是圆形的视图,请看图像I have try different way to design, Like XML, Programatically but I am not able to get any success. I use XML code it’s doing circle from bottom but when I use Any image or Banner slider as show in figure then it’s …

K8S学习指南(38)-k8s权限管理对象 Group

文章目录 引言Group基本概念1. Group是什么&#xff1f;2. Group的作用3. 与用户的关系 Group的创建方式1. 手动创建Group2. 用户创建Group Group示例演示步骤一&#xff1a;创建Group步骤二&#xff1a;创建Role和RoleBinding步骤三&#xff1a;验证Group权限 结论 引言 在Ku…