private static class ArrayList<E> extends AbstractList<E> implements Randomaccess, java.io.Serializable { private final E[] a; // 部分代码略 ArrayList(E[] array) { // 返回的是一个定长的数组 a = Objects.requireNonNull(array); } // 部分代码略 }
很明显 , 返回的实际是一个定长的数组 , 所以只能“一如你我初见” , 初始化什么样子就什么样子 , 不能新增 , 不能减少 。如果你理解了 , 那我们就再来一个例子
int[] intArr = {1,2,3,4,5}; Integer[] integerArr = {1,2,3,4,5}; String[] strArr = {"1", "2", "3", "4", "5"}; List list1 = Arrays.asList(intArr); List list2 = Arrays.asList(integerArr); List list3 = Arrays.asList(strArr); System.out.println("list1中的数量是:" + list1.size()); System.out.println("list2中的数量是:" + list2.size()); System.out.println("list3中的数量是:" + list3.size());
你觉得答案是什么?预想3秒钟 , 揭晓答案 , 看跟你预想的是否一致呢?
list1中的数量是:1list2中的数量是:5list3中的数量是:5
是不是和你预想又不一样了?还是回到Arrays.asList方法 , 该方法的输入只能是一个泛型变长参数 。基本类型是不能泛型化的 , 也就是说8个基本类型不能作为泛型参数 , 要想作为泛型参数就必须使用其所对应的包装类型 , 那前面的例子传递了一个int类型的数组 , 为何程序没有报编译错误呢?
在Java中 , 数组是一个对象 , 它是可以泛型化的 , 也就是说我们的例子是把一个int类型的数组作为了T的类型 , 所以在转换后在List中就只有1个类型为int数组的元素了 。除了int , 其它7个基本类型的数组也存在相似的问题 。
JDK里还为我们提供了一个便捷的集合操作工具类Collections , 比如多个List合并时 , 可以使用Collections.addAll(list1,list2), 在使用时也同样要时刻提醒自己:“请勿踩坑”!
5、Stream:给你 , 独一无二Java8中新增了Stream流 , 通过流我们能够对集合中的每个元素进行一系列并行或串行的流水线操作 。当使用一个流的时候 , 通常包括三个基本步骤:获取一个数据源(source)→ 数据转换→执行操作获取想要的结 果 , 每次转换原有 Stream 对象不改变 , 返回一个新的 Stream 对象(可以有多次转换) , 这就允许对其操作可以 像链条一样排列 , 变成一个管道 。
文章插图
Stream用起来你真的是爽 , 根本停不下来 。当然不可避免的 , 还是有一些小坑的 。例如我们分析用户的访问日志 , 放到list里 。
l list.add(new User("码大叔", "登录公众号"));list.add(new User("码大叔", "编写文章"));
因为一些原因 , 我们要将list转为map , Steam走起来private static void convert2MapByStream(List<User> list) { Map<String, String> map = list.stream().collect(Collectors.toMap(User::getName, User::getValue)); System.out.println(map);}
咣当 , 掉坑里了 , 程序将抛出异常:Exception in thread "main" java.lang.IllegalStateException: Duplicate key 码大叔
使用Collectors.toMap() 方法中时 , 默认key值是不允许重复的 。当然 , 该方法还提供了第三个参数:也就是出现 duplicate key的时候的处理方案
推荐阅读
- Alibaba开源Java诊断工具Arthas简单介绍
- 14个 JavaScript 代码优化技巧
- 雕刻|投资翡翠饰品有窍门,作为新手收藏者,掌握这些知识就够了
- 春天来峨眉山,这些地方别错过哦!
- 水星两极地区有一些陨石坑,研究发现这些坑内 火星的地形兼具充满陨石坑
- 31 道 Java 核心面试题,统统打包给你
- 口气太重引人捂鼻?多喝这些茶让口气变清新
- SSHJ - 功能齐全的Java SSH库
- 一 「JAVA」两个数组的交集—力扣每日一题
- Java程序员对领域驱动设计的思考与认知