失效链接处理 |
2021年Java面试题 PDF 下载
本站整理下载:
相关截图:
主要内容:
Java 集合概览
从下图可以看出,在 Java 中除了以
结尾的类之外, 其他类都实现了
接⼝。
并且,以
结尾的类都实现了
接⼝。
说说 List,Set,Map 三者的区别?
List (对付顺序的好帮⼿): 存储的元素是有序的、可重复的。
Set (注重独⼀⽆⼆的性质): 存储的元素是⽆序的、不可重复的。
Map (⽤ Key 来搜索的专家): 使⽤键值对(kye-value)存储,类似于数学上的函数 y=f(x), “x”代表 key,"y"代表 value,Key 是⽆序的、不可重复的,value 是⽆序的、可重复的,每个键最多映射到⼀个值。
集合框架底层数据结构总结
先来看⼀下
List
接⼝下⾯的集合。
Arraylist : Object[] 数组Vector : Object[] 数组
LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
Set
HashSet (⽆序,唯⼀): 基于 HashMap 实现的,底层采⽤
来保存元素
LinkedHashSet : LinkedHashSet 是 HashSet 的⼦类,并且其内部是通过
LinkedHashMap 来实现的。有点类似于我们之前说的HashMap 实现⼀样,不过还是有⼀点点区别的TreeSet (有序,唯⼀): 红⿊树(⾃平衡的排序⼆叉树)
其内部是基于
再来看看
Map
接⼝下⾯的集合。
HashMap : JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突⽽存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较⼤的变化,当链表⻓度⼤于阈值(默认为 8)(将链表转换成红⿊树前会判断,如果当前数组的⻓度⼩于 64,那么会选择先进⾏数组扩容,⽽不是转换为红⿊树)时,将链表转化为红⿊树,以减少搜索时间
继承⾃ HashMap ,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红⿊树组成。另外, LinkedHashMap 在上⾯结构的基础上,增加了
⼀条双向链表,使得上⾯的结构可以保持键值对的插⼊顺序。同时通过对链表进⾏相应的操作, 实现了访问顺序相关逻辑。详细可以查看:《LinkedHashMap 源码详细分析(JDK1.8)》Hashtable : 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突
⽽存在的
TreeMap : 红⿊树(⾃平衡的排序⼆叉树)
如何选⽤集合?
主要根据集合的特点来选⽤,⽐如我们需要根据键值获取到元素值时就选⽤
接⼝下的集合,需
要排序时选择 TreeMap ,不需要排序时就选择 HashMap ,需要保证线程安全就选⽤
ConcurrentHashMap 。
当我们只需要存放元素值时,就选择实现 Collection 接⼝的集合,需要保证元素唯⼀时选择实现
Set 接⼝的集合⽐如
或 HashSet ,不需要就选择实现
接⼝的⽐如
或 LinkedList ,然后再根据实现这些接⼝的集合的特点来选⽤。
为什么要使⽤集合?
当我们需要保存⼀组类型相同的数据的时候,我们应该是⽤⼀个容器来保存,这个容器就是数组,但 是,使⽤数组存储对象具有⼀定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的, 于是,就出现了“集合”,集合同样也是⽤来存储多个数据的。
数组的缺点是⼀旦声明之后,⻓度就不可变了;同时,声明数组时的数据类型也决定了该数组存储的数 据的类型;⽽且,数组存储的数据是有序的、可重复的,特点单⼀。 但是集合提⾼了数据存储的灵活性,Java 集合不仅可以⽤来存储不同类型不同数量的对象,还可以保存具有映射关系的数据
Iterator 迭代器
迭代器 Iterator 是什么?
|