集合框架JCF

集合框架(Java collections Framework)

  • 接口

    • Collections

      • List ​

        • 线性

        • 元素可重复

      • Set

        • 元素不重复

    • Map 映射(Key-Value 键值对,一个元素包含两个对象、键对象不重复)

  • 实现类

  • 算法

List

List集合可以存储一列数据

  • 数据内容可重复

  • 以元素安插的次序来放置元素,不会重新排列

常用方法

add(Object)

  • 插入指定元素,将当前位于该位置的元素 ( 如果有 ) 和任何后续元素向右移动 ( 将其索引加一 )

remove(int)

  • 移除此列表中指定位置的元素(可选操作)。 将任何后续元素向左移动(从它们的索引中减去 1)。 返回从列表中删除的元素

get(int)

  • 返回此列表中指定位置的元素

size()

  • 返回此列表中的元素数

indexOf(Object)

  • 返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1

List接口实现类的选择

  • ArrayList

    • 底层采用数组实现

    • 遍历元素,追加元素速度快

    • 中间插入和删除元素速度慢

    • 线程不安全

  • Vector

    • 底层采用数组实现

    • 线程安全

    • 性能低于ArrayList

  • LinkedList

    • 采用双向链表实现

    • 元素空间不连续

    • 遍历元素速度慢

    • 中间插入和删除元素速度快

    • 一般用于需要在集合的中间位置,频繁增加删除元素时使用

ArrayList 实现类

 List list = new ArrayList();
​
        //添加数据 add(Object)
        list.add(111); //索引为0
        list.add("112"); //索引为1
        list.add(new ClassTest()); //索引为2
        list.add(true); //索引为3
​
        System.out.println(list.get(3)); //得到索引为3的数据
​
        list.remove(3); //去掉索引为3的数据
        //查看集合长度的方法 size()
        System.out.println(list.size()); //得到集合的长度
​
​
        //遍历方式1
        for (int i = 0; i <list.size() ; i++) {
            System.out.println(list.get(i));
        }
​
        //遍历方式2 集合迭代器进行便利
        Iterator iterator= list.iterator();
        //hasNext() 判断迭代器中是否还有元素,没有则返回false,有则返回true
        //next() 获取迭代器中的元素
        while (iterator.hasNext()){
            Object o = iterator.next();
            System.out.println(o);
        }
​
        //for-each 遍历
        for (Object o :list) {
            System.out.println(o);
        }

集合排序

在排序之前,需要定义排序的规则

例子

//员工类
public class EmployeeBean {
​
​
    private String name;
    private int age;
    private int money;
​
    public EmployeeBean() {
    }
​
    public EmployeeBean(String name, int age, int money) {
        this.name = name;
        this.age = age;
        this.money = money;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public int getMoney() {
        return money;
    }
​
    public void setMoney(int money) {
        this.money = money;
    }
​
    @Override
    public String toString() {
        return "EmployeeBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", money=" + money +
                '}';
    }
  }
//main方法
public static void main(String[] args) {
​
        List <EmployeeBean> list = new ArrayList<>();
        list.add(new EmployeeBean( "你",30,4000 ));
        list.add(new EmployeeBean( "我",18,9000 ));
        list.add(new EmployeeBean( "他",41,8000 ));
​
        list.sort(new Comparator<EmployeeBean>() {
            @Override
            public int compare(EmployeeBean o1, EmployeeBean o2) {
                return o2.getMoney()-o1.getMoney(); //按工资从高到低
            }
        });
​
        for (EmployeeBean e:list) {
            System.out.println(e);
        }
​
​
    }

Set

操作一列无重复的数据时,使用set接口的实现类

Set接口实现类,利用元素的hashCode和equals方法判断元素是否重复

如要按元素的属性值去除重复值,则重写方法

常用方法

add(Object)

  • 向集合中添加元素

remove(Object)

  • 将元素从集合中移除

size()

