前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >特殊的ArrayList类

特殊的ArrayList类

原创
作者头像
查拉图斯特拉说
修改2024-01-17 11:30:40
2610
修改2024-01-17 11:30:40
举报
文章被收录于专栏:后端架构

前言

今天载在我去写代码,进行一个字符串解析的时候,发现一个有意思的现象。一个特殊的数组类。因为当我觉得整个流程非常合理的时候运行就报错了,然后这一个章节主要是用来为什么会报错以及如何解决这个问题,然后从中可以得到什么帮助。

示例代码

这是我的示例代码。这段代码的主要作用是对一个文本进行一个解析。然后去传入一个数组,保持一定顺序的同时,是使每一个字符变得有意义。

代码语言:javascript
复制
    public static List<String> analysisFile(String authInfo) {
        List<String> properties = Arrays.asList(authInfo.split(" "));
        String indexFirst = properties.get(0);
        properties.set(0, indexFirst.substring(0, 1));
        properties.add(1, indexFirst.substring(1, indexFirst.length()));
        return properties.stream().filter(s -> StringUtils.isNotBlank(s)).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        String authInfo = "drwx------   33 op       op           4096 Jan 15 16:55 .";
        List<String> strings = analysisFile(authInfo);
        System.out.println(Json.getJsonFromObject(strings));
    }

异常输出

接着我就开始运行代码,也就提示了如下的异常。不可操作类型的异常,然后我就跟着异常的提示找到最近的代码块。

代码语言:javascript
复制
/Users/stevenchen/Library/Java/JavaVirtualMachines/openjdk-17.0.1/Contents/Home/bin/java -Dvisualvm.id=8040768673864 -javaagent:/Users/stevenchen/Applications/IntelliJ IDEA Ultimate.app/Contents/lib/idea_rt.jar=62131:/Users/stevenchen/Applications/IntelliJ IDEA Ultimate.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/stevenchen/work-repository/timeline-repository/monitoragent/agent/target/classes:/Users/stevenchen/.m2/repository/commons-io/commons-io/2.6/commons-io-2.6.jar:/Users/stevenchen/work-repository/timeline-repository/monitoragent/monitor-common/target/classes:/Users/stevenchen/.m2/repository/com/nogle/nogle-messaging/1.1.1/nogle-messaging-1.1.1.jar:/Users/stevenchen/.m2/repository/org/apache/activemq/activemq-client/5.15.9/activemq-client-5.15.9.jar:/Users/stevenchen/.m2/repository/org/apache/geronimo/specs/geronimo-jms_1.1_spec/1.1.1/geronimo-jms_1.1_spec-1.1.1.jar:/Users/stevenchen/.m2/repository/org/fusesource/hawtbuf/hawtbuf/1.11/hawtbuf-1.11.jar:/Users/stevenchen/.m2/repository/org/apache/geronimo/specs/geronimo-j2ee-management_1.1_spec/1.0.1/geronimo-j2ee-management_1.1_spec-1.0.1.jar:/Users/stevenchen/work-repository/timeline-repository/monitoragent/monitor/target/classes:/Users/stevenchen/work-repository/timeline-repository/monitoragent/monitor/lib/sigar-1.6.4.jar:/Users/stevenchen/.m2/repository/com/nogle/commons/network/4.1.0-SNAPSHOT/network-4.1.0-20200715.081627-16.jar:/Users/stevenchen/.m2/repository/net/openhft/chronicle-bytes/1.16.25/chronicle-bytes-1.16.25.jar:/Users/stevenchen/.m2/repository/net/openhft/chronicle-core/1.16.24/chronicle-core-1.16.24.jar:/Users/stevenchen/.m2/repository/com/intellij/annotations/12.0/annotations-12.0.jar:/Users/stevenchen/.m2/repository/org/pcap4j/pcap4j-core/1.6.2/pcap4j-core-1.6.2.jar:/Users/stevenchen/.m2/repository/net/java/dev/jna/jna/4.2.1/jna-4.2.1.jar:/Users/stevenchen/.m2/repository/org/pcap4j/pcap4j-packetfactory-static/1.6.2/pcap4j-packetfactory-static-1.6.2.jar:/Users/stevenchen/.m2/repository/org/pcap4j/pcap4j-packetfactory-propertiesbased/1.6.2/pcap4j-packetfactory-propertiesbased-1.6.2.jar:/Users/stevenchen/.m2/repository/com/nogle/commons/utils/4.1.0-SNAPSHOT/utils-4.1.0-20200715.081636-16.jar:/Users/stevenchen/.m2/repository/org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.jar:/Users/stevenchen/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/Users/stevenchen/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.11.0/jackson-databind-2.11.0.jar:/Users/stevenchen/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.11.0/jackson-annotations-2.11.0.jar:/Users/stevenchen/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.11.0/jackson-core-2.11.0.jar:/Users/stevenchen/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.11.0/jackson-dataformat-smile-2.11.0.jar:/Users/stevenchen/.m2/repository/com/fasterxml/jackson/module/jackson-module-afterburner/2.11.0/jackson-module-afterburner-2.11.0.jar:/Users/stevenchen/.m2/repository/joda-time/joda-time/2.9.9/joda-time-2.9.9.jar:/Users/stevenchen/.m2/repository/uk/co/real-logic/sbe-all/1.13.3/sbe-all-1.13.3.jar:/Users/stevenchen/.m2/repository/org/agrona/agrona/1.0.8/agrona-1.0.8.jar:/Users/stevenchen/.m2/repository/com/jcraft/jsch/0.1.55/jsch-0.1.55.jar:/Users/stevenchen/.m2/repository/org/apache/commons/commons-compress/1.20/commons-compress-1.20.jar:/Users/stevenchen/.m2/repository/org/python/jython/2.7.2/jython-2.7.2.jar:/Users/stevenchen/.m2/repository/org/apache/commons/commons-exec/1.2/commons-exec-1.2.jar:/Users/stevenchen/.m2/repository/org/apache/logging/log4j/log4j-core/2.17.1/log4j-core-2.17.1.jar:/Users/stevenchen/.m2/repository/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1.jar com.timelinecapital.util.agent.utils.FileUtil
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.base/java.util.AbstractList.add(AbstractList.java:153)
	at com.timelinecapital.util.agent.utils.FileUtil.analysisFile(FileUtil.java:19)
	at com.timelinecapital.util.agent.utils.FileUtil.main(FileUtil.java:25)

