城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

被asList坑了后,整理出Java数组与集合相互转换正确方

1月13日 碎骨族投稿
  〔啤酒〕满怀忧思,不如先干再说!做干净纯粹的技术分享!欢迎评论区或私信交流!
  本文记录一下数组和集合相互转换的几种方法和一些坑,自己总结的同时也分享给有缘人,希望在工作和面试的时候有所帮助,集合和数组的作用区别就不废话了,直接进入正文!共识
  首先要达成的共识:数组可以存储任意类型的数据,包括基本数据类型和引用数据类型【也就是对象】而集合虽然可以扩展大小,但是只能存储对象并不能存储基本数据类型
  所以在使用集合存储整数,字符,小数时需要使用对应的包装类
  不禁问一下初学Java的小朋友,String是基本数据类型吗?〔狗头〕〔白眼〕
  接下来就是,数组和集合相互转换的具体实现和常见BUG的复现和解决!
  数组转集合asList基本数据类型数组问题
  在java。util。Arrays这个JDK提供的工具类中有一个asList方法,可以将数组转换为一个集合声明数组Integer〔〕arr{1,2,3,4,5};转换集合ListIntegerlistArrays。asList(arr);遍历数组for(IntegerarrResult:arr){System。out。println(arrResult);}遍历集合for(IntegerlistResult:list){System。out。println(listResult);}
  上边的数组是引用数据类型,转换时没一点问题,
  但是当数组是基本数据类型时就会出现bug了,如下方代码,转换前数组长度为5,转换后长度变为1声明数组,基本数据类型int〔〕arr{1,2,3,4,5};转换集合,此时的泛型编译器自动识别为【int〔〕】类型Listint〔〕listArrays。asList(arr);原数组长度为5System。out。println(arr。length);转换后的集合大小大小为1System。out。println(list。size());
  这个问题原因通过看asList源码可以了解到publicstaticTListTasList(T。。。a){returnnewArrayList(a);}
  此处发现asList方法接收一个泛型变长参数,而基本数据类型不能泛型化,只有对象可以泛型化,如果想让基本数据类型泛型化必须使用其包装类,如果使用基本数据类型的数组通过asList转换,则直接将数组当做一个数据塞进了集合中,所以得到的集合大小为1。
  不仅仅int有这样的问题,其他的7个基本数据类型都有该问题,使用时一定注意!asList转换的集合不能添加和删除元素
  下方代码将学生数组转换为集合声明数组String〔〕students{石昊,石毅,月禅,火灵儿};转换为集合ListStringlistArrays。asList(students);向集合中添加数据list。add(石中天);
  对集合进行add或者remove方法就会出现非法操作异常
  根据上边asList源码发现,是newArrayList返回,问题就在于创建的ArrayList并不是java。util包中的,而是Arrays工具类中的内部类
  和java。util。ArrayList相同继承了java。util。AbstractList这个抽象类,而该抽象类中的add方法默认返回异常
  java。util。ArrayList:重写了add,remove等方法,所以可以添加数据Arrays。ArrayList:并没有重写,调用时依旧可以调用,但是就会抛出异常
  下方为Arrays。ArrayList内部类部分源码privatestaticclassArrayListEextendsAbstractListEimplementsRandomAccess,java。io。Serializable{privatestaticfinallongserialVersionUID2764017481108945198L;数组privatefinalE〔〕a;构造方法ArrayList(E〔〕array){aObjects。requireNonNull(array);}获取长度Overridepublicintsize(){returna。}转换为数组OverridepublicObject〔〕toArray(){returna。clone();}OverrideSuppressWarnings(unchecked)publicTT〔〕toArray(T〔〕a){intsizesize();if(a。lengthsize)returnArrays。copyOf(this。a,size,(C?extendsT〔〕)a。getClass());System。arraycopy(this。a,0,a,0,size);if(a。lengthsize)a〔size〕}OverridepublicEget(intindex){returna〔index〕;}OverridepublicEset(intindex,Eelement){EoldValuea〔index〕;a〔index〕returnoldV}OverridepublicintindexOf(Objecto){E〔〕athis。a;if(onull){for(inti0;ia。i)if(a〔i〕null)}else{for(inti0;ia。i)if(o。equals(a〔i〕))}return1;}Overridepublicbooleancontains(Objecto){returnindexOf(o)!1;}OverridepublicSpliteratorEspliterator(){returnSpliterators。spliterator(a,Spliterator。ORDERED);}OverridepublicvoidforEach(C?superEaction){Objects。requireNonNull(action);for(Ee:a){action。accept(e);}}OverridepublicvoidreplaceAll(UnaryOperatorEoperator){Objects。requireNonNull(operator);E〔〕athis。a;for(inti0;ia。i){a〔i〕operator。apply(a〔i〕);}}Overridepublicvoidsort(C?superEc){Arrays。sort(a,c);}}
  由此看出其实asList返回的是一个长度不可变的List,数组多长,返回的List也就多大,仅仅是包了一个外壳,并不支持扩容,新增数据和删除数据等操作,如果将这个List通过方法调用传递到一个要add和removeList的方法中就会产生意想不到的结果。
  这可以认为是Java设计上的一个缺陷,使用时一定要注意!
  如果你确定这个集合只读,而不会做修改操作,则可以放心使用,但是如果拿捏不准,就需要其装进java。util包下的ArrayList中,转换成真正的ArrayList,以免出现不可预料的结果声明数组String〔〕students{石昊,石毅,月禅,火灵儿};转换为集合ListStringlistArrays。asList(students);放进java。util的ArrayList中ListStringrealListnewArrayList(list);向集合中添加数据realList。add(石中天);for(Strings:realList){System。out。println(s);}通过Collections。addAll转换声明数组String〔〕students{石昊,石毅,月禅,火灵儿};创建集合ArrayListStringlistnewArrayList();Collections。addAll(list,students);list。add(石中天);for(Strings:list){System。out。println(s);}
  此处创建java。util。ArrayList,可以继续进行add和remove等操作,但是不能将基本数据类型的数组转换为集合通过JDK8的流操作
  此处可以使用boxed()方法将基本数据类型的数组转换成包装类,非常方便声明数组int〔〕arr{1,2,3,4};ListIntegerlistArrays。stream(arr)。boxed()。collect(Collectors。toList());list。add(5);for(Integerresult:list){System。out。println(result);}集合转数组
  通过集合对象的toArray方法返回Object类型数组Object〔〕toArray();返回指定类型数组TT〔〕toArray(T〔〕a);
  将Integer集合转换为Integer类型数组,这里的数组也必须是包装类声明数组ListIntegerlistnewArrayList();list。add(1);list。add(2);list。add(3);list。add(4);Integer〔〕arraylist。toArray(newInteger〔list。size()〕);for(Integerresult:array){System。out。println(result);}
  这就是数组和集合之间转换的几种常见方式和隐患,尤其是asList一定不要被坑了
  希望可以帮助你少走一些弯路,节约一些时间,解决一些实质问题,更多干货可持续关注〔啤酒〕
