Java:Java集合系统整理

1. 集合是做什么的?

Java集合类位于Java.util包中,是一个用来存放对象的容器。

2. Java集合框架

可以发现上述所有的集合类,除Map之外,都实现了Iterator接口。
Iterator可用来遍历集合类,提供有hasNext(), next(), remove()三个方法;
其子接口ListIterator在此基础上增加了add(), previous(), hasPrevious()三个方法。

3. 面试题汇总

3.1 List、Set、Map三者的区别?

List(对付顺序的好帮手): 存储的元素是顺序的,可重复的;
Set(注重独一无二的性质): 存储的元素是无序的,不可重复的;
Map(用key来搜索的专家): 使用键值对(key-value)存储,key是无序的,不可重复的;value是无序的,可重复的。

3.2 ArrayList和LinkedList的区别?

1)底层数据结构

ArrayList底层使用的是Object数组;
LinkedList底层使用的是双向链表(JDK1.6之前是循环链表,1.7之后取消了循环链表)。

2)插入和删除是否受元素位置的影响

ArrayList会;
LinkedList不会。

3)内存占用空间

ArrayList空间浪费主要体现在List结尾会预留一定的容量空间;
LinkedList空间浪费体现在每个节点需要存后继和前驱。

4)是否支持快速随机访问

随机访问是指通过元素的序号快速获取元素对象(对应于get(int index)方法)
ArrayList支持;LinkedList不支持。

3.3 ArrayList和Vector的区别?

ArrayList是List的主要实现类,底层使用Object数组实现,是线程不安全的;
Vector是List的古老实现类,底层也使用Object数组实现,是线程安全的。

3.4 HashMap和HashTable的区别?

1)线程是否安全

HashMap线程不安全,想要线程安全的话使用ConcurrentHashMap;
HashTable线程安全,内部所有的方法基本都经过synchronized修饰。

2)效率高

HashMap效率高;
HashTable基本被淘汰,不要在代码中使用它。

3)null值

HashMap允许key和value为null值,key为null只能有一个,value为null可以有多个;
HashTable不允许有null值,否则会报异常。

4)初始容量和每次扩充容量大小的不同

HashMap初始容量为16 ,扩容变为原来的2倍 ,创建时如果给定容量初始值,容量会成为设置容量的2的幂次方; -- HashMap总是使用2的幂作为哈希表的大小
HashTable初始容量为11 ,扩容每次扩为2n+1,创建时如果给定容量初始值,给定为几就是几。

5)底层数据结构

Jdk1.8后HashMap扩容机制发生了较大变化,当链表长度大于阈值8(默认)时 ,先判断数组长度如果小于64先对数组进行扩容而不转换成红黑树,之后如果链表长度大于8则将链表转成红黑树;
HashTable没有这样的机制。

参考链接:

https://www.cnblogs.com/lixiansheng/p/11348050.html

上一篇:STL源码剖析(十六)关联式容器之hashtable设计


下一篇:ng 目录详解