一、java 集合类的使用

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--;
       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<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
    System.out.println(movies);
    
    结果:[钢铁侠, 复仇者联盟, 蜘蛛侠, 猪猪侠]; 虽然添加两遍“钢铁侠”,但是set里面只有一个,这就是去重功能。
  • 遍历元素
    // 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));
     });
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容