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

什么是集合框架

数据结构,我们知道数据结构就是组织数据的一种方式,比如所链表,就是将数据存储在链表的value域中,next域就是存储下一个节点的地址,通过这样的方式将数据组织起来。
在我们学习中,所知道 的 二叉树,栈,队列等这些,在Java中都被封装起来了。
也就是说以后用的时候,在Java中不用我们自己去实现栈,列表,顺序表等操作,直接使用Java中写好的。直接拿过来用就对了。
那么集合框架的集合其实就是Java写好的一些数据结构,所以我们就需要去了解一下每一个集合,它背后的数据结构是么。
最后框架又是什么:顾名思义,就像是有一个大架子,东西分开摆放,具有层次感。
结合来说:集合框架 就是 每一种集合,它都是一定关系和关联的。

一、介绍

官方文档

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util包下的一组 接口 interfaces 和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理 manipulate,即平时我们俗称的增删查改 CRUD 。
例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)、一个通讯录(一组姓名和电话的映射关系)等等

所以我们要使用这些集合框架的时候就要导入这个包 java.util
在这里插入图片描述

1.1、类和接口总览

下面这张图并不是将所有的接口,抽象类,具体的实现类都列举出来,只是将部分重要的列举出来
interface:接口,图中和这个颜色一样的都代表是接口
abstract class :抽象类,图中和这个颜色一样的都代表是抽象类
class:具体的实现类,图中和这个颜色一样的都代表是具体的实现类
在这里插入图片描述

下面我们要了解几个问题:
1、了解清楚,接口和接口之间的关系
2、了解清楚,接口和类之间的关系
3、了解清楚,每个类背后的数据结构大概是个啥?
在这里插入图片描述

三个工具

在这里插入图片描述

二、学习的意义

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

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

2.2 笔试及面试题

腾讯-Java后台开发面经

  1. HashMap 了解不,介绍一下,如果一个对象为 key 时,hashCode 和 equals 方法的用法要注意什么?
  2. HashSet 和 HashMap 的区别是什么?
  3. HashMap 是线程安全的么?那需要线程安全需要用到什么?

阿里巴巴-Java后台开发面经

  1. ArrayList 和 LinkedList 的区别是什么?
  2. 有了解过 HashMap 的具体实现么?
  3. HashMap 和 ConcurrentHashMap 哪个效率更高?

今日头条-Java后台开发面经

  1. 编程题:判断一个链表是否是一个回文链表。
  2. Redis 的 zset 类型对应到 java 语言中大致是什么类型?
  3. hashCode 主要是用来做什么用的?

三、接口 interfaces

3.1、基本关系说明

  1. Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements

  2. Set : 元素不能重复,背后隐含着查找/搜索的语义

  3. SortedSet : 一组有序的不能重复的元素

  4. List : 线性结构

  5. Queue : 队列

  6. Deque : 双端队列

  7. Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义

  8. SortedMap : 一组有序的键值对
    在这里插入图片描述

3.2、Collection 接口说明

Collection 官方文档

3.3、Collection 常用方法说明

注意:
Collection是一个接口,不是一个类,所以不能的直接就去new。只能去new一个实现collection接口的类
接口是不能实例化的。

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

3.4、Collection代码示例

代码示例1:在集合里面添加元素

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
    }

在这里插入图片描述

代码示例2:将集合中所有元素删除

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        collection.clear();
        System.out.println(collection);
    }

在这里插入图片描述

代码示例3:判断集合中是否有元素,有返回false,没有返回true

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        boolean bool = collection.isEmpty();
        System.out.println(bool);
    }

在这里插入图片描述

代码示例4:如果元素 e 出现在集合中,删除其中一个

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        collection.remove(100);
        System.out.println(collection);
    }

在这里插入图片描述

代码示例5:返回集合中的元素个数

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        int ret = collection.size();
        System.out.println(ret);
    }

在这里插入图片描述

代码示例6:返回一个装有所有集合中元素的数组

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        Object[] str = collection.toArray();
        System.out.println(str);
        System.out.println(Arrays.toString(str));
    }

在这里插入图片描述

不建议将数组整体进行强制类型转换

如果我们将Object类型的数组强制转换成Sting类型的数组就会报错
在这里插入图片描述

但是如果我们将Sting类型的数组强制转换成Object类型的数组就不会报错
在这里插入图片描述

可以去看看在 Java 中创建泛型数组,这上面有详细的的说明

3.5、Map,接口说明

Map官方文档

3.6、Map 常用方法说明

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

代码示例7:将指定的k-v放入Map中

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
    }

在这里插入图片描述

代码示例8:根据指定的 k 查找对应的 v

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.get(2));
    }

在这里插入图片描述

代码示例9:根据指定的 k 查找对应的 v,没有找到用默认值代替

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.getOrDefault(5,"默认值"));
    }

在这里插入图片描述

代码示例10:将指定的 k-v 放入 Map

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        map.put(8,"eeee");
        map.put(4,"asddf");
        System.out.println(map);
    }

在这里插入图片描述

代码示例11:判断是否包含 key

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.containsKey(4));
    }

在这里插入图片描述

代码示例12:判断是否包含 value

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.containsValue("hello"));
    }

在这里插入图片描述

代码示例13:判断是否为空

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.isEmpty());
    }

在这里插入图片描述

代码示例14:返回键值对的数量

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.size());
    }

在这里插入图片描述

代码示例15:将所有键值对返回

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");

        Set<Map.Entry<Integer, String>> entrySet = map.entrySet();

        for (Map.Entry<Integer, String> entry: entrySet) {
            System.out.println(entry);
        }
    }

在这里插入图片描述

四、实现 classes

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Später321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值