Java 常用工具类--集合

Java中的集合是工具类,可以存储任意数量的具有共同属性的对象。集合的长度是可以动态改变的。
应用场景:

  1. 无法预测存储数据的数量
  2. 同时存储具有一对一关系的数据
  3. 需要进行数据的增删
  4. 解决数据重复问题

集合框架的体系结构

1、Collection 存储类的对象
2、Map 存储键值对


image.png

ArrayList 长度动态增长的数组 有序的,允许重复
LinkList 链表的内容 有序的,允许重复
HashSet 无序的,不允许重复

一、List

  • List是元素有序并且可以重复的集合,称为序列
  • List可以精确的控制每个元素的插入位置,或删除某个位置的元素
  • List的两个主要实现类是ArrayList和LinkedList

ArrayList

  • ArrayList底层是由数组实现的
  • 动态增长,以满足应用程序的需求
  • 在列表尾部插入和删除数据非常有效
  • 更适合查找和更新元素
  • ArrayList中的元素可以为null
package com.alan.set;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class NoticeTest {

    public static void main(String[] args) {
        // 创建Notice对象,生成三条公告,Date类实例化
        Notice notice1 = new Notice(1, "欢迎来到我的小屋!", "管理员", new Date());
        Notice notice2 = new Notice(2, "请同学们按时提交作业!", "老师", new Date());
        Notice notice3 = new Notice(3, "考勤通知!", "老师", new Date());

        // 添加公告到List当中
        List list = new ArrayList();
        list.add(notice1);
        list.add(notice2);
        list.add(notice3);

        // 打印输出
        System.out.println("公告内容为:");
        for (int i = 0; i < list.size(); i++) {
            // get(i)返回的是object对象,需要将其转换到具体到子类,向下转型,才能使用getTitle方法
            System.out.println(
                    i + 1 + ":" + ((Notice) list.get(i)).getTitle() + "创建时间:" + ((Notice) list.get(i)).getCreateTime());
        }

        // 在第一条公告后面添加一条新公告
        Notice notice4 = new Notice(4, "在线编辑器可以使用啦!", "管理员", new Date());
        list.add(1, notice4);
        // 打印输出更新后的内容
        System.out.println("************************************");
        System.out.println("更新后公告内容为:");
        for (int i = 0; i < list.size(); i++) {
            // get(i)返回的是object对象,需要将其转换到具体到子类,向下转型,才能使用getTitle方法
            System.out.println(i + 1 + ":" + ((Notice) list.get(i)).getTitle());
        }

        // 删除按时完成作业的公告
        // list.remove(2);
        list.remove(notice2);
        // 打印输出更新后的内容
        System.out.println("************************************");
        System.out.println("更新后公告内容为:");
        for (int i = 0; i < list.size(); i++) {
            // get(i)返回的是object对象,需要将其转换到具体到子类,向下转型,才能使用getTitle方法
            System.out.println(i + 1 + ":" + ((Notice) list.get(i)).getTitle());
        }
        
        //将第二条公告改为:JAVA在线编辑器可以使用啦!
        //第一种方法 
        //((Notice) list.get(1)).setTitle("Java在线编辑器可以使用了");
        //第二种方法
        notice4.setTitle("Java在线编辑器可以使用了");
        list.set(1, notice4);
        // 打印输出更新后的内容
        System.out.println("************************************");
        System.out.println("更新后公告内容为:");
        for (int i = 0; i < list.size(); i++) {
            // get(i)返回的是object对象,需要将其转换到具体到子类,向下转型,才能使用getTitle方法
            System.out.println(i + 1 + ":" + ((Notice) list.get(i)).getTitle());
        }
    }

}

二、Set

  • Set是元素无序并且不可以重复的集合,被称为集。

