Java - 集合框架及背后的数据结构

本节目标

  • 了解什么是集合框架
  • 了解学习集合框架的意义
  • 掌握集合框架相关接口和常见的实现类
  • 了解下一阶段要学习的内容

1. 介绍

官方教程
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes

其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD 。

C:create,向数据库插入一条记录;
R:read,查询数据库记录;
U:update,修改数据库记录;
D:delete,删除数据库记录。

例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)、一个通讯录(一组姓名和电话的映射关系)等等。

类和接口总览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Map、Set、List是否有序?

首先我们应该清楚这个概念:这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。

list是按照元素的添加顺序来存储对象的,因此是有序的。他的实现类ArrayList、LinkedList、Vector都是有序的。

Map是无序的,它的存储结构是哈希表<key,value>键值对,map中插入元素是根据key计算出的哈希值来存储元素的,因此他不是按照元素的添加顺序来存储对象的,所以Map是无序的。它的实现类有:HashMap、TableMap和TreeMap。

其中LinkedHashMap是有序的,hashMap用来保证存储的值键值对,list用来保证插入的顺序和存储的顺序一致。

Set是无序的,并且set中的元素不能重复。set的底层实现其实是Map,它是计算key的哈希值来确定元素在数组中的存放位置,所以是无序的,应为在Map中key的值不能重复,所以set中的元素不能重复。它的实现类有:haseSet、TreeSet。

其中LinkedHashSet是有序的,其中haseSet用来保证数据唯一,List用来保证插入的顺序和存储的顺序一致。
————————————————
版权声明:本文为CSDN博主「hust_yfang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hust_yfang/article/details/79607138

面试题示例:
which statement is true for the class java.util.ArrayList?

 A.集合中的元素是有序的   对

 B.集合被保证为不可变的  错

 C.集合中的元素被保证为唯一的  错  有序的 所以不唯一

 D.集合中的元素使用一个唯一的键来存取   错   没有键

 E.集合中的元素被保证为同步的   错  不是同步的

2. 学习的意义

2.1 Java 集合框架的优点及作用

  1. 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码
  2. 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景

2.2 笔试及面试题

腾讯-Java后台开发面经
1. HashMap 了解不,介绍一下,如果一个对象为 key 时,hashCode 和 equals 方法的用法要注意什么?
2. HashSetHashMap 的区别是什么?
3. HashMap 是线程安全的么?那需要线程安全需要用到什么?
阿里巴巴-Java后台开发面经
1. ArrayListLinkedList 的区别是什么?
2. 有了解过 HashMap 的具体实现么?
3. HashMapConcurrentHashMap 哪个效率更高?
今日头条-Java后台开发面经
1. 编程题:判断一个链表是否是一个回文链表。
2. Redis 的 zset 类型对应到 java 语言中大致是什么类型?
3. hashCode 主要是用来做什么用的?

3. 接口 interfaces

3.1 基本关系说明

在这里插入图片描述

  1. Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements
    1. Set : 元素不能重复,背后隐含着查找/搜索的语义
      1. SortedSet : 一组有序的不能重复的元素
    2. List : 线性结构
    3. Queue : 队列
    4. Deque : 双端队列
  2. Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义
    1. SortedMap : 一组有序的键值对

3.2 Collection 接口说明

Collection官方文档

3.3 Collection 常用方法说明

在这里插入图片描述

3.4 Collection 示例

import java.util.Collection;
import java.util.ArrayList;
import java.util.Arrays;
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Collection<String> list = new ArrayList<>();
        System.out.println(list.size());
        System.out.println(list.isEmpty());
        list.add("我");
        list.add("爱");
        list.add("Java");
        System.out.println(list.size());
        System.out.println(list.isEmpty());
        Object[] array = list.toArray();
        System.out.println(Arrays.toString(array));
        for (String s : list) {
    
    
            System.out.println(s);
        }
        list.remove("爱");
        for (String s : list) {
    
    
            System.out.println(s);
        }
        list.clear();
        System.out.println(list.size());
        System.out.println(list.isEmpty());
    }
 }

运行结果:

0
true
3
false
[,, Java]
我
爱
JavaJava
0
true
public static void main(String[] args) {
    
    
    Collection<String> collection = new ArrayList<>();
    collection.add("hello");
    collection.add("hello2");
    System.out.println(collection);
    
    boolean flg = collection.remove("hello");
    System.out.println(flg);
    
    System.out.println(collection.size());
        
    Object[] objects = collection.toArray();
  //String[] objects = (String[])collection.toArray();
  //不建议进行强制类型转换,上一行注释会出现ClassCastException异常。
    System.out.println(Arrays.toString(objects));
        
    /*collection.clear();
    System.out.println("===================");
    System.out.println(collection);
    System.out.println(collection.isEmpty());*/
}
//结果为:
[hello, hello2]
true
1
[hello2]

public static void main1(String[] args) {
    
    
    Collection<String> collection = new ArrayList<>();
    collection.add("hello");
    collection.add("hello2");
    //collection.add(1);
    //尖括号当中 放的类型 一定要是 包装类 不能是简单的基本类型
    Collection<Integer> collection2 = new ArrayList<>();
    collection2.add(1);
    collection2.add(2);
    collection2.add(13);
}

