Java 超详细图解集合框架的数据结构

目录
  • 1、什么是集合框架?
  • 2、Collection接口
    • 1.通过泛型来指定相应集合中的对象类型
    • 2.Collection常见方法使用
  • 3、Map 接口
    • Map常见方法使用
  • 4、具体的实现类

1、什么是集合框架?

在java中,有一套现成的数据结构,例如顺序表,链表,队列,栈,优先级队列,哈希表等,被封装成了相应的接口/类,供程序员直接使用,只需要创建相关的对象即可以使用,而不需要再实现其内部结构。

集合,就是将多个元素置于一个单元中,用于对这些元素进行增删改查,存储以及管理。例如,一副扑克牌(一组牌的集合)、一个通讯录(一组姓名和电话的映射关系)等等。

下图很重要!!!需要牢记其常用的接口和类!!

因为map接口没有实现Iterable接口,那么要遍历其中的元素该怎么实现呢?

		Map<Integer,String> map = new HashMap();
        map.put(1,"jack");
        map.put(2,"tom");
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        // 使用迭代器进行遍历 ,增强 for同理
        Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, String> entry =  iterator.next();
            System.out.println(entry.getKey() + " " + entry.getValue());
        }

上述以HashMap为例,可以调用其 entrySet() 方法,将map里面的每个<k,v>键值对 都封装成一个Map.Entry<Integer, String>对象,因为用Set接口接收,所以就可以使用迭代器 或者 for-each()进行遍历了,并且每个entry对象都有getKey() 和 getValue() 方法,分别获取key值和value值。

基本关系(简易版)

2、Collection接口

一般是用实现了Collection接口的接口或者类来接受具体实现类的对象,因为上图可以看出,Collection接口是一系列接口和类的父接口,其内部实现的方法比较少,所以不能调用一些子类有的常见方法。

1.通过泛型来指定相应集合中的对象类型

注意:这里传入的类型只能是引用类型,如果是基本数据类型,应该用其包装类来指定

		Collection<String> collection1 = new ArrayList();
        collection1.add("haha");
        collection1.add("world");
        Collection<Integer> collection2 = new ArrayList();
        collection2.add(1);
        collection2.add(2);
        //collection2.add("hh");// 这里会报错,不符合传入的指定类型Integer

2.Collection常见方法使用

方法 作用
void clear() 删除集合中的所有元素
boolean isEmpty() 判断集合是否没有任何元素,俗称空集合
boolean remove(Object e) 如果元素 e 出现在集合中,删除其中一个
boolean add(E e) 将元素 e 放入集合中
int size() 返回集合中的元素个数
Object[] toArray() 返回一个装有所有集合中元素的数组

注意:在最后一个Object[] toArray() 方法中,返回的是Object[] 类型的数组,底层的做法是:将集合中的元素一个一个拿出来,将其转为 Object 对象,存入要返回的数组中,最终返回一个 Object[] 类型的数组。如果直接将其转换为 String[] 类型的数组,会抛出类型转换异常。

因为这里不能保证数组中的每个元素都转成了String,而只是将其整体强转为了String[] 类型的数组,所以如果非要转,需要先遍历返回的结果,将其一个一个转为String类型,最后赋给一个String[] 类型的数组。java里不建议整体对数组类型进行转换。

		Object[] objects = collection1.toArray();
        String[] strings = new String[objects.length];
        for (int i = 0; i < objects.length; i++) {
            strings[i] = (String)objects[i];// 一个一个转,但是没啥必要
        }

3、Map 接口

通过< k, v >键值对的形式来存储数据,此处的 key 值唯一,且每个 key 值都可以对应其相应的 value 值。不同的 key 值可以对应相同的 value 。HashMap: 在存放元素时,根据其key值,调用内部的hashCode函数,找到元素该放入的位置,所以哈希表中元素不是按照存入的顺序存放的。

Map常见方法使用

