15.集合框架的学习

一、简介

集合框架(Collection Framework) 是 Java 提供的一套用于存储、操作和处理数据集合的标准化架构。它主要位于
java.util 包中,提供了一组 接口实现类,用于操作不同类型的数据集合,如列表(List)、集合(Set)和映射(Map)等。

Java集合框架位于java.util包中
Collection是Set和List的父类,Collections是工具类,提供了对集合进行排序、遍历等多种算法的实现。
ArrayList: 有序(放进去顺序和拿出来顺序一致),可重复
HashSet: 无序(放进去顺序和拿出来顺序不一定一致),不可重复

1. 集合框架的核心组件

Java 集合框架主要由 接口实现类算法 组成。

(1)核心接口

Java 集合框架中最重要的接口有:

  • Collection 接口(顶级接口,List 和 Set 继承自它)
    • List(列表):有序,可重复(如 ArrayList、LinkedList)
    • Set(集合):无序,元素唯一(如 HashSet、TreeSet)
    • Queue(队列):按特定顺序处理元素(如 LinkedList、PriorityQueue)
  • Map(映射):键值对存储,不允许键重复(如 HashMap、TreeMap)

(2)主要实现类

|-----------|-----------------------------------|------------------|
| 接口 | 主要实现类 | 特点 |
| List | ArrayList 、 LinkedList 、 Vector | 有序,可重复 |
| Set | HashSet 、 LinkedHashSet 、 TreeSet | 无序(或排序),不重复 |
| Queue | PriorityQueue 、 ArrayDeque | 先进先出(FIFO)或优先级处理 |
| Map | HashMap 、 LinkedHashMap 、 TreeMap | 键值对存储,不允许键重复 |

java 复制代码
@Test
public void test1() {
    //数组最大问题是长度固定,而且要操作下标
    Student[] array = new Student[3];

    ArrayList<Student> list = new ArrayList<>();
    Student student1 = new Student();
    Student student2 = new Student();
    Student student3 = new Student();
    Student student4 = new Student();
    list.add(student1);
    list.add(student2);
    list.add(student3);
    list.add(student4);
    list.add(student1);

    //有序可重复
    //有序:你放进去的顺序和拿出来的顺序一致
    //ArrayList<String> list1 = new ArrayList<>();
    List<String> list1 = new ArrayList<>();
    list1.add("Java");
    list1.add("UI");
    list1.add("H5");
    list1.add("H5");
    list1.add("aa");
    for (String str : list1) {
        System.out.println(str);
    }
    System.out.println("-------------------");
    //无序不重复
    //无序:放进去顺序和拿出来的顺序可能是不一致的
    //HashSet<String> set = new HashSet<String>();
    Set<String> set = new HashSet<>();
    set.add("Java");
    set.add("UI");
    set.add("H5");
    set.add("H5");
    set.add("aa");
    for (String str : set) {
        System.out.println(str);
    }
}

注意:

jdk1.7版本之前创建集合对象必须把前后的泛型都写上

ArrayList list = new ArrayList();

jdk1.7版本之后,=号后面的泛型可以省略,后面的泛型可以根据前面的泛型推导出来

ArrayList list = new ArrayList<>();

二、ArrayList和LinkedList区别

队列

java 复制代码
LinkedList linkedList = new LinkedList();
linkedList.addFirst("A");
linkedList.removeFirst();
linkedList.addLast("B");
linkedList.removeLast();

ArrayList和LinkedList的大致区别如下:

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  2. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

ArrayList内部是使用可増长数组实现的,所以是用get和set方法是花费常数时间的,但是如果插入元素和删除元素,

除非插入和删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。

LinkedList是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近。但是插入和删除元素花费常数时间。

三、队列

Queue先进先出 FIFO Firt In First Out

客服电话、12306排队买票、滴滴打车

java 复制代码
LinkedList linkedList = new LinkedList();
linkedList.addLast("A");
linkedList.addLast("B");
linkedList.addLast("C");
linkedList.removeFirst();

四、Map

1、Map

Map key,value

Set> set = map.entrySet();

map.keySet();

Map接口

1、Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。

2、Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

3、Collection中的集合称为单列集合,Map中的集合称为双列集合。

4、需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

5、Map中常用的集合为HashMap集合、LinkedHashMap集合。

Map接口中的常用方法