  • 返回此列表中的元素数

Set接口实现类的选择

//set集合基本使用
​
 Set set = new HashSet();
        set.add("Tom");
        set.add("Tom");
        set.add("Tom");
        set.add("Tom");
        set.add("Tom");
        set.add("To");
        set.add("To");
        set.add("To");
        set.add("T");
        set.add("T");
        set.add("T");
        set.add("T");
​
        for (Object o:set) {
            System.out.println(o);
        }
/*
    结果为Tom,T,To
*/
​
        System.out.println(set.size());
        set.remove("Tom");
        System.out.println(set.size());
        for (Object o:set) {
            System.out.println(o);
        }
/*
    结果为3,2,T,To
*/
​


/*
    重写方法去重
*/
​
//main方法
Set<EmployeeBean> employeeBeanSet = new HashSet<>();
​
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Wang",11,11000) );
​
        for (EmployeeBean e:employeeBeanSet) {
            System.out.println(e);
        }
​
​
//员工类
public class EmployeeBean {
​
​
    private String name;
    private int age;
    private int money;
​
    public EmployeeBean() {
    }
​
    public EmployeeBean(String name, int age, int money) {
        this.name = name;
        this.age = age;
        this.money = money;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public int getMoney() {
        return money;
    }
​
    public void setMoney(int money) {
        this.money = money;
    }
​
    @Override
    public String toString() {
        return "EmployeeBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", money=" + money +
                '}';
    }
​
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        EmployeeBean that = (EmployeeBean) o;
        return age == that.age && money == that.money && Objects.equals(name, that.name);
    }
​
    @Override
    public int hashCode() {
        return Objects.hash(name, age, money);
        //此时表示需要name,age,money全部一样才去重
    }
}

//TreeSet
//第一种,运用Comparable接口 重写compareTo方法
​
/*
main方法
*/
Set<EmployeeBean> employeeBeanSet = new TreeSet<>();
​
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Wang",11,11000) );
​
        for (EmployeeBean e:employeeBeanSet) {
            System.out.println(e);
        }
​
/*
    员工类
*/
​
public class EmployeeBean implements Comparable{
    //调用Comparable接口
​
    private String name;
    private int age;
    private int money;
​
    public EmployeeBean() {
    }
​
    public EmployeeBean(String name, int age, int money) {
        this.name = name;
        this.age = age;
        this.money = money;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public int getMoney() {
        return money;
    }
​
    public void setMoney(int money) {
        this.money = money;
    }
​
    @Override
    public String toString() {
        return "EmployeeBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", money=" + money +
                '}';
    }
​
    /*
        重写compareTo方法
        未重写时,默认return 0 意为重复
    */
    @Override
    public int compareTo(Object o) {
        EmployeeBean that = (EmployeeBean) o;
        return this.getMoney()-that.getMoney();
        /* 此时按低到高排序
            this和that互换则相反
        */
       
    }
}
​
​
/*
    第二种
    直接new出Comparator比较器
    不需要在员工类里重写
*/
​
Set<EmployeeBean> employeeBeanSet = new TreeSet<>(new Comparator<EmployeeBean>() {
            @Override
            public int compare(EmployeeBean o1, EmployeeBean o2) {
                /*返回0则表示重复,去重,并排序
                  返回不为0,则按照规则排序
                  同样默认return 0
                */
                return o2.getMoney()-o1.getMoney();
            }
        });
​
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Tom",18,2000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Rose",21,4000) );
        employeeBeanSet.add(new EmployeeBean("Wang",11,11000) );
​
        for (EmployeeBean e:employeeBeanSet) {
            System.out.println(e);
        }

Map

Map接口实现类中,一个元素包含两个对象

  • 键对象(key)

    • 不能重复

  • 值对象(value)

如果Map接口中要使用泛型,应对键和值分别定义

Map<String,Student>map;

Map接口实现类常用方法

Map接口实现类的方法都是关于键值对的操作

put(key,value)向集合中添加元素
get根据键对象找到值对象
keyset得到键对象的集合
values得到值对象的集合
remove根据键对象移除整个元素
containsKey判断键对象在集合中是否存在
/*
    示例
*/
​
 Map<String,EmployeeBean> map = new HashMap<>();
        /*
            put(key,value)
            当键不同时,是做添加
            当键相同时,是做修改(覆盖)
        */
        map.put("Tony",new EmployeeBean("tony",19,30000));
        map.put("Tom",new EmployeeBean("tom",29,40000));
​
        //get(key)得到value
        System.out.println(map.get("Tony"));
​
        //containsKey(key) 判断key在集合中是否存在
        System.out.println(map.containsKey("Tony"));
​
        //remove(key) 根据key移除整个元素
        map.remove("Tony");
​
​
        //keySet() 得到键对象集合
        //map.keySet();
        Set <String> keySet = map.keySet();
​
        //values() 得到值对象集合,返回Collection集合
        //map.values();
        Collection<EmployeeBean> collection = map.values();
​
​
​
//Map的遍历方式
​
        /*
            通过键集合进行遍历
        */
        for (String key:keySet) {
            System.out.println(key + " " + map.get(key));
        }
        
        /*
            通过值集合进行遍历
         */
​
        for (EmployeeBean e:collection) {
            System.out.println(e);
        }
​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值