注意不建议进行整体数组的强制类型转换。
如下图,Integer[]Object[]是可行的,但是向下进行整体数组的强制类型转换不可以的。
如下图,String[]Object[]是可行的,但是向下进行整体数组的强制类型转换不可以的。
没有出现编译错误,但会有运行时ClassCastException异常。
在这里插入图片描述

3.5 Map 接口说明

Map官方文档

3.6 Map 常用方法说明

在这里插入图片描述

3.7 Map 示例

import java.util.Map;
import java.util.HashMap;
public class Demo {
    
    
  public static void main(String[] args) {
    
    
    Map<String, String> map = new HashMap<>();
    System.out.println(map.size());
    System.out.println(map.isEmpty());
    System.out.println(map.get("作者"));
    System.out.println(map.getOrDefault("作者", "佚名"));
    System.out.println(map.containsKey("作者"));
    System.out.println(map.containsValue("佚名"));
    map.put("作者", "鲁迅");
    map.put("标题", "狂人日记");
    map.put("发表时间", "1918年");
    System.out.println(map.size());
    System.out.println(map.isEmpty());
    System.out.println(map.get("作者"));
    System.out.println(map.getOrDefault("作者", "佚名"));
    System.out.println(map.containsKey("作者"));
    System.out.println(map.containsValue("佚名"));
    for (Map.Entry<String, String> entry : map.entrySet()) {
    
    
      System.out.println(entry.getKey());
      System.out.println(entry.getValue());
   }
 }
}

运行结果:

0
true
null
佚名
false
false
3
false
鲁迅
鲁迅
true
false
作者
鲁迅
发表时间
1918年
标题
狂人日记
public static void main5(String[] args) {
    
    
    TreeMap<String,String> map2 = new TreeMap<>();
    map2.put("及时雨","宋江");
    map2.put("国民女神","高圆圆");
    System.out.println(map2);
//TreeMap是继承了SotedMap接口是有序的,HashMap是映射关系无序的。
    HashMap<String,String> map = new HashMap<>();
    map.put("及时雨","宋江");
    map.put("国民女神","高圆圆");
    System.out.println(map);
}
//结果为:
{
    
    及时雨=宋江, 国民女神=高圆圆}
{
    
    国民女神=高圆圆, 及时雨=宋江}

public static void main4(String[] args) {
    
    
    Map<String,String> map = new HashMap<>();
    map.put("及时雨","宋江");
    map.put("国民女神","高圆圆");
    System.out.println(map);
    System.out.println("====================");

    Set<Map.Entry<String, String>> entrySet = map.entrySet();
    for( Map.Entry<String, String> entry : entrySet) {
    
    
        System.out.println("key: "+entry.getKey()+" value:"+entry.getValue());
    }
}
//结果为:
{
    
    国民女神=高圆圆, 及时雨=宋江}
====================
key: 国民女神 value:高圆圆
key: 及时雨 value:宋江
    
public static void main3(String[] args) {
    
    
    Map<String,String> map = new HashMap<>();
    map.put("国民女神","高圆圆");
    map.put("及时雨","宋江");
    String ret2 = map.get("国民女神");
    System.out.println(ret2);
    String ret = map.getOrDefault("及时雨","博哥");
    System.out.println(ret);
    boolean flg = map.containsKey("国民女神2");
    System.out.println(flg);
}
//结果为:
高圆圆
宋江
false

Set<>集合类,集合类内部的类型是Map.Entry<String,String>
在这里插入图片描述

4. 实现 classes

在这里插入图片描述
除此之外,我们还会学习 java 中的栈 Stack

5. 下一阶段

5.1 目标

  1. 学习集合框架的基本使用
  2. 学习基本的数据结构知识
  3. 学习七大基于比较的排序算法
  4. 学习相关的 java 知识点

5.2 知识点

  1. 集合框架的使用

    1. Collection
    2. List
    3. ArrayList
    4. LinkedList
    5. Stack
    6. Queue
    7. PriorityQueue
    8. Deque
    9. Set
    10. HashSet
    11. TreeSet
    12. Map
    13. HashMap
    14. TreeMap
    15. Collections
  2. 数据结构的理论及实现

    1. 顺序表
    2. 链表
    3. 队列
    4. 二叉树
  3. 排序算法

    1. 插入排序
    2. 希尔排序
    3. 选择排序
    4. 堆排序
    5. 冒泡排序
    6. 快速排序
    7. 归并排序
  4. Java 语法

    1. 泛型 Generic
    2. 自动装箱 autobox 和自动拆箱 autounbox
    3. Object 的 equals 方法
    4. Comparable 和 Comparator 接口

内容重点总结

Java 集合框架中接口、之间的关系及其含义
Java 集合框架中接口和其各自对应的常见实现类之间的关系
下一阶段的主要课程内容

猜你喜欢

转载自blog.csdn.net/qq_43398758/article/details/121530115