Java中的集合(List,Set,Map)(知识点详解)(看完这篇就够了)
Java集合一、Java集合框架集合框架前序:集合框架概述(一)集合框架概述(二)(集合的使用场景)集合框架概述(三)(Collection接口继承树)集合框架概述(三)(Map接口继承树)二、Collection接口方法①Collection接口②Collection接口方法三、Iterator迭代器接口①使用 Iterator 接口遍历集合元素②Iterator接口的方法③ Iterator迭
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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)