Java集合

一、Java集合框架

集合框架前序:

  早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。

集合框架被设计成要满足以下几个目标。

  • 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。

  • 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。

  • 对一个集合的扩展和适应必须是简单的。

  为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
在这里插入图片描述
集合框架体系如图所示:
在这里插入图片描述

集合框架概述(一)

  • 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。
    –>数组在内存存储方面的特点:
       ①数组初始化以后,长度就确定了。
       ②数组声明的类型,就决定了进行元素初始化时的类型。
    –>数组在存储数据方面的弊端:
       ①数组初始化以后,长度就不可变了,不便于扩展。
       ②数组中提供的属性和方法少,不便于进行添加、删除、插入等操
       作,且效率不高。同时无法直接获取存储元素的个数。
       ③数组存储的数据是有序的、可以重复的。–>存储数据的特点单一
  • Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。

集合框架概述(二)(集合的使用场景)

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

集合框架概述(三)(Collection接口继承树)

在这里插入图片描述

集合框架概述(三)(Map接口继承树)

在这里插入图片描述

二、Collection接口方法

①Collection接口

  • Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法
    既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。
  • JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)
    实现。
  • 在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都
    当成 Object 类型处理;从 JDK 5.0 增加了泛型以后,Java 集合可以记住容
    器中对象的数据类型。

②Collection接口方法

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

三、Iterator迭代器接口

①使用 Iterator 接口遍历集合元素

  • Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。
  • GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。类似于“公交车上的售票员”、“火车上的乘务员”、“空姐”。
  • Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
  • Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建Iterator 对象,则必须有一个被迭代的集合。
  • 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。

②Iterator接口的方法

在这里插入图片描述

③ Iterator迭代器接口

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

④使用 foreach 循环遍历集合元素

在这里插入图片描述

四、Collection子接口一:List

①List接口概述

  • 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组
  • List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
  • List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据
    序号存取容器中的元素。
  • JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。

②List接口方法

在这里插入图片描述

③List实现类之一:ArrayList

在这里插入图片描述

④List实现类之二:LinkedList

在这里插入图片描述

⑤List实现类之二:LinkedList

在这里插入图片描述

⑥List 实现类之三:Vector

在这里插入图片描述

⑦面试题

在这里插入图片描述

五、Collection子接口二:Set

①Set 接口概述

  • Set接口是Collection的子接口,set接口没有提供额外的方法
  • Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个
    Set 集合中,则添加操作失败。
  • Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals() 方法

②Set实现类之一:HashSet

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

③重写 hashCode() 方法的基本原则

  • 在程序运行时,同一个对象多次调用 hashCode() 方法应该返回相同的值。
  • 当两个对象的 equals() 方法比较返回 true 时,这两个对象的 hashCode()
    方法的返回值也应相等。
  • 对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值。

以自定义的Customer类为例,何时需要重写equals()?

  • 当一个类有自己特有的“逻辑相等”概念,当改写equals()的时候,总是
    要改写hashCode(),根据一个类的equals方法(改写后),两个截然不
    同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode()方法,
    它们仅仅是两个对象。
  • 因此,违反了“相等的对象必须具有相等的散列码”。
  • 结论:复写equals方法的时候一般都需要同时复写hashCode方法。通
    常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。

④Eclipse/IDEA工具里hashCode()的重写

在这里插入图片描述

⑤Set实现类之二:LinkedHashSet

  • LinkedHashSet 是 HashSet 的子类
  • LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
  • LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
  • LinkedHashSet 不允许集合元素重复。

在这里插入图片描述

⑥Set实现类之三:TreeSet

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

⑦排 序—自然排序

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

⑧排 序—定制排序

在这里插入图片描述

⑨练习:在List内去除重复数字值,要求尽量简单

在这里插入图片描述

六、Map接口

①Map接口继承树

在这里插入图片描述

②Map接口概述

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

③Map接口:常用方法

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

④Map实现类之一:HashMap

在这里插入图片描述

⑤HashMap的存储结构

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

⑥HashMap源码中的重要常量

在这里插入图片描述

⑦HashMap的存储结构:JDK 1.8之前

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

⑧HashMap的存储结构:JDK 1.8

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

⑨面试题

  谈谈你对HashMap中put/get方法的认识?如果了解再谈谈HashMap的扩容机制?默认大小是多少?什么是负载因子(或填充比)?什么是吞吐临界值(或阈值、threshold)?
  面试题:负载因子值的大小,对HashMap有什么影响
在这里插入图片描述

⑩Map实现类之二:LinkedHashMap

  • LinkedHashMap 是 HashMap 的子类
  • 在HashMap存储结构的基础上,使用了一对双向链表来记录添加
    元素的顺序
  • 与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代
    顺序:迭代顺序与 Key-Value 对的插入顺序一致
    在这里插入图片描述

⑩①Map实现类之三:TreeMap

在这里插入图片描述

⑩②Map实现类之四:Hashtable

在这里插入图片描述

⑩③Map实现类之五:Properties

在这里插入图片描述

七、Collections工具类

①Collection工具类常用方法

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

②Collections常用方法:同步控制

在这里插入图片描述

③补充:Enumeration

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