一、java 集合类的使用

1. 引言

1.1. 集合的由来

  通常我们想要存储一组相同类型类型的数据,首先想到的是数组;数组有个局限性,就是使用数组之前我们首先要指定数组的长度。

  但是我们的程序需要根据程序运行时才知道创建多少个对象,也就是说事先我们并不知道需要多少大小。那怎么办呢?集合便应运而生了!

2. java集合

2.1 List

  • 创建并添加元素
    // 新建一个list
    List 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 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--;
       for(int i=0; i< movies.size(); i++){
           // 根据下标删除
           movies.remove(i);
           //删除一个之后,让下标同时回退一个
           i--;
       }
    
     2. foreach 删除

      这里不写代码了,它不支持,当你运行的时候会报java.util.ConcurrentModificationException:
    请看https://blog.csdn.net/bimuyulaila/article/details/52088124

     3. 最好的删除方式,迭代器
       // 获取迭代器
       Iterator iterator = movies.iterator();
       // hasNext() 方法 表示是否还有下一个元素,如果有,继续循环,没有就跳出
       while (iterator.hasNext()){
           //先获取一个
           iterator.next();
           //不用传入任何参数,直接删除当前元素
           iterator.remove();
       }
    
     结果不用看,肯定是正确的。

2.2. Set

set最大的作用就是去重,下面来看看如何使用?
  • 创建并添加元素
    Set movies = new HashSet<>();
    //添加元素
    movies.add("钢铁侠");
    movies.add("钢铁侠");
    movies.add("蜘蛛侠");
    movies.add("猪猪侠");
    movies.add("复仇者联盟");
    
    打印下一看看
    // 打印set
    System.out.println(movies);
    
    结果:[钢铁侠, 复仇者联盟, 蜘蛛侠, 猪猪侠]; 虽然添加两遍“钢铁侠”,但是set里面只有一个,这就是去重功能。
  • 遍历元素
    // 1、迭代器遍历
    Iterator iterator = movies.iterator();
    //hasNext() 方法 表示是否还有下一个元素,如果有,继续循环,没有就跳出
    while (iterator.hasNext()){
        String movie = iterator.next();
        // 打印元素值
        System.out.println(movie);
    }
    // 还可以这样
    for(Iterator 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 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 entry : movieMap.entrySet()){
         System.out.println(String.format("key:%s,value:%s", entry.getKey(), entry.getValue()));
     }
     //3、迭代器
     Iterator> iterator = movieMap.entrySet().iterator();
     while (iterator.hasNext()){
         Map.Entry 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));
     });
    

你可能感兴趣的:(一、java 集合类的使用)