Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Arrays.asList中所遇到的坑

Arrays.asList中所遇到的坑

作者头像
一枝花算不算浪漫
发布于 2018-10-15 04:45:52
发布于 2018-10-15 04:45:52
7830
举报

前言

最近在项目上线的时候发现一个问题,从后台报错日志看:java.lang.UnsupportedOperationException异常 从代码定位来看,原来是使用了Arrays.asList()方法时把一个数组转化成List列表时,对得到的List列表进行add()和remove()操作, 所以导致了这个问题。

对于这个问题,现在来总结下,当然会总结Arrays下面的一些坑。

源代码分析

首先,遇到问题不可怕,遇到问题解决就是了,但是必须要保证下次不会再犯相同的问题。 Arrays.asList返回的是同样的ArrayList,为什么就不能使用add和remove方法呢?

1,查看Arrays.asList 源码

,

2,查看此ArrayList结构:

3, 在查看AbstractList结构:

果然,UnsupportedOperationException 是这里抛出的,因为Arrays中的ArrayList并没有实现此方法,故抛出了异常。 所以说 Arrays.asList 返回的 List 是一个不可变长度的列表,此列表不再具备原 List 的很多特性,因此慎用 Arrays.asList 方法。

Arrays中其他坑

1,下面程序输出是什么?

打印结果是:1 由上面asList 源码我们可以看到返回的 Arrays 的内部类 ArrayList 构造方法接收的是一个类型为 T 的数组,而基本类型是不能作为泛型参数的,所以这里参数 a 只能接收引用类型,自然为了编译通过编译器就把上面的 int[] 数组当做了一个引用参数,所以 size 为 1,要想修改这个问题很简单,将 int[] 换成 Integer[] 即可。所以原始类型不能作为 Arrays.asList 方法的参数,否则会被当做一个参数。

2,Collections.toArray报错问题 大家可以看下 java.util.ArrayList 源码 中特别标记有一句话如下:

Bug地址:https://bugs.java.com/view_bug.do?bug_id=6260652 那下面来试验下什么情况下会出现这种异常:

如上图,这种控制台打印的结果如下: class [Ljava.lang.String; Exception in thread "main" java.lang.ArrayStoreException: java.lang.Object

我们查看Arrays中ArrayList的toArray源码:

因为asList返回的是一个String数组,所以这里toArray返回的其实是String[]类型,只不过是这里做了一个向上转型,将String[]类型转为Object[]类型罢了。 但是注意,虽然返回的引用为Object[],但实际的类型还是String[],当你往一个引用类型和实际类型不匹配的对象中添加元素时,就是报错。 具体大家可以参考Java向上转型和向下转型的相关知识点。

关于Arrays中的坑就说到这里,有补充的欢迎留言。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++中gRPC:从小白入门到大神精通
在当今分布式系统盛行的时代,高效的通信机制是构建健壮、可扩展软件的关键。gRPC作为一个高性能、开源的远程过程调用(RPC)框架,在C++开发领域中扮演着重要角色。无论是开发微服务架构,还是构建大规模分布式系统,掌握gRPC都能让你的开发工作事半功倍。接下来,让我们一起开启从gRPC小白到大神的学习之旅。
码事漫谈
2025/02/07
8570
C++中gRPC:从小白入门到大神精通
实战|Service Mesh微服务架构实现服务间gRPC通信
大家好!我是"无敌码农"!在前面的文章<<干货|如何步入Service Mesh微服务架构时代>>中介绍了基于Kubernetes及Istio如何一步一步把Service Mesh微服务架构玩起来!在该文章中,我们演示了一个非常贴近实战的案例,这里回顾下该案例的结构,如下图所示:
用户5927304
2021/04/14
1.8K0
Locust完成gRPC协议的性能测试
对于分布式系统而言,不同的服务分布在不同的节点上,一个服务要完成自己的功能经常需要调用其他服务的接口,比如典型的微服务架构。通常这种服务调用方式有两种,一种是发送HTTP请求的方式,另一种则是RPC的方式,RPC是Remote Procedure Call(远程过程调用)的简称,可以让我们像调用本地接口一样使用远程服务。gRPC是一个由 google 推出的、高性能、开源、通用的 rpc 框架。它是基于 HTTP2 协议标准设计开发,默认采用 Protocol Buffers 数据序列化协议,支持多种开发语言。ProtoBuf buffer 是一种数据表达方式,以.proto 结尾的数据文件,可以类比 json、xml 等。
Criss@陈磊
2021/06/10
2K0
Locust完成gRPC协议的性能测试
Rust使用gRPC
需要先安装protoc(Protocol Buffers Compiler),可据此Protobuf Compiler Installation[1]下载
fliter
2024/01/09
2780
Rust使用gRPC
Grpc介绍 — ProToBuf基本使用
RPC(Remote Procedure Call)远程过程调用,关注笔者的同学应该知道之前笔者出过关于Thrift对应的问题,这次主要来说的是Google开源的Grpc,和Thrift有很大的区别Grpc是基于HTTP2.0并且依赖protobuf,为什么又推出关于grpc的文章呢?请大家继续往下看。
喵了个咪233
2019/05/26
1.6K0
gRPC 知多少
当下,基于“微服务”的技术架构体系几乎主宰了整个业务市场,尤其是在云原生生态的拥抱下。无论是基于传统虚拟机生态还是云原生容器生态的现代微服务体系结构中,我们可以根据微服务的交互及通信风格将其划分为两大类:面向外部的微服务和面向内部的微服务。
Luga Lee
2021/11/22
1.4K0
gRPC 知多少
聊聊高性能 RPC框架 gRPC
RPC、gRPC、Thrift、HTTP,大家知道它们之间的联系和区别么?这些都是面试常考的问题,今天带大家先搞懂 RPC 和 gRPC。
码猿技术专栏
2023/05/01
1.9K0
聊聊高性能 RPC框架 gRPC
5分钟学会 gRPC
我猜测大部分长期使用 Java 的开发者应该较少会接触 gRPC,毕竟在 Java 圈子里大部分使用的还是 Dubbo/SpringClound 这两类服务框架。
crossoverJie
2022/10/27
4080
5分钟学会 gRPC
搞懂gRPC支持HTTP进行双协议通信
2)通过 Protocol Buffers 提供强类型接口定义和高效的二进制序列化,减少数据体积;
闫同学
2025/04/18
2470
搞懂gRPC支持HTTP进行双协议通信
protobuf 为经络,gRPC为骨架
以来,数据结构的重要性在任何软件项目中都是毋庸置疑的。但数据结构往往又是最难相处的:
tyrchen
2020/07/23
1.1K0
Go - 关于 proto 文件的一点小思考?
ProtoBuf 是一套接口描述语言(IDL),通俗的讲是一种数据表达方式,也可以称为数据交换格式。
新亮
2021/11/29
4060
Spring Boot+gRPC构建微服务并部署到Istio(详细教程)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/06/20
2.7K0
Spring Boot+gRPC构建微服务并部署到Istio(详细教程)
从源码透析gRPC调用原理
gRPC是如何work的,清楚的理解其调用逻辑,对于我们更好、更深入的使用gRPC很有必要。因此我们必须深度解析下gRPC的实现逻辑,在本文中,将分别从客户端和服务端来说明gRPC的实现原理。
netkiddy
2018/08/19
18.6K1
从源码透析gRPC调用原理
gRPC 基础概念详解
作者:jasonzxpan,腾讯 IEG 运营开发工程师 gRPC (gRPC Remote Procedure Calls) 是 Google 发起的一个开源远程过程调用系统,该系统基于 HTTP/2 协议传输,本文介绍 gRPC 的基础概念,首先通过关系图直观展示这些基础概念之间关联,介绍异步 gRPC 的 Server 和 Client 的逻辑;然后介绍 RPC 的类型,阅读和抓包分析 gRPC 的通信过程协议,gRPC 上下文;最后分析 grpc.pb.h 文件的内容,包括 Stub 的能力、
腾讯技术工程官方号
2021/07/12
4.2K0
Grpc对象转proto代码工具
虽然Grpc.Tools可以将proto文件自动生成代理类,但是proto文件得手敲,还容易出错,如果接口比较复杂,定义比较多,这就很头疼了
用户8604107
2021/07/02
7260
gRPC java 实战:通过 maven 插件自动根据 proto 文件生成 java 代码
在调研 gRPC java 时遇到一个问题,根据官方文档,没有办法一次性就把示例跑成功。
hugo_lei
2021/08/16
8.2K0
gRPC java 实战:通过 maven  插件自动根据 proto 文件生成 java 代码
springcloud集成grpc(一)
是谷歌开源的一个高性能的、通用的RPC框架。和其他RPC一样,客户端应用程序可以直接调用远程服务的方法,就好像调用本地方法一样。它隐藏了底层的实现细节,包括序列化(XML、JSON、二进制)、数据传输(TCP、HTTP、UDP)、反序列化等,开发人员只需要关自业务本身,而不需要关注RPC的技术细节。
一笠风雨任生平
2019/08/02
3.2K0
【每周一库】- Tonic 基于Rust的gRPC实现
gRPC的rust实现,高性能,开源,为移动设备与HTTP/2准备的通用RPC框架
MikeLoveRust
2020/07/28
1.6K0
gRPC的使用
gRPC是由google开发的,是一款语言中立、平台中立、开源的RPC(Remote Procedure Call,远程过程调用)框架。
xcbeyond
2020/04/01
2.2K0
gRPC的使用
rpc框架之gRPC 学习 - hello world
grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的rpc五花八门,国内比较著名的有百度的sofa-pbrpc,但是遗憾的是soft-pbrpc没有对应的java实现版本。rgpc还有一个独立的官网:http://www.grpc.io/,目前已经支持的语言有 C, C++, Java, Go, Node.js, Python, Ruby, Objective-C
菩提树下的杨过
2018/01/18
2.1K0
rpc框架之gRPC 学习 - hello world
相关推荐
C++中gRPC:从小白入门到大神精通
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档