为什么Java里的Arrays.asList不能用add和remove方法

相关文章推荐
在平时的开发过程中,我们知道可以将一个Array的对象转化为List。这样的操作,我们只要采用Arrays.asList这个方法就行了。笔者前段时间一直用这个方法,有一天,我发现通过Arrays.as...
我们知道,Arrays.asList返回的是个ArrayList,但是为什么不能修改呢?
其实,原因有点隐蔽,当我们仔细看Arrays的源码会发现,Arrays自己实现了一个ArrayList,仅仅是...
以前在项目中遇到过这么一个问题,就是用Arrays.asList()将一个数组转换成list后,执行一些 add 、remove等操作时总是报UnsupportedOperationException...
在使用Arrays.asList(strArray)转换成List,调用该list的remove()方法,报异常:java.lang.UnsupportedOperationException。
前言首先让我们来看一段代码:String[] strings = new String[]{"hello","world"};
List stringList = Arrays.asList(stri...
/*Arrays.asList转换数组为集合List对象
Arrays:用于操作数组的工具类。
里面都是静态方法。asList:将数组变成list集合
import java.util.*;
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
Arrays类包含用来操作...
对于多数人来说,想要将某个数组转为List都会选择Arrays类的asList()方法。其实这个方法并不能应付所有情况。请看下面的示例:
import java....
感谢作者能翻译并且分享这么优质的文章。不过文章中有一处表述欠妥:如果希望避免这两个坑,请改用这个方式
Collections.addAll(arraylist, array);从字面上理解,作者的意思...
list中add set 和 remove介绍
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Java.Util.Arrays可以将数组转换为List,具体的定义如下:
@SafeVarargs
public static &T& List&T& asList(T... a) {
return new ArrayList&&(a);
可以看到实际上是将这个数组转换成为了ArrayList&&,看似没有问题,但是当我们使用add和remove的时候,会发现会抛出UnsupportedOperationException,为什么?这个不科学呀!
进入Arrays的源代码才发现...尼玛这坑人...
1.&Arrays.asList方法中返回的是List&&,但是实际上它继承的是AbstractList&&
2.&AbstractList&&继承自AbstractCollection&&和List&&
3.&Arrays.asList之后出来的List&&是无法操作add和remove的,会抛出UnsupportedOperationException异常
Arrays.asList中返回的ArrayList&&定义:
private static class ArrayList&E& extends AbstractList&E&
implements RandomAccess, java.io.Serializable
AbstractList的定义:
public abstract class AbstractList&E& extends AbstractCollection&E& implements List&E& {
那下面在来看一下ArrayList&E&中add和remove方法的实现吧,搜索了一下,没有找到add和remove方法!
好吧,那我去AbstractList里找,搜了一下,找到了add方法的定义:
public boolean add(E e) {
add(size(), e);
return true;
好吧,那继续F3查找add(int index, E element)的定义:
public void add(int index, E element) {
throw new UnsupportedOperationException();
看到了什么?坑爹吧就!
再看看remove方法:
public E remove(int index) {
throw new UnsupportedOperationException();
好吧,一排排的黑线啊...
终于找到原因了,那怎么处理呢?
解决方案:
需要用ArrayList处理一下:
Long[] idLongArrs = {1L, 2L, 3L};
ArrayList&Long& ids = new ArrayList&Long&(Arrays.asList(idLongArrs));
阅读(...) 评论()温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
杭州阿里巴巴-朝9晚9
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at Start.main(Start.java:19)在运行如下代码时抛出如上面的异常import java.util.Aimport java.util.L/** * @author wanggang * */public class Start { /**
* @param args
*/ public static void main(String[] args) {
List&Integer& list = Arrays.asList(1, 2, 3);
list.add(4); }}原因分析在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等 method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(),add()等,所以throw UnsupportedOperationException。
阅读(2145)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_085064',
blogTitle:'java.lang.UnsupportedOperationException, List,使用Arrays.asList()方法',
blogAbstract:'Exception in thread \"main\" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at Start.main(Start.java:19)在运行如下代码时抛出如上面的异常',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:5,
permalink:'blog/static/',
commentCount:2,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'杭州阿里巴巴-朝9晚9',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}Arrays.asList方法总结
作者:胖大海Plus
字体:[ ] 类型:转载 时间:
本文主要对Arrays.asList方法进行总结。具有很好的参考价值,下面跟着小编一起来看下吧
话不多说,请看代码:
import java.util.A
import java.util.L
* 本类演示了Arrays类中的asList方法
* 通过四个段落来演示,体现出了该方法的相关特性.
* (1) 该方法对于基本数据类型的数组支持并不好,当数组是基本数据类型时不建议使用
* (2) 当使用asList()方法时,数组就和列表链接在一起了.
当更新其中之一时,另一个将自动获得更新。
注意:仅仅针对对象数组类型,基本数据类型数组不具备该特性
* (3) asList得到的数组是的没有add和remove方法的
* 阅读相关:通过查看Arrays类的源码可以知道,asList返回的List是Array中的实现的
* 内部类,而该类并没有定义add和remove方法.另外,为什么修改其中一个,另一个也自动
* 获得更新了,因为asList获得List实际引用的就是数组
public class AsListTest {
public static void main(String[] args) {
/* 段落一:基本数据类型使用asList中的问题 */
/* 说明:虽然在JDK1.6中能够将基本数据类型的数组转换成List,但还是有个缺陷 */
int[] a_int = { 1, 2, 3, 4 };
/* 预期输出应该是1,2,3,4,但实际上输出的仅仅是一个引用, 这里它把a_int当成了一个元素 */
List a_int_List = Arrays.asList(a_int);
foreach(a_int_List);
/* 为此我们需要这样遍历其中元素 */
foreachForBase(a_int_List);
/* 段落二:对象类型的数组使用asList,是我们预期的 */
Integer[] a_Integer = new Integer[] { 1, 2, 3, 4 };
List a_Integer_List = Arrays.asList(a_Integer);
foreach(a_Integer_List);
/* 段落三:当更新数组或者asList之后的List,另一个将自动获得更新 */
a_Integer_List.set(0, 0);
foreach(a_Integer_List);
foreach(a_Integer);
a_Integer[0] = 5;
foreach(a_Integer_List);
foreach(a_Integer);
/* 段落四:对基本类型数组,通过asList之后的List修改对应的值后,在运行时会报出异常
* 但是基本类型数组对应的List是会发生变化的,这是毫无疑问的
* a_int_List.set(0, 0);
* foreach(a_int_List); foreach(a_int);
a_int[0] = 5;
foreachForBase(a_int_List);
foreach(a_int);
/* 打印方法 */
private static void foreach(List list) {
for (Object object : list) {
System.out.print(object + " ");
System.out.println();
private static void foreachForBase(List a_int_List) {
int[] _a_int = (int[]) a_int_List.get(0);
foreach(_a_int);
private static void foreach(int[] a_int) {
for (int i : a_int) {
System.out.print(i + " ");
System.out.println();
private static void foreach(Integer[] _a_Integer) {
for (int i : _a_Integer) {
System.out.print(i + " ");
System.out.println();
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具相关文章推荐
在平时的开发过程中,我们知道可以将一个Array的对象转化为List。这样的操作,我们只要采用Arrays.asList这个方法就行了。笔者前段时间一直用这个方法,有一天,我发现通过Arrays.as...
以前在项目中遇到过这么一个问题,就是用Arrays.asList()将一个数组转换成list后,执行一些 add 、remove等操作时总是报UnsupportedOperationException...
我们知道,Arrays.asList返回的是个ArrayList,但是为什么不能修改呢?
其实,原因有点隐蔽,当我们仔细看Arrays的源码会发现,Arrays自己实现了一个ArrayList,仅仅是...
在使用Arrays.asList(strArray)转换成List,调用该list的remove()方法,报异常:java.lang.UnsupportedOperationException。
前言首先让我们来看一段代码:String[] strings = new String[]{"hello","world"};
List stringList = Arrays.asList(stri...
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
Arrays类包含用来操作...
对于多数人来说,想要将某个数组转为List都会选择Arrays类的asList()方法。其实这个方法并不能应付所有情况。请看下面的示例:
import java....
list中add set 和 remove介绍
在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asLis...
/*Arrays.asList转换数组为集合List对象
Arrays:用于操作数组的工具类。
里面都是静态方法。asList:将数组变成list集合
import java.util.*;
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 add用法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信