day14~15-集合框架

一、集合概述


集合框架类图

在这里插入图片描述

1、集合的特点

  • 集合大小不固定,类型也可以选择不固定。
  • 集合适合做元素的增删操作。
  • 注意:集合中只能存储引用类型数据,如果要存储基本类型数据可以选用包装类。

2、集合适合的场景

  • 数据的个数不确定,需要进行增删”元素时。

二、Collection集合的体系特点


1、集合类体系结构

  • Collection单列集合,每个元素(数据)只包含一个值。
  • Map双列集合,每个元素包含两个值(键值对)。

2、Collection集合特点

  • List系列集合:添加的元素是有序、可重复、有索引。
    • ArrayList、LinkedList:有序、可重复、有索引。
  • Set系列集合:添加的元素是无序、不重复、无索引。
    • HashSet:无序、不重复、无索引。
    • LinkedHashSet:有序、不重复、无索引。
    • TreeSet:按照大小默认升序排序、不重复、无索引。

3、集合对于泛型的支持

  • 集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型。
  • 注意:集合和泛型都只支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。

三、Collection集合常用API


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

/**
 * 掌握 Collection集合常用API
 */
public class Test {
    public static void main(String[] args) {
        
        Collection<String> c = new ArrayList<>();
        System.out.println("---------添加元素--------");
        c.add("Java");
        c.add("Python");
        c.add("C#");
        c.add("C++");
        c.add("Go");
        System.out.println(c);

        System.out.println("---------清空集合--------");
//        c.clear();
//        System.out.println(c);

        System.out.println("---------判空--------");
        System.out.println(c.isEmpty());

        System.out.println("----------获取集合大小-------");
        System.out.println(c.size());

        System.out.println("---------删除某个元素--------");
        c.remove("C++");
        System.out.println(c);

        System.out.println("---------集合 -> 数组--------");
        Object[] arr = c.toArray();
        System.out.println(Arrays.toString(arr));

        System.out.println("------------扩展--------------");
        Collection<String> c1 = new ArrayList<>();
        c1.add("HTML");
        c1.add("CSS");
        //将c1的元素装入c中
        c.addAll(c1);
        System.out.println(c);
        System.out.println(c1);
    }
}

四、Collection集合的遍历方式


1、方式一:迭代器(Iterator)

  • 集合的专用遍历方式
Collection集合获取迭代器
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * Collection集合获取迭代器
 */
public class CollectionDemo1 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        System.out.println("---------添加元素--------");
        c.add("Java");
        c.add("Python");
        c.add("C#");
        c.add("C++");
        c.add("Go");
        System.out.println(c);
        System.out.println("-----------------------");

        // 得到当前集合的迭代器对象
        Iterator<String> it = c.iterator();
        // 从迭代器中取出一个元素
        // System.out.println(it.next());
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

2、方式二:foreach / 增强for循环

  • 增强for循环:(既可遍历集合,也可遍历数组)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * foreach遍历
 */
public class CollectionDemo2 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("Java");
        c.add("Python");
        c.add("C#");
        c.add("C++");
        c.add("Go");
        System.out.println(c);
        System.out.println("-----------------------");

        // 增强for循环遍历集合:
        for (String str : c){
            System.out.println(str);
        }
        System.out.println("-----------------------");
        int[] arr1 = {1,4,2,5,3};
        // 同样,增强for循环遍历数组:
        for (int arr : arr1){
            System.out.println(arr);
        }
    }
}

五、Collection集合存储自定义类型对象


import java.util.ArrayList;
import java.util.Collection;

/**
 * 需求:用集合存储三部电影信息,遍历展示
 * 1、《肖生克的救赎》 9.7    蒂姆·罗宾斯
 * 2、《霸王别姬》    9.6    张国荣
 * 3、《阿甘正传》    9.5    汤姆·汉克斯
 */
public class CollectionDemo_Test {
    public static void main(String[] args) {
        Collection<Movie> list = new ArrayList<>();
        list.add(new Movie("《肖生克的救赎》",9.7,"蒂姆·罗宾斯"));
        list.add(new Movie("《霸王别姬》 ",9.6,"张国荣"));
        list.add(new Movie("《阿甘正传》",9.5,"汤姆·汉克斯"));
        list.forEach(movie -> {
            System.out.println("名称:"+movie.getName()
                    +"\n评分:"+movie.getPoint()+"\n主演:"+movie.getActor());
            System.out.println("---------------------");
        });
    }
}

六、List系列集合


1、List系列集合特点

  • ArrayList.LinekdList:有序,可重复,有索引。
  • 有序:存储和取出的元素顺序一致
  • 有索引:可以通过索引操作元素
  • 可重复:存储的元素可以重复