问题排查

首先当我们去创建一个ArrayList的时候,看到他自己new了一个ArrayList,但这个List他是自己新增的。

发现这是一个自定义的ArrayList,只是用来做一些非常简单的处理,同样的,他的抽象的集合,跟我们普通用的ArrayList的继承是一样的,所以他能够实现List的接口。

搜索文档你会发现会有两个一样的ArrayList,List类如果你不仔细看还真容易被忽略。

原始ArrayList

接着我们去看一下我们日常操作的操作的一个list是什么样子,在那里面就比较全。他所继承的接口,然后一些非常详细的实现都做了对应的处理。

自定义ArrayList

接着回到我们刚刚的那里。因为他当前没有实现添加类。所以他就会跑到他的父级那里抽象集合,那里去找对应的实现方法,我们看到在添加的这个过程中默认抛出不支持操作类型异常。

解决问题

知道了问题所在就好处理。因为ArrayList这个集合工具类它自己实现的集合,所以我们是不能用了,我们只能说手动去建立一个集合。可以用到JAVA 8的这种直接把一个流转成ArrayList的方式,这相当于直接用了一个新ArrayList。

代码语言:javascript
复制
List<String> properties = Arrays.asList(authInfo.split(" "));
// 改成
List<String> properties = Arrays.stream(authInfo.split(" ")).collect(Collectors.toList());

类比推理

在我们常用当中也会用到。另外一个类就是这个集合空数组。他的实现逻辑也差不多。他会瞬间填好一个配置一个空的集合类。因为有些时候我们异常需要返回为空数组,当你去创建一个数组的话,它会有一些空间分配占用空间在这里,它只需要定一个空类空数组而已,然后对其操作进行一个限制。你就可以实现一个空间最小的一个空数组空集合。

举例 Collections.emptyList()

总结

最后,我想说的是其实主要还是这个名字起的太像了。如果你不仔细看,还真的很容易犯错来的。这时候用别人的代码还是要好好的过一遍,不求精细,但是还是要简单的看一下。有一个印象,不要被他的名字给忽悠了。还有就是养成看源码的习惯,有些时候不得不说有一些源码是非常好的一个借鉴意义。用到日常的一些逻辑编写带中当中还是非常好的。

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 示例代码
  • 异常输出
  • 问题排查
  • 原始ArrayList
  • 自定义ArrayList
  • 解决问题
  • 类比推理
  • 总结
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档