方法 作用
V get(Object k) 根据指定k查找对应v
V getOrDefault(Object k, V defaultValue) 根据指定的 k 查找对应的 v,没有找到则返回默认值
V put(K key, V value) 将指定的 k-v 放入 Map
boolean containsKey(Object key) 判断是否包含 key
boolean containsValue(Object value) 判断是否包含 value
Set<Map.Entry<K, V>> entrySet() 将所有键值对返回
boolean isEmpty() 判断是否为空
int size() 返回键值对的数量
		HashMap<Integer, String> map = new HashMap<>();

        // put()
        map.put(1,"张飞");// 这里的 key 值唯一
        map.put(1,"宋江");// 如果二次插入的 key 值之前有,则替换其 value值
        map.put(2,"Jack");
        System.out.println(map);

        // get()
        String s1 = map.get(1);// 返回 宋江
        String s3 = map.getOrDefault(3,"三团");// 未找到,返回 三团

        // entrySet()
        // 该方法返回一个 Set<Map.Entry<Integer, String>> 对象
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        for (Map.Entry<Integer, String> entry : entries) {
            // 通过 entry.getKey() 和 entry.getValue() 获取每个entry对应的 k, v值
            System.out.println(entry.getKey() + " " + entry.getValue());
        }

4、具体的实现类

以上就是集合的入门知识啦~

