范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  [啤酒]满怀忧思,不如先干再说!做干净纯粹的技术分享!欢迎评论区或私信交流!
  本文记录一下数组和集合相互转换的几种方法和一些坑,自己总结的同时也分享给有缘人,希望在工作和面试的时候有所帮助,集合和数组的作用区别就不废话了,直接进入正文!共识
  首先要达成的共识:数组可以存储任意类型 的数据,包括基本数据类型和引用数据类型【也就是对象】而集合虽然可以扩展大小,但是只能存储对象并不能存储基本数据类型
  所以在使用集合存储整数,字符,小数时需要使用对应的包装类
  不禁问一下初学Java的小朋友,String是基本数据类型吗?[狗头][白眼]
  接下来就是,数组和集合相互转换的具体实现和常见BUG的复现和解决!
  数组转集合 asList基本数据类型数组问题
  在 java.util.Arrays  这个JDK提供的工具类中有一个asList  方法,可以将数组转换为一个集合// 声明数组 Integer[] arr = {1,2,3,4,5};  // 转换集合 List list = Arrays.asList(arr);  // 遍历数组 for (Integer arrResult : arr) {     System.out.println(arrResult); } // 遍历集合 for (Integer listResult : list) {     System.out.println(listResult); }
  上边的数组是引用数据类型,转换时没一点问题,
  但是当数组是 基本数据类型 时就会出现bug了,如下方代码,转换前数组长度为5,转换后长度变为1 // 声明数组,基本数据类型 int[] arr = {1,2,3,4,5};  // 转换集合,此时的泛型编译器自动识别为【int[]】类型 List list = Arrays.asList(arr); // 原数组长度为5 System.out.println(arr.length); // 转换后的集合大小大小为1 System.out.println(list.size());
  这个问题原因通过看asList源码可以了解到 public static  List asList(T... a) {     return new ArrayList<>(a); }
  此处发现 asList  方法接收一个泛型变长参数,而基本数据类型不能泛型化,只有对象可以泛型化,如果想让基本数据类型泛型化必须使用其包装类,如果使用基本数据类型的数组通过asList转换,则直接将数组当做一个数据塞进了集合中,所以得到的集合大小为1。
  不仅仅int有这样的问题,其他的7个基本数据类型都有该问题,使用时一定注意! asList转换的集合不能添加和删除元素
  下方代码将学生数组转换为集合 // 声明数组 String[] students = {"石昊","石毅","月禅","火灵儿"}; // 转换为集合 List list = Arrays.asList(students);  // 向集合中添加数据 list.add("石中天");
  对集合进行add或者remove方法就会出现非法操作异常
  根据上边asList源码发现,是 new ArrayList  返回,问题就在于创建的ArrayList并不是java.util  包中的,而是Arrays工具类中的内部类
  和 java.util.ArrayList  相同继承了java.util.AbstractList  这个抽象类,而该抽象类中的add方法默认返回异常
  java.util.ArrayList:重写了add,remove等方法,所以可以添加数据 Arrays.ArrayList:并没有重写,调用时依旧可以调用,但是就会抛出异常
  下方为 Arrays.ArrayList  内部类部分源码private static class ArrayList extends AbstractList         implements RandomAccess, java.io.Serializable {     private static final long serialVersionUID = -2764017481108945198L;     // 数组     private final E[] a;     // 构造方法     ArrayList(E[] array) {         a = Objects.requireNonNull(array);     }     // 获取长度     @Override     public int size() {         return a.length;     }     // 转换为数组     @Override     public Object[] toArray() {         return a.clone();     }      @Override     @SuppressWarnings("unchecked")     public  T[] toArray(T[] a) {         int size = size();         if (a.length < size)             return Arrays.copyOf(this.a, size,                                  (Class<? extends T[]>) a.getClass());         System.arraycopy(this.a, 0, a, 0, size);         if (a.length > size)             a[size] = null;         return a;     }      @Override     public E get(int index) {         return a[index];     }      @Override     public E set(int index, E element) {         E oldValue = a[index];         a[index] = element;         return oldValue;     }      @Override     public int indexOf(Object o) {         E[] a = this.a;         if (o == null) {             for (int i = 0; i < a.length; i++)                 if (a[i] == null)                     return i;         } else {             for (int i = 0; i < a.length; i++)                 if (o.equals(a[i]))                     return i;         }         return -1;     }      @Override     public boolean contains(Object o) {         return indexOf(o) != -1;     }      @Override     public Spliterator spliterator() {         return Spliterators.spliterator(a, Spliterator.ORDERED);     }      @Override     public void forEach(Consumer<? super E> action) {         Objects.requireNonNull(action);         for (E e : a) {             action.accept(e);         }     }      @Override     public void replaceAll(UnaryOperator operator) {         Objects.requireNonNull(operator);         E[] a = this.a;         for (int i = 0; i < a.length; i++) {             a[i] = operator.apply(a[i]);         }     }      @Override     public void sort(Comparator<? super E> c) {         Arrays.sort(a, c);     } }
  由此看出其实asList返回的是一个长度不可变的List, 数组多长,返回的List也就多大 ,仅仅是包了一个外壳,并不支持扩容,新增数据和删除数据等操作,如果将这个List通过方法调用传递到一个要add和removeList的方法中就会产生意想不到的结果。
  这可以认为是Java设计上的一个缺陷,使用时一定要注意!
  如果你确定这个集合只读,而不会做修改操作,则可以放心使用,但是如果拿捏不准,就需要其装进 java.util  包下的ArrayList中,转换成 "真正的" ArrayList,以免出现不可预料的结果// 声明数组 String[] students = {"石昊","石毅","月禅","火灵儿"}; // 转换为集合 List list = Arrays.asList(students);  // 放进java.util的ArrayList中 List realList = new ArrayList<>(list);  // 向集合中添加数据 realList.add("石中天"); for (String s : realList) {     System.out.println(s); }通过Collections.addAll转换// 声明数组 String[] students = {"石昊","石毅","月禅","火灵儿"}; // 创建集合 ArrayList list = new ArrayList<>();  Collections.addAll(list,students); list.add("石中天"); for (String s : list) {     System.out.println(s); }
  此处创建 java.util.ArrayList  ,可以继续进行add和remove等操作,但是不能将基本数据类型的数组转换为集合通过JDK8的流操作
  此处可以使用 boxed()  方法将基本数据类型的数组转换成包装类,非常方便// 声明数组 int[] arr = {1,2,3,4}; List list = Arrays.stream(arr).boxed().collect(Collectors.toList()); list.add(5); for (Integer result : list) {     System.out.println(result); }集合转数组
  通过集合对象的toArray方法 // 返回Object类型数组 Object[] toArray(); // 返回指定类型数组  T[] toArray(T[] a);
  将Integer集合转换为Integer类型数组,这里的数组也必须是包装类 // 声明数组 List list = new ArrayList<>();  list.add(1); list.add(2); list.add(3); list.add(4);  Integer[] array = list.toArray(new Integer[list.size()]); for (Integer result : array) {     System.out.println(result); }
  这就是数组和集合之间转换的几种常见方式和隐患,尤其是asList一定不要被坑了
  希望可以帮助你少走一些弯路,节约一些时间,解决一些实质问题,更多干货可持续关注[啤酒]

盘点适合春夏的口红色号,仙女们知道吗?下面我来分享几只适合春夏的口红,可以作为参考1。植村秀柔雾唇膏OR570植村秀家的招牌经典色号570血橙色,元气西柚果汁色,这个颜色就很像盛夏一大杯加冰的西柚果汁的感觉,很清爽解暑退休以后想到山东养老,请问山东哪个城市适合养老?退休想到山东养老看看哪行拂面望海威海风情海岸选定哈哈,做广告呢。山东适宜养老的城市,一般都选威海,烟台,青岛。所以,如果你退休以后,想到山东来养老,首推就是威海。至于威海的优越性,六七十年代,煤矿工人辛苦且有一定风险,为什么很多人还抢着做?煤矿工人风险最大,但是不管怎样还有工资收入能养家。在我们浙江,煤炭是极缺乏的,只有长兴的长广煤矿。其实,这煤矿已挖到了安微广德地下,因为浙江煤炭少,经中央同意給浙江开釆。大概在七十为什么修电脑的师傅不建议安装360卫士?安装了有可能把这个修电脑的人植入到你电脑里面的广告软件给干掉,影响修电脑师傅的广告收入曾经有人做过实验,用了目前使用最广泛的几款杀毒软件。当启动360杀毒软件的时候,实验者电脑上的什么化妆品适合学生党?我也是学生党一名,之前被被种草了这些用过之后感觉挺好的的推荐给你,也挺平价的,适合我们学生党1。妆前乳Sofina控油隔离妆前乳强大的控油能力,一天下来完全不用担心出油花了妆容2。无创体外心脏震波疗法作为冠心病治疗最前沿的技术未来可以取代支架手术吗?在临床上有这么一类冠心病患者,他们已经不能再做心内科的心脏支架,也不能再做心脏外科的搭桥手术。那么,面对这类冠心病的终末期患者,还有哪些治疗手段可以给予其有效的治疗呢?没错,很多人有些老人为什么摔一跤就会骨折,吃点什么能让骨骼更结实一些?作为子女,我担心的也是父母摔跤容易骨折的问题,每次他们出门都会千叮咛万嘱咐的告诉他们慢点走,别着急,注意安全,下雪下雨天也尽量与他们商量减少出门的频次。为什么老人容易骨折?之所以老8万闲钱买了飞月宝和超月宝各1万,其余6万放在余额宝和余利宝了,这样理财科学吗?既然是闲钱,说明对资金流动性要求不高,因此这样的配置属于偏保守的。我们来简单分析一下这个配置的特点。理财资金总额8万元理财产品四款建信飞月宝30天定期理财产品,1万元国寿超月宝60我同事女儿怀孕了,她准备辞职去给女儿看娃,你支持她的做法吗?这种做法是否妥当,在局外人看来是不好妄下结论。因为我们不懂你与同事(她)是白领,还是蓝领职业?工作强度如何?她家经济条件是否富俗?是否不差这笔月薪?她的亲家是否都健在?或是都忙于自王者荣耀射手永远无法体会的,玩坦克的乐趣有哪些?来追我啊,追到就让你嘿嘿嘿!玩射手类英雄的玩家,永远无法体会玩坦克英雄的乐趣。确实,囧王者是一名专职ADC位置的玩家,最近由于宅在家里,只能把AFK几个赛季的王者荣耀又捡了起来。我生活中如何进行数学启蒙?以我在幼儿园工作了近40多年的经验,幼儿园的孩子,早教重点应该放在启蒙上,而非练习做题。我一直倡导,早教应该是游戏化生活化儿童化,三者联合统一的行为。尤其是在数学早教上,数学本身是
水浒传已逝9位配角,心梗肝癌车祸,每一个都叫人惋惜水泊梁山,好汉齐聚,鲁智深倒拔垂杨柳,武松单臂擒方腊,多少英雄好汉的故事耳熟能详,但这些好汉却因宋江的决策断送了前程,喝毒药上吊死状凄惨,善始善终的没有几人,当初多少观众恨得牙痒痒不是恨嫁嘛,婚后咋还天天吵架?不会吧,还有人不知道吴京曾经是个幽怨恨嫁男吗?十多年前的他,会在微博文兴大发,吟诗作对,自称一枚剩男在光棍节受伤的时候,他又会瞬间化身星座爱好者说好的白羊座桃花运呢?因为没恋爱可谈成本仅800万,真假济公首映夺第一,陈浩民又抓到奇幻片王炸济公无疑是国产奇幻片拍不完的题材虽然观众第一时间想到的是游本昌老师饰演的济公,可以说游本昌演技出神入化,又德高望重,简直是把济公演的活灵活现但不得不说近年来济公最大的存在感是陈浩民火影忍者手游如何快速获得S忍A忍?(新手向教程)各种S或A忍者怎么得,缺多少碎片,怎么弄划算,其实这些东西对于刚接触游戏的朋友来说真的很复杂,本期整理了一下历年的活动,简单说一说当前版本忍者的常见获取手段1高招忍者不管你身处哪个武侠网游鼻祖千年盛世手游沉浸式体验热血江湖,快意恩仇!这是曾经火极一时的武侠网游鼻祖千年而改编的千年盛世手游如果提及武侠游戏,千年盛世可以说是绝大多数武侠游戏迷手上的朱砂痣心间的白月光。和现实中的生活一样,在游戏中每个人都有生存的目标最终幻想10歌舞伎表演定妆海报公布去年,史克威尔艾尼克斯宣布将对经典作品最终幻想10进行歌舞伎改编,并将于今年春季上演。如今,最终幻想10歌舞伎表演时间终于敲定,将于3月4日表演至4月12日在IHIStageAro社会的真实面目,世界另一面真实样貌!你在哪里?在做什么事?又有怎样的体验?那,又有怎样的感悟呢?如果人生是一场游戏一普通人(穷人)玩着残酷的生存游戏这是一场生存游戏,残酷煎熬艰难,还有些许的无可奈何,这都是生存游戏的在Steam硬件调查中GeForceRTX40GPU比RadeonRX7900更受欢迎最新的NVIDIAGeForceRTX40和AMDRadeonRX7900系列GPU已经开始出现在Steam硬件调查中,看起来NVIDIA在玩家中的受欢迎程度再次领先。自NVIDI为什么劝你别穿无痕裤出门?看完杭州女生的街拍,你就明白了说实话,时尚还真不是存在即合理,对于有些火得莫名其妙的单品,让很多普通女孩失去了自我判断的能力,只知道盲目跟风而忘了适不适合自己,网红单品无痕裤就是这样的存在。无痕裤指的是版型修身男生不能穿紧身裤?没有女朋友的牛仔裤宽都是紧身裤?今天女朋友抖音分享了一个视频,视频的内容就是女生最讨厌的男生穿搭,紧身裤豆豆鞋肯定是位居榜首的!作为一个男生我确实也不喜欢穿紧身裤,没想到最后原来是点我的,害!总有一种很无奈的感觉张子枫陈飞宇现身活动,一个吊带红裙,一个西装革履!文桔彤作为艺人而言,在这个新的一年来临之际,很多艺人也都有了新的发展目标,比如拍摄新的影视剧,还有的拍摄各类综艺节目,再有的艺人参加各类品牌发布会,那么对于很多新晋的艺人而言也是如