java 复制代码
public static void main(String[] args) {
    // 创建Map对象
    Map<String, String> map = new HashMap<String, String>();
    // 给map中添加元素
    map.put("星期一", "Monday");
    map.put("星期日", "Sunday");
    System.out.println(map); // {星期日=Sunday, 星期一=Monday}
    // 根据指定的key获取对应的value
    String en = map.get("星期日");
    System.out.println(en); // Sunday
    // 根据key删除元素,会返回key对应的value值
    String value = map.remove("星期日");
    System.out.println(value); // Sunday
    System.out.println(map); // {星期一=Monday}
}

2、Map集合遍历键找值方式:

1、keySet

键找值方式:即通过元素中的键,获取键所对应的值

1.获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键

2.遍历键的Set集合,得到每一个键

3.根据键,获取键所对应的值

java 复制代码
public void test1() {
    // 创建Map对象
    Map<String, String> map = new HashMap<String, String>();
    // 给map中添加元素
    map.put("邓超", "孙俪");
    map.put("李晨", "范冰冰");
    map.put("刘德华", "柳岩");
    // 获取Map中的所有key
    Set<String> keySet = map.keySet();
    // 遍历存放所有key的Set集合
    Iterator<String> it = keySet.iterator();
    while (it.hasNext()) {
        // 得到每一个key
        String key = it.next();
        // 通过key获取对应的value
        String value = map.get(key);
        System.out.println(key + "=" + value);
    }
}
2、entrySet

Map集合遍历键值对方式

键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

操作步骤与图解:

1.获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。

2.遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象

3.通过键值对(Entry)对象,获取Entry对象中的键与值。

注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了**↓**

java 复制代码
@Test
public void test1() {
    Map<String, String> map = new HashMap<>();
    map.put("cn", "中国");
    map.put("us", "美国");
    map.put("uk", "英国");
    Set<Map.Entry<String, String>> entrySet = map.entrySet();
    for (Map.Entry<String, String> entry : entrySet) {
        System.out.println(entry.getKey() + " : " + entry.getValue());
    }
    System.out.println("-----------");
    String country = map.get("cn");
    System.out.println(country);
    System.out.println("-----------");
    Set<String> keySet = map.keySet();
    for (String key : keySet) {
        System.out.println(key + " : " + map.get(key));
    }
}

@Test
public void test2() {
    // 创建Map对象
    Map<String, String> map = new HashMap<String, String>();
    // 给map中添加元素
    map.put("邓超", "孙俪");
    map.put("李晨", "范冰冰");
    map.put("刘德华", "柳岩");
    // 获取Map中的所有key与value的对应关系
    Set<Map.Entry<String, String>> entrySet = map.entrySet();
    // 遍历Set集合
    Iterator<Map.Entry<String, String>> it = entrySet.iterator();
    while (it.hasNext()) {
        // 得到每一对对应关系
        Map.Entry<String, String> entry = it.next();
        // 通过每一对对应关系获取对应的key
        String key = entry.getKey();
        // 通过每一对对应关系获取对应的value
        String value = entry.getValue();
        System.out.println(key + "=" + value);
    }
}
相关推荐
学游戏开发的3 分钟前
Lyra学习笔记1地图角色加载流程
笔记·学习·unreal engine
MounRiver_Studio8 分钟前
RISC-V IDE MRS2 开发笔记一:volatile关键字的使用
ide·笔记·risc-v
少可爱14 分钟前
对接钉钉消息样例:DING消息、机器人
java·开发语言·钉钉
xiaomu_34718 分钟前
机器人强化学习入门学习笔记(三)
笔记·学习
Magnum Lehar21 分钟前
vulkan游戏引擎的renderer下的vulkan缓冲区实现
java·前端·游戏引擎
虾球xz28 分钟前
游戏引擎学习第309天:用于重叠检测的网格划分
c++·学习·算法·游戏引擎
鲁鲁51732 分钟前
VS Code + Maven 创建项目
java·maven
zxc_user44 分钟前
java后端-海外登录(谷歌/FaceBook/苹果)
java·开发语言·谷歌·facebook·海外登录
sslings1 小时前
SpringMVC实战:动态时钟
java·学习
大写-凌祁1 小时前
BLIP论文笔记
论文阅读·人工智能·python·深度学习·学习·机器学习