Java中的集合(List,Set,Map)(知识点详解)(看完这篇就够了)

Posted faramita_of_mine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的集合(List,Set,Map)(知识点详解)(看完这篇就够了)相关的知识,希望对你有一定的参考价值。

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

以上是关于Java中的集合(List,Set,Map)(知识点详解)(看完这篇就够了)的主要内容,如果未能解决你的问题,请参考以下文章

java基础知识5--集合类(Set,List,Map)和迭代器Iterator的使用

Java开发知识之Java中的集合上List接口以及子类讲解.

Java中的集合(Set,List,Map)

JAVA中的集合类:List,Set及Map的层级关系

Java中的Set,List,Map的区别

Java 集合类 List Set Map 线程安全