第二部分 容器
18 常用的Java容器有哪些?
19 Collection和Collections有什么区别?
java.util.Collection是集合类的顶级接口,提供了对集合对象进行基本操作的通用接口方法,直接继承接口有List和Set,它的意义是为各种具体的集合对象提供最大化的统一操作方法Collections是集合类的一个工具类,其中提供了许多静态方法,用于对集合中元素进行排序,搜素和线程安全等操作
20 List,Set, Map的区别是什么?
21 HashMap和HashTable有什么区别?
- HashMap删去了HashTable的
contains(),但是添加了containsKey()和containsValue() - HashMap是非同步的,HashTable是同步的
- HashMap允许空键值,HashTable不允许有键值
22 HashMap和TreeMap
TreeMap默认按键值进行排序
23 HashMap的实现原理
HashMap是数组加链表的实现
当我们put一个元素的时候,会先根据该元素的hashcode值找到对应的下标,如果当前没有元素,则直接存放该元素,如果已经有元素了,则使用头插法插入到链表中
在JDK1.8中,如果链表的长度超过8,则会将链表转化为红黑树
24 HashSet的实现原理
- HashSet的底层是HashMap
- HashSet的值存在HashMap的键上
- HashMap的值都为
PRESENT
25 ArrayList和LinkedList的区别
- ArrayList是基于数组实现的,随机访问块,增删慢
- LinkedList是基于链表实现的,随机访问慢,增删快
26 如何实现List和数组的转换
- List转换为数组:
List.toArray() - 数组转换为List:
Arrays.asList()
27 ArrayList和Vector的区别
Vector是线程安全的,ArrayList不是
28 Array和ArrayList的区别
- Array中元素可以是对象和基本数据类型,ArrayList的元素只能是对象
- Array是固定大小的,而ArrayList不是固定大小的
- ArrayList的扩容机制
- 当ArrayList的容量为0时,扩容取决于声明时的构造函数,如果使用的是无参构造,则扩容后的容量为10, 如果使用传容量为参数构造,且一开始传的参数为0,或者使用传列表为参数构造,且一开始传入的列表为空的话,则扩容后的容量为1
- 当ArrayList的容量不为0,且已经满了,每次扩容都按1.5倍扩容
- ArrayList的扩容机制
29 在Queue中poll和remove的区别
poll和remove都是从队列中取出一个元素,区别在于poll在队列为空时返回的是null,remove在队列为空时会抛出异常
30 哪些集合类是线程安全的
- Vector
- Stack
- HashTable
- Enumeration
31 迭代器Iterator是什么
迭代器是一种设计模式,它用于遍历集合中的元素,而开发人员不需要了解其底层的数据结构。迭代器被称为轻量级的对象,创建它的代价较小
32 Iterator如何使用
- 使用
iterator()获取容器中的Iterator对象 - 使用
next()获取元素 - 使用
hasNext()判断是否有下一个元素 - 使用
remove()删除元素
33 Iterator和LinkIterator的区别
- Iterator可以遍历List和Set,LinkIterator只能用来遍历List
- Iterator只能单向遍历,LinkIterator可以双向遍历
- LinkIterator继承了Iterator,还添加了一些新的功能:增加,修改元素,返回前一个和后一个的索引