import java.util.ArrayList;
import java.util.List;

/**
 * List集合特有方法
 */
public class ListDemo1 {
    public static void main(String[] args) {
        // 1、创建一个 ArrayList 集合对象
        List<String> list = new ArrayList<>();
        // 2、添加元素
        list.add("Java");
        list.add("Python");
        list.add("C++");
        list.add("Mysql");
        // 3、根据索引插入元素
        list.add(2,"Go");
        // 4、根据索引删除元素
        list.remove(2);
        // 5、根据索引获取元素
        System.out.println(list.get(2));
        // 6、修改指定索引的元素值
        list.set(2,"Go");
    }
}

2、List集合的遍历方式

  • 迭代器
  • 增强for循环
  • Lambda表达式
  • for循环(因为List集合存在索引)

3、ArrayList集合底层原理

  • ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
  • 第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。

4、LinkedList集合的底层原理

  • 底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。

七、Map集合体系


1、Map集合的概述

在这里插入图片描述

2、Map集合体系特点

在这里插入图片描述


在这里插入图片描述

3、常用API

在这里插入图片描述

4、遍历方式一:键找值

  • 先获取Map集合的全部键的Set集合。
  • 遍历键的Set集合,然后通过键提取对应值。
Map<String, Integer> maps = new HashMap<>();
maps.put("Java",12);
maps.put("Python",32);
maps.put("C++",22);
maps.put("Go",12);
System.out.println(maps);
/*----------遍历方式一:键找值--------*/
// 1、取出所有键
Set<String> key = maps.keySet();
// 2、遍历集合,根据键取出键对应的值
Collection<Integer> values = new ArrayList<>();
for (String s : key) {
    values.add(maps.get(s));
}
System.out.println(values);

5、遍历方式二:键值对

  • 先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了。
  • 遍历Set集合,然后提取键以及提取值。
Map<String, Integer> maps = new HashMap<>();
maps.put("Java",12);
maps.put("Python",32)
maps.put("C++",22);
maps.put("Go",12);
System.out.println(maps);
/*----------遍历方式二:键值对--------*/
// 1、通过entrySet()方法把Map集合转化成Set集合
Set<Map.Entry<String, Integer>> entries = maps.entrySet();
// 2、使用foreach遍历
Collection<Integer> values1 = new ArrayList<>(); // 可重复
for (Map.Entry<String, Integer> entry : entries) {
    String key1 = entry.getKey();
    Integer value = entry.getValue();
    values1.add(value);
}
System.out.println(values1);

八、Set系列集合


1、Set系列集合特点

  • 无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。

2、Set集合实现类特点

  • HashSet :无序、不重复、无索引。
  • LinkedHashSet:有序、不重复、无索引。
  • Treeset:排序、不重复、无索引。

Set集合的功能基本上与Collection的API一致

九、集合排序

Collection的排序相关API:只对于LIst集合

在这里插入图片描述

十、补充:Collection体系的特点、使用场景总结

在这里插入图片描述

十一、泛型

1、泛型概述

  • 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
  • 泛型的格式:<数据类型>;注意:泛型只能支持引用数据类型。
  • 集合体系的全部接口和实现类都是支持泛型的使用的。

2、泛型的好处

  • 统一数据类型。
  • 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。

3、自定义泛型类

泛型类概述

  • 定义类时同时定义了泛型的类就是泛型类。
  • 泛型类的格式:修饰符class类名<泛型变量>{}
  •   public class MyArrayList<T>{}
    
  • 此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等。
  • 作用:编译阶段可以指定数据类型,类似于集合的作用。

4、自定义泛型方法

泛型方法的概述

  • 定义方法时同时定义了泛型的方法就是泛型方法。
  • 泛型方法的格式∶修饰符<泛型变量>方法返回值方法名称(形参列表)用
  •   public <T> void show(T t){ }
    
  • 作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。

5、自定义泛型接口

  • 使用了泛型定义的接口就是泛型接口。
  • 泛型接口的格式:修饰符interface接口名称<泛型变量>{}
  •   public interface Data<E>{}
    
  • 作用:泛型接口可以让实现类选择当前功能需要操作的数据类型

6、泛型通配符、上下限

通配符: ?

  • ? 可以在“使用泛型”的时候代表一切类型。
  • E T K V 是在定义泛型的时候使用的。

泛型的上下限

  • ? extends Car : ? 必须是Car或者其子类 泛型上限
  • ? super Car : ? 必须是Car或者其父类 泛型下限
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值