List那些坑

        很多文章都介绍过这些坑,本文做个记录,并提供解决方案。

1.Arrays.asList的坑

 1.1现象

        情况1:通过Arrays.asList方法生成的List数据不支持添加操作

        使用Arrays.asList方法生成的List数据,不能对其进行删除或者添加操作。代码示例如下:

    public static void main(String[] args) {List<String> newList = Arrays.asList("1", "2");newList.add("3");}

        报错信息如下:

Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at com.yangsh.meal.utils.ListUtils.main(ListUtils.java:15)

结论1:通过Arrays.asList方法生成的List数据不支持添加操作

        情况2:通过Arrays.asList方法生成的List数据受原数组影响

    public static void main(String[] args) {String[] arrays = new String[]{"1","2","3"};List<String> newList = Arrays.asList(arrays);System.out.println(newList);arrays[2] = "4";System.out.println(newList);}

        打印内容如下:

[1, 2, 3]
[1, 2, 4]

结论2:通过Arrays.asList方法生成的List数据受原数组影响,原数组改变后,新生成的List数据也会有同样的改变

1.2 解决方案

本文提供一个数组生成List的方法,方法如下:

package com.yangsh.meal.utils;import java.util.ArrayList;
import java.util.List;/*** @author jzhou* @DESC 数组工具类* @date 2023/12/24 17:39*/
public class ArraysUtils {public static <T> List<T> asList(T[] a) {List newList = new ArrayList<>(a.length);for (int i = 0; i < a.length; i++) {newList.add(a[i]);}return newList;}
}

测试代码

    public static void main(String[] args) {String[] arrays = new String[]{"1","2","3"};List<String> newList = ArraysUtils.asList(arrays);System.out.println(newList);arrays[2] = "4";System.out.println("原数组修改,不影响新生成的List数据");System.out.println(newList);newList.add("5");System.out.println("新数组支持add操作");System.out.println(newList);}

打印信息如下:

[1, 2, 3]
原数组修改,不影响新生成的List数据
[1, 2, 3]
新数组支持add操作
[1, 2, 3, 5]

至此,问题得以解决。当然还有其它的方式,比如使用stream方式。

2. list.subList的坑

2.1现象

        先看代码和打印信息,代码如下:

    @Testpublic static void testSubList(){List<String> list = new ArrayList<>(5);list.add("1");list.add("2");list.add("3");List<String> subList = list.subList(1, 2);list.add("4");for (int i = 0; i < subList.size(); i++) {System.out.println(subList.get(i));}}

        打印信息:

Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1239)at java.util.ArrayList$SubList.size(ArrayList.java:1048)

结论:list使用subList方法,如果再操作list后,不能遍历subList生成的数据,否则报错。

2.2解决方案

        可以再写一个静态方法,代码如下:

    public static List newSubList(List list,int fromIndex,int toIndex){ArrayList<Object> subList = new ArrayList<>();for (int i = 0; i < list.size(); i++) {if(i >= toIndex){ return subList; }if(i >= fromIndex){subList.add(list.get(i));}}return subList;}

        测试一下,打印信息如下:

至此问题解决。

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

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

相关文章

申请虚拟VISA卡Pokepay 教程来了

官网地址https://www.pokepay.cc/ ​​​​​ 填写邮箱地址 填写邀请码116780 会有20USD开卡优惠券 限时几天活动

Arduino/Android 蓝牙通信系统设计解决方案

随着当今安全管理的发展需求以及国家对安全监控行业的支持&#xff0c;这几年&#xff0c;安全监控行业发展迅猛&#xff0c;各类监控系统百花齐放。传统的温度监控系统通过有线或其他方式传送温度数据&#xff0c;而本文提出了利用蓝牙无线传输数据的设计方案&#xff0c;这种…

7_js_dom编程入门1

Objective&#xff08;本课目标&#xff09; 掌握获取页面元素的常用方法 掌握事件触发案例 能够区分innerText和innerHTML的区别 综合案例训练 1 DOM 介绍 1.1 什么是DOM 文档对象模型&#xff08;Document Object Model&#xff0c;简称DOM&#xff09;&#xff0c;是 …

单集群400TB,OceanBase稳定支撑快手核心业务场景

一款日均超过千万人访问的短视频 App 快手&#xff0c;面对高并发流量如何及时有效地处理用户请求&#xff1f;通过在后端配置多套 MySQL 集群来支撑高流量访问&#xff0c;以解决大数据量存储和性能问题&#xff0c;这种传统的 MySQL 分库分表方案有何问题&#xff1f;快手对分…

python 通过opencv及face_recognition识别人脸

效果&#xff1a; 使用Python的cv2库和face_recognition库来进行人脸检测和比对的 0是代表一样 认为是同一人。 代码&#xff1a; pip install opencv-python pip install face_recognition# 导入cv2库&#xff0c;用于图像处理 import cv2 # 导入face_recognition库&#…

关于发票和增值税相关的知识点

关于发票和增值税相关的知识点 问答(Q&A)1、发票的种类有哪些&#xff1f;2、增值税专用发票和增值税普通发票有什么区别&#xff1f;3、增值税怎么计算&#xff1f; 点击进入 易舟云财务软件 官网&#xff01; 问答(Q&A) 1、发票的种类有哪些&#xff1f; 发票的种类主…

SpringBoot 3.2.0 基于Logback定制日志框架

依赖版本 JDK 17 Spring Boot 3.2.0 工程源码&#xff1a;Gitee 日志门面和日志实现 日志门面&#xff08;如Slf4j&#xff09;就是一个标准&#xff0c;同JDBC一样来制定“规则”&#xff0c;把不同的日志系统的实现进行了具体的抽象化&#xff0c;只提供了统一的日志使用接…

渗透测试 | 信息收集常用方法总结

目录 一、关于域名 1.子域名收集 a.搜索引擎查找 b.在线查询 c.工具 d.SSL/TLS证书查询 2.端口型站点收集 3.目录文件扫描 a.目录扫描工具 b.github搜索 c.google搜索 d.在线网站 e.文件接口工具 4.旁站和C段 a.旁站查询 b.C段查询 5.网站技术架构信息 a.基础…

Django(三)

1.快速上手 确保app已注册 【settings.py】 编写URL和视图函数对应关系 【urls.py】 编写视图函数 【views.py】 启动django项目 命令行启动python manage.py runserverPycharm启动 1.1 再写一个页面 2. templates模板

STM32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件

资料下载: https://download.csdn.net/download/vvoennvv/88658447 一、概述 关于IAP的原理和Ymodem协议&#xff0c;本文不做任何论述&#xff0c;本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级&#xff0c;以及bootloader和主程序两个工程的配置…

CAS-Unsafe类底层汇编源码分析

源码分析&#xff1a; 底层汇编&#xff1a; cmpxchg底层&#xff1a;cmpxchg即比较并交换指令 总结&#xff1a; CAS是靠硬件实现的从而在硬件层面提升效率&#xff0c;最底层还是交给硬件来保证原子性和可见性实现方式是基于硬件平台的汇编指令&#xff0c;在inter的CPU中&a…

Swagger快速入门

1、Swagger快速入门 1.1 swagger介绍 官网&#xff1a;https://swagger.io/ Swagger 是一个规范和完整的Web API框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 功能主要包含以下几点: A. 使得前后端分离开发更加方便&#xff0c;有利于团队协作…