投诉 评论

用蒟蒻取代冬粉,不添加味精,都用天然的食材辛香料来还原年菜一定少不了虾子想到每次跟家人去餐厅吃饭时,一定必点鲜虾粉丝煲!这次过年我想做出低碳版的给家人吃为了让年菜也可以很低碳,我用蒟蒻取代冬粉,不添加味精,都用天然的食材、辛香料来……教师职业病饮食上要注意什么?大有学问教师这个职业因为话多伤气,气虚人就没精神,血上行的力量就会不足,头部由于缺血,各种疾病的患病率就高。比如颈椎病,脑血栓,动脉硬化,肩周炎等。而且由于脑部缺血……BabyQuyen穿着DoLong连衣裙展示她的奇异美作为2022年越南小姐前10名TranThiBeQuyen(陈氏贝娟),被知名设计师DoLong(都龙)选择成为他的缪斯女神,以野玫瑰为灵感的系列的连衣裙来展示她的奇异美。……连吃3天,她吐血休克进重症室!这道菜很多福建人爱吃!年年有人3月起,福建省各地春笋陆续上市。近日,福建卫生报联合福建省林科院共同绘制的2023福建夺笋地图一经发布,在网络上引发热议,冲上热搜。(此前报道:2023福建夺笋地图出炉,……总要来一趟成武吧!大众网海报新闻记者王文博见习记者杨以锋成武报道雾尽风暖,成武肆意地倾吐着春天的气息。东鱼河畔,清波荡漾拂人醉,一城人家半城碧。郜城水街秀色可餐,不是江南,胜似江南。……千家企业聚焦绿色低碳!中山古镇灯博会有看头3月21日,第二十八届中国古镇国际灯饰博览会圆满闭幕。本次参展的优质企业超3500家,绿色节能灯具成为本次灯博会的一大亮点,千家企业聚焦绿色低碳,参展的灯饰产品以新能源及节能为……人生赢家叶一茜嫁奥运冠军生漂亮女儿,张继科曾为她打工提到中国国家跳水运动员田亮,想必大家都不会感到陌生。作为一名优秀的跳水选手,田亮一共斩获了70多枚奖牌,其中还包括奥运金牌。简单来讲,田亮的职业生涯无比辉煌。遗憾的是,田……火箭心仪阿奴诺比!火箭猛龙酝酿4换1交易,小波特有望被送走?谁是火箭队本赛季最令人惊喜的球员,谁又是火箭队本赛季最让人失望的球员呢?《休斯顿纪事报》记者乔纳森费根认为,申京本赛季的表现给人留下了深刻的印象,他在场均28。1分钟的登场时间……被asList坑了后,整理出Java数组与集合相互转换正确方〔啤酒〕满怀忧思,不如先干再说!做干净纯粹的技术分享!欢迎评论区或私信交流!本文记录一下数组和集合相互转换的几种方法和一些坑,自己总结的同时也分享给有缘人,希望在工作和面……林思意,浪漫私服写真图片集合,唯美小清新活力十足林思意,作为一位年轻有为的女演员,其元气小清新的外形颇受欢迎,近日的私服写真引起了不少粉丝的关注和点赞。这组唯美小清新浪漫活力十足的照片,展示了她多样化的个人风格和时尚感,让粉……虚拟人物利用AI打造出仿佛现实的虚拟人物画面以下图像由AI绘图技术生成。随着人工智能技术的快速发展,越来越多的虚拟人物开始走进我们的视野。这些虚拟人物不仅栩栩如生,而且仿佛具有丰富的人格特征和情感表达能力,它们让我……天天吃芹菜,就能降血压?柯大夫,你好。我爸在体检时查出了高血压,家人不知从哪听说吃芹菜能降血压,从那以后,家里一日三餐全都是芹菜。每天不是炒芹菜、拌芹菜,就是榨芹菜汁都快要魔怔了。请问下,……
安检光机扫描揭秘为什么李佳琦是第一个叫我不要睡的男人直播抢货还在挂腰风扇口罩风扇夏日降温神器登场在日本,有一种美叫今田美樱表达爱情忧伤的朋友圈说说泡妹子说得话对妹子表白得句子浅析机械模具技术的现状与发展去云南旅游如何防止被骗麦积山雪后初霁美如画卷2022年买手机推荐这三款,几乎没有短板,至少能用三五年何处造句用何处造句大全独角兽的魔力GMV一年翻倍!拧巴的知乎电商,站着把钱挣了!幸福辩证观啤酒对脂肪肝的危害是什么春天樱花的作文范文如何防治蔬菜大棚鼠害高中生议论文永恒的价值副职的竞聘演讲稿去医院就害怕,看到医生就怂?怎么能让猫咪不应激呢?宛如一首歌车厘子的营养价值是什么车厘子能空腹吃吗人间大案女凶手无酒不欢,持刀将丈夫杀害并肢解Python线性回归

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找