到此这篇关于Java 超详细图解集合框架的数据结构的文章就介绍到这了,更多相关Java 集合框架 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 集合框架掌握 Map 和 Set 的使用(内含哈希表源码解读及面试常考题)

    目录 1. 搜索 1.1 场景引入 1.2 模型 2. Map 2.1 关于 Map 的介绍 2.2 关于 Map.Entry<K, V> 的介绍 2.3 Map 的常用方法说明 2.4 关于 HashMap 的介绍 2.5 关于 TreeMap 的介绍 2.6 HashMap 和 TreeMap 的区别 2.7 Map 使用示例代码 3. Set 3.1 关于 Set 的介绍 3.1 Set 的常用方法说明 3.3 关于 TreeSet 的介绍 3.4 关于 HashSet 的介绍 3.5

  • Java集合框架超详细小结

    目录 一:Collection集合 1.1集合概述: 1.2集合架构 1.3Collection集合常用方法 二:迭代器Iterator 2.1Iterator接口 2.2Iterator的实现原理: 2.3增强for() 2.4迭代器注意事项 三:泛型 3.1泛型概述 3.2泛型的优缺点 3.3泛型的定义与使用 泛型方法 泛型接口 3.4泛型的通配符 通配符高级使用-----受限泛型 四:Java常见数据结构 4.1栈 4.2队列 4.3数组 4.4链表 4.5红黑树 五:List集合体系 5

  • Java集合框架之Stack Queue Deque使用详解刨析

    目录 1. Stack 1.1 介绍 1.2 常见方法 2. Queue 2.1 介绍 2.2 常见方法 3. Deque 3.1 介绍 3.2 常见方法 1. Stack 1.1 介绍 Stack 栈是 Vector 的一个子类,它实现了一个标准的后进先出的栈.它的底层是一个数组. 堆栈只定义了默认构造函数,用来创建一个空栈.堆栈除了包括由 Vector 定义的所有方法,也定义了自己的一些方法. 1.2 常见方法 方法 描述 E push(E item) 压栈 E pop() 出栈 E pee

  • Java集合框架之List ArrayList LinkedList使用详解刨析

    目录 1. List 1.1 List 的常见方法 1.2 代码示例 2. ArrayList 2.1 介绍 2.2 ArrayList 的构造方法 2.3 ArrayList 底层数组的大小 3. LinkedList 3.1 介绍 3.2 LinkedList 的构造方法 4. 练习题 5. 扑克牌小游戏 1. List 1.1 List 的常见方法 方法 描述 boolean add(E e) 尾插 e void add(int index, E element) 将 e 插入到 inde

  • Java集合框架入门之泛型和包装类

    目录 1. 预备知识-泛型(Generic) 1.1 泛型的引入 1.2 泛型的分类 1.3 泛型类的定义 1.4 泛型编译的机制 2. 预备知识-包装类(Wrapper Class) 2.1 基本数据类型和包装类的对应关系 2.2 包装类介绍 2.3 装箱(boxing)和拆箱(unboxing) 2.4 自动装箱(autoboxing)和自动拆箱(autounboxing) 2.5 包装类面试题 前言: 本章主要是为了后面学习集合框架所做的知识补充.补充了泛型以及包装类两个知识,但是该章泛型

  • Java集合框架之Map详解

    目录 1.Map的实现 2.HashMap和Hashtable的区别 3.介绍下对象的hashCode()和equals(),使用场景 4.HashMap和TreeMap应该怎么选择,使用场景 5.Set和Map的关系TODO 6.常见Map的排序规则是怎样的? 7.如果需要线程安全,且效率高的Map,应该怎么做? 8.介绍下HashMap 9.什么是Hash碰撞?常见的解决办法有哪些,hashmap采用哪种方法? 10.HashMap底层是数组+链表+红黑树,为什么要用这几类结构呢? 11.为

  • Java集合框架之Set和Map详解

    目录 Set接口 HashSet TreeSet Map接口 HashMap TreeMap Set接口 set接口等同于Collection接口,不过其方法的行为有更严谨的定义.set的add方法不允许增加重复的元素.要适当地定义set的equals方法:只要俩个set包含同样的元素就认为它们是相同的,而不要求这些元素有相同的顺序.hashCode方法的定义要保证包含相同元素的俩个set会得到相同的散列码. --Java核心技术 卷一 public interface Set<E> exte

  • Java 集合框架之List 的使用(附小游戏练习)

    目录 1. List 1.1 List 的常见方法 1.2 代码示例 2. ArrayList 2.1 介绍 2.2 ArrayList 的构造方法 2.3 ArrayList 底层数组的大小 3. LinkedList 3.1 介绍 3.2 LinkedList 的构造方法 4. 练习题 5. 扑克牌小游戏 1. List 1.1 List 的常见方法 1.2 代码示例 注意: 下面的示例都是一份代码分开拿出来的,上下其实是有逻辑关系的 示例一: 用 List 构造一个元素为整形的顺序表 Li

  • Java 超详细图解集合框架的数据结构

    目录 1.什么是集合框架? 2.Collection接口 1.通过泛型来指定相应集合中的对象类型 2.Collection常见方法使用 3.Map 接口 Map常见方法使用 4.具体的实现类 1.什么是集合框架? 在java中,有一套现成的数据结构,例如顺序表,链表,队列,栈,优先级队列,哈希表等,被封装成了相应的接口/类,供程序员直接使用,只需要创建相关的对象即可以使用,而不需要再实现其内部结构. 集合,就是将多个元素置于一个单元中,用于对这些元素进行增删改查,存储以及管理.例如,一副扑克牌(

  • Java 超详细讲解数据结构的应用

    目录 一.bfs 二.双端队列 三.算法题 1.kotori和迷宫 2.小红找红点 3.小红玩数组  一.bfs bfs(广度优先搜索),类似二叉树的层序遍历,利用队列完成.一般用于求最短路. 图的最短路问题: 给定一个无向图,每条边的长度都是1.求1号点到x号点的最短距离. 顶点数n  边数为m q次询问  输入x 输出1到x的最短距离. 若1号点到x不连通,则输出-1 二.双端队列 双端队列的应用(区间翻转): 对于长度为n的数组,给定一个长度为m的区间,区间初始位置为a[1]到a[m].

  • Java超详细精讲数据结构之bfs与双端队列

    目录 一.bfs 二.双端队列 三.算法题 1.kotori和迷宫 2.小红找红点 3.小红玩数组 一.bfs bfs(广度优先搜索),类似二叉树的层序遍历,利用队列完成.一般用于求最短路. 图的最短路问题: 给定一个无向图,每条边的长度都是1.求1号点到x号点的最短距离. 顶点数n 边数为m q次询问 输入x 输出1到x的最短距离. 若1号点到x不连通,则输出-1 二.双端队列 双端队列的应用(区间翻转): 对于长度为n的数组,给定一个长度为m的区间,区间初始位置为a[1]到a[m]. 3种操

  • Java 超详细讲解数据结构中的堆的应用

    目录 一.堆的创建 1.向下调整(以小堆为例) 2.创建堆 3.创建堆的时间复杂度 二.堆的插入和删除 1.堆的插入 2.堆的删除 三.堆的应用 1.堆排序 2.top-k问题 [求最小的K个数] 四.常用接口的介绍 1.PriorityQueue的特性 2.优先级队列的构造 一.堆的创建 1.向下调整(以小堆为例) 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子) 如果parent的左孩子存在,即:child < size,

  • Java 超详细讲解数据结构中的堆的应用

    目录 一.堆的创建 1.向下调整(以小堆为例) 2.创建堆 3.创建堆的时间复杂度 二.堆的插入和删除 1.堆的插入 2.堆的删除 三.堆的应用 1.堆排序 2.top-k问题(求最小的K个数) 四.常用接口的介绍 1.PriorityQueue的特性 2.优先级队列的构造 一.堆的创建 1.向下调整(以小堆为例) 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子) 如果parent的左孩子存在,即:child < size, 进

  • Java 超详细讲解设计模式之原型模式讲解

    目录 传统方式 原型模式基本介绍 原型模式在spring框架中源码分析 深入讨论-浅讨论和深拷贝 原型模式的注意事项和细节 传统方式 克隆羊问题 现在有一只羊 tom,姓名为: tom,年龄为:1,颜色为:白色,请编写程序创建和 tom羊属性完全相同的10只羊. 传统方式解决克隆羊问题 思路分析(图解) 代码演示: public class Sheep { private String name; private int age; private String color; public She

  • Java超详细讲解多线程中的Process与Thread

    目录 进程和线程的关系 操作系统是如何管理进程的 并行和并发 创建线程的方法 串行执行和并发执行 Thread中的一次额重要方法 中断线程 线程等待 线程休眠(sleep) 进程和线程的关系 在操作系统中运行的程序就是进程,比如说QQ,播放器,游戏等等…程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念. 进程和线程都是为了处理并发编程这样的场景,但是进程有问题,频繁拆功创建和释放资源的时候效率低,相比之下,线程更轻量,创建和释放效率更高. 进程具有独立性,每个进程有各自独立

  • Java超详细讲解ArrayList与顺序表的用法

    目录 简要介绍 Arraylist容器类的使用 Arraylist容器类的构造 ArrayList的常见方法 ArrayList的遍历 ArrayList中的扩容机制 简要介绍 顺序表是一段物理地址连续的储存空间,一般情况下用数组储存,并在数组上完成增删查改.而在java中我们有ArrayList这个容器类封装了顺序表的方法. 在集合框架中,ArrayList是一个普通的类,其实现了list接口.其源码类定义如图 可见,其实现了RandomAccess, Cloneable, 以及Seriali

  • Java超详细教你写一个斗地主洗牌发牌系统

    目录 一.斗地主 1.前言 2.介绍 3.图解 二.准备牌 1.代码示例 2.数据展示 三.洗发牌与排序 代码示例 四.看牌(打印到控制台) 1.代码示例 2.展示 六.总结 一.斗地主 1.前言 相信每位看过<赌神>的同学都知道,里面有一种神奇的类似于魔术的力量. 没错!我们今天要说的这个神奇的东西就是:特异功能(不是) 就是:斗地主的洗牌发牌系统!!! 2.介绍 扑克牌经典游戏"斗地主"相信很多人都会玩,这次就用Java语言来编写一个斗地主的洗牌发牌程序,要求按照斗地主

  • Java超详细教你写一个学籍管理系统案例

    目录 前言 一.学籍管理系统功能介绍 1.介绍 2.学籍管理系统的主要功能图示 3.代码编写的思路 二.定义学生类 1.学生类名称: 2.包含的成员变量 3.构造方法 4.成员方法 5.代码示例 三.主界面的代码编写 1.思路 2.代码示例 四.系统功能方法的实现 1.添加学生信息的代码编写 1.1 思路 1.2 添加学生信息的方法说明图 1.3 代码示例 2.查看学生信息的代码编写 2.1 思路 2.2 查看学生信息的方法说明图 2.3 代码示例 3.删除学生信息的代码编写 3.1 思路 3.

随机推荐