1. 引言
1.1. 集合的由来
通常我们想要存储一组相同类型类型的数据,首先想到的是数组;数组有个局限性,就是使用数组之前我们首先要指定数组的长度。
但是我们的程序需要根据程序运行时才知道创建多少个对象,也就是说事先我们并不知道需要多少大小。那怎么办呢?集合便应运而生了!
2. java集合
2.1 List
-
创建并添加元素
// 新建一个list List<String> movies = new ArrayList<>(); //添加元素 movies.add("钢铁侠"); movies.add("蜘蛛侠"); movies.add("猪猪侠"); movies.add("复仇者联盟");
-
遍历元素
//1.普通遍历 for(int i=0; i< movies.size(); i++){ // 根据下标获取元素 String movie = movies.get(i); // 打印元素对象 System.out.println(movie); } //2. foreach 遍历, 冒号 前面就是元素对象,后面是集合 for (String movie : movies) { // 打印元素值 System.out.println(movie); } //3、迭代器遍历 // 获取迭代器 Iterator<String> iterator = movies.iterator(); //hasNext() 方法 表示是否还有下一个元素,如果有,继续循环,没有就跳出 while (iterator.hasNext()){ String movie = iterator.next(); // 打印元素值 System.out.println(movie); } //4、lambda movies.forEach(e -> { //打印 System.out.println(e); // do some thing... });
-
如何删除元素
1. 普通循环删除
打印一下集合看看结果://1.普通循环删除, for(int i=0; i< movies.size(); i++){ // 根据下标获取元素 String movie = movies.get(i); if("钢铁侠".equals(movie)){ // 1、根据下标删除 movies.remove(i); // 2、直接删除元素对象 movies.remove(movie); } }
结果:[蜘蛛侠, 猪猪侠, 复仇者联盟], 钢铁侠被删除了;// 打印一下集合 System.out.println(movies);
那么我们想删除集合中所有元素怎么办呢? 最方便的方法是直接调用 movies.clear(), 我们自己实现呢? 我想自己先试试...
同样我们打印一下看看结果:[蜘蛛侠, 复仇者联盟],集合中竟然还有两个元素没有被删除;看看为什么?for(int i=0; i< movies.size(); i++){ // 根据下标删除 movies.remove(i); }
首先我们先给元素标记一下顺序 0:钢铁侠 1:蜘蛛侠 2. 猪猪侠 3.复仇者联盟;
第一次循环时,删除了第0个元素,也就是“钢铁侠”,还剩后面三个,但是位置却发生了变化;变成了0:蜘蛛侠 1. 猪猪侠 2.复仇者联盟;
而第二次循环i已经变成了1,所以直接删除第1个元素,也就是“猪猪侠”,而跳过了0号元素“蜘蛛侠”;
所以结果也就不正确了,那怎么在原有代码上解决呢,就是删除之后让i回退一个,也就是执行i--;
2. foreach 删除for(int i=0; i< movies.size(); i++){ // 根据下标删除 movies.remove(i); //删除一个之后,让下标同时回退一个 i--; }
这里不写代码了,它不支持,当你运行的时候会报java.util.ConcurrentModificationException:
请看https://blog.csdn.net/bimuyulaila/article/details/52088124
3. 最好的删除方式,迭代器
结果不用看,肯定是正确的。// 获取迭代器 Iterator<String> iterator = movies.iterator(); // hasNext() 方法 表示是否还有下一个元素,如果有,继续循环,没有就跳出 while (iterator.hasNext()){ //先获取一个 iterator.next(); //不用传入任何参数,直接删除当前元素 iterator.remove(); }
2.2. Set
set最大的作用就是去重,下面来看看如何使用?
-
创建并添加元素
打印下一看看Set<String> movies = new HashSet<>(); //添加元素 movies.add("钢铁侠"); movies.add("钢铁侠"); movies.add("蜘蛛侠"); movies.add("猪猪侠"); movies.add("复仇者联盟");
结果:[钢铁侠, 复仇者联盟, 蜘蛛侠, 猪猪侠]; 虽然添加两遍“钢铁侠”,但是set里面只有一个,这就是去重功能。// 打印set System.out.println(movies);
-
遍历元素
// 1、迭代器遍历 Iterator<String> iterator = movies.iterator(); //hasNext() 方法 表示是否还有下一个元素,如果有,继续循环,没有就跳出 while (iterator.hasNext()){ String movie = iterator.next(); // 打印元素值 System.out.println(movie); } // 还可以这样 for(Iterator<String> iterator2 = movies.iterator(); iterator2.hasNext();){ // 打印元素值 System.out.println(iterator2.next()); } // 2、foreach,增强for循环 遍历 for(String movie : movies){ // 打印元素值 System.out.println(movie); } //3、lambda movies.forEach(e -> { //打印 System.out.println(e); // do some thing... });
-
删除元素
最好的删除方式,迭代器删除。
2.3. Map
-
创建并添加元素
// 新建一个Map Map<String, Integer> movieMap = new HashMap<>(); // 添加元素, 猪猪侠我看过12次,哈哈 movieMap.put("钢铁侠", 2); movieMap.put("蜘蛛侠", 1); movieMap.put("猪猪侠", 12); movieMap.put("复仇者联盟", 1);
-
遍历元素
//1、根据keySe遍历 for(String key: movieMap.keySet()){ System.out.println(String.format("key:%s,value:%s", key, movieMap.get(key))); } //2、foreach for(Map.Entry<String, Integer> entry : movieMap.entrySet()){ System.out.println(String.format("key:%s,value:%s", entry.getKey(), entry.getValue())); } //3、迭代器 Iterator<Map.Entry<String, Integer>> iterator = movieMap.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry<String, Integer> entry = iterator.next(); System.out.println(String.format("key:%s,value:%s", entry.getKey(), entry.getValue())); } // 4、lambda movieMap.forEach((k, v) -> { System.out.println(String.format("key:%s,value:%s", k, v)); });