HashSet

  • HashSet是Set的一个重要实现类,称为哈希集。
  • HashSet中的元素无序并且不可以重复。
  • HashSet中只能有一个null元素。(因为不允许重复
  • 具有良好的存取和查找性能(底层是HashMap)

集合中插入字符串案例

package com.alan.set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetDemo1 {

    public static void main(String[] args) {
        // 存入颜色
        Set colorSet = new HashSet();
        colorSet.add("blue");
        colorSet.add("red");
        colorSet.add("black");
        colorSet.add("yellow");
        colorSet.add("white");
        
        //输出
        System.out.println("集合中的元素为:");
        
        //将HashSet放到iterator中,赋值给迭代器接口
        Iterator it = colorSet.iterator();
        while(it.hasNext()) {
            System.out.print(it.next()+" ");
        }
        
        //在集合中插入一个单词,set是无序的,只直筒add(Object)方法
        colorSet.add("white");
        it = colorSet.iterator();
        System.out.println("\n***********************");
        System.out.println("插入重复元素后的输出结果为:");
        while(it.hasNext()) {
            System.out.print(it.next()+" ");
        }
        //插入失败,但是不会报错
    }
}
image.png

HashSet 比较时,需要重写hashCode 和 equals 方法

hashCode 就是查找数据在哪个桶里面,equals就是在一个具体的桶里面进行比较。

  • Cat类
package com.alan.set;

public class Cat {
    
    //属性:名字、年龄、品种
    private String name;
    private int month;
    private String species;
    
    //无参构造
    public Cat() {
        
    }
    //带参构造
    public Cat(String name, int month, String species) {
        this.name = name;
        this.month = month;
        this.species = species;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public String getSpecies() {
        return species;
    }
    public void setSpecies(String species) {
        this.species = species;
    }
    
    //由于使用了HashSet这里重写ToString方法
    @Override
    public String toString() {
        return "姓名:" + name + ", 年龄:" + month + ", 品种:" + species ;
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + month;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((species == null) ? 0 : species.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        //首先比较传入的对象与当前对象引用是否相等,如相等返回
        if(this == obj)
            return true;
        //判断obj是否为Cat类的对象
        if(obj.getClass()==Cat.class) {
            Cat cat = (Cat)obj;
            return cat.getName().equals(name)&&cat.getMonth()==month&&cat.getSpecies().equals(species);
        }else
            return false;
    }
    
    
    

}
  • Cattest
package com.alan.set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CatTest {

    public static void main(String[] args) {
        // 定义宠物猫对象
        Cat huahua = new Cat("花花", 12, "英国短毛猫");
        Cat fanfan = new Cat("凡凡", 3, "中华田园猫");

        // 加入
        Set<Cat> set = new HashSet<Cat>();
        set.add(huahua);
        set.add(fanfan);

        // 输出对象
        Iterator<Cat> it = set.iterator();
        while (it.hasNext()) {
            // 自动调用ToString方法
            System.out.println((Cat) (it.next()));
        }

        System.out.println("**********************************");
        // 再添加一个与花花属性一样的猫
        Cat huahua1 = new Cat("花花", 12, "英国短毛猫");
        set.add(huahua1);
        it = set.iterator();
        while (it.hasNext()) {
            // 自动调用ToString方法
            System.out.println((Cat) (it.next()));
        }

        System.out.println("**********************************");
        // 重新插入一个新宠物猫
        Cat huahua2 = new Cat("花花二代", 2, "英国短毛猫");
        set.add(huahua2);
        System.out.println("添加花花二代后的宠物猫信息:");
        it = set.iterator();
        while (it.hasNext()) {
            // 自动调用ToString方法
            System.out.println((Cat) (it.next()));
        }

        System.out.println("**********************************");
        // 在集合中查找花花的信息并输出
        if (set.contains(huahua)) {
            System.out.println("花花找到了~~~");
            System.out.println(huahua);
        }

        System.out.println("**********************************");
        // 通过花花名字在集合中进行查找

        boolean flag = false;
        Cat c = null;
        it = set.iterator();
        while (it.hasNext()) {
            // 引入泛型后,不用强制转型了。
            // c = (Cat) it.next();
            c = it.next();
            if (c.getName().equals("花花")) {
                flag = true;
                break;
            }
        }
        if (flag) {
            System.out.println("花花找到了~~~");
            System.out.println(c);
        } else {
            System.out.println("花花没找到~~~");

        }
        
        System.out.println("**********************************");
        //删除花花二代的信息并重新输出
        //删除一条信息
//      for(Cat cat:set) {
//          if("凡凡".equals(cat.getName())) {
//              set.remove(cat);
//              break;
//          }
//      }
        //删除多条信息,添加临时对象存储,之后在set中统一删除
        Set<Cat> setTemp = new HashSet<Cat> ();
        for(Cat cat:set) {
            if(cat.getMonth()<5) {
                setTemp.add(cat);
            }
        }
        set.removeAll(setTemp);
        for(Cat cat:set) {
            System.out.println(cat);
        }

    }

}

泛型

通过引入泛型,使对象有确定的类或者变量类型,不用强制转型,有问题也会在编译阶段报错。jdk1.5后引入。

三、Map

  • Map中的数据是以键值对(key -value)的形式存储的
  • key -value以Entry类型的对象实例存在
  • 可以通过key值快速地查找value
  • 一个映射不能包含重复的键

HashMap

  • 基于哈希表的Map接口的实现
  • 允许使用null键和null值
  • key值不允许重复
  • HashMap中的Entry对象是无序排列的
    Goods类
package com.alan.map;

public class Goods {
    
    //属性:商品编号、商品名称、商品价格
    private String id;
    private String name;
    private double price;
    
    
    //带参构造
    public Goods(String id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
    
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }


    @Override
    public String toString() {
        return "商品编号:" + id + ", 商品名称:" + name + ", 商品价格:" + price;
    }
    
}

GoodsTest

package com.alan.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;

public class GoodsTest {

    public static void main(String[] args) {

        Scanner console = new Scanner(System.in);
        // 定义HashMap对象
        Map<String, Goods> goodsMap = new HashMap<String, Goods>();
        System.out.println("请输入三条商品信息");
        int i = 0;
        while (i < 3) {
            System.out.println("请输入第" + (i + 1) + "条");
            System.out.println("请输入商品编号:");
            String goodsId = console.next();
            // 因为HashMap中的key值是唯一的,所以要判断商品编号是否重复
            if (goodsMap.containsKey(goodsId)) {
                System.out.println("该商品编号已存在,请重新输入");
                continue;
            }
            System.out.println("请输入商品名称:");
            String goodsName = console.next();
            System.out.println("请输入商品价格:");
            double goodsPrice = 0;
            try {
                goodsPrice = console.nextDouble();
            } catch (Exception e) {
                System.out.println("商品价格的格式不正确,请输入数值型数据!");
                console.next();
                continue;
            }
            // 定义商品对象赋值,同时将键值对放入goodsMap中
            Goods goods = new Goods(goodsId, goodsName, goodsPrice);
            goodsMap.put(goods.getId(), goods);
            i++;

        }

        // 遍历Map,输出商品信息
        System.out.println("商品的全部信息为:");
        Iterator<Goods> it = goodsMap.values().iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }

    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容