Java
容器都有哪些?
常用容器的图录:
Collection
和 Collections
有什么区别?
java.util.Collection
是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection
接口在Java
类库中有很多具体的实现。Collection
接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List
与Set
Collections
则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作
List
、Set
、Map
之间的区别是什么?
比较 | List | Set | Map |
---|---|---|---|
继承接口 | Collection | Collection | |
常见实现类 | AbstractList (其常用子类有 ArrayList 、LinkedList 、Vector ) | AbstractSet (其常用子类有 HashSet 、LinkedHashSet 、TreeSet ) | HashMap 、HashTable |
常见方法 | add() 、remove() 、clear() 、get() 、contains() 、size() | add() 、remove() 、clear() 、contains() 、size() | put() 、get() 、remove() 、clear() 、containsKey() 、containsValue() 、keySet() 、values() 、size() |
元素 | 可重复 | 不可重复(用 equals() 判断) | 不可重复 |
顺序 | 有序 | 无序(实际上由 HashCode 决定) | |
线程安全 | Vector 线程安全 | HashTable 线程安全 |
HashMap
和 HashTable
有什么区别?
hashMap
去掉了HashTable
的contains
方法,但是加上了containsValue()
和containsKey()
方法hashTable
同步的,而HashMap
是非同步的,效率上比hashTable
要高hashMap
允许空键值,而hashTable
不允许
如何决定使用 HashMap
还是 TreeMap
?
对于在 Map
中插入、删除和定位元素这类操作,HashMap
是最好的选择。然而,假如你需要对一个有序的 key
集合进行遍历,TreeMap
是更好的选择。基于你的 collection
的大小,也许向 HashMap
中添加元素会更快,将 Map
换为 TreeMap
进行有序 key
的遍历
说一下 HashMap
的实现原理?
HashMap
概述:HashMap
是基于哈希表的 Map
接口的非同步实现。此实现提供所有可选的映射操作,并允许使用 null值
和 null键
。此类不保证映射的顺序,特别是它不保证该顺序恒久不变
HashMap
的数据结构: 在 Java
编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap
也不例外。HashMap
实际上是一个“链表散列”的数据结构,即数组和链表的结合体
当我们往 Hashmap
中 put
元素时,首先根据 key
的 hashcode
重新计算 hash
值,根据 hash
值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾。如果数组中该位置没有元素,就直接将该元素放到数组的该位置上
需要注意 JDK 1.8
中对 HashMap
的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的 O(n)
到 O(logn)
说一下 HashSet
的实现原理?
HashSet
底层由HashMap
实现HashSet
的值存放于HashMap
的key
上HashMap
的value
统一为PRESENT
ArrayList
和 LinkedList
的区别是什么?
最明显的区别是 ArrrayList
底层的数据结构是数组,支持随机访问,而 LinkedList
的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList
的时间复杂度是 O(1)
,而 LinkedList
是 O(n)
如何实现数组和 List
之间的转换?
List
转换成为数组:调用ArrayList
的toArray
方法- 数组转换成为
List
:调用Arrays
的asList
方法
ArrayList
和 Vector
的区别是什么?
Vector
是同步的,而ArrayList
不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList
ArrayList
比Vector
快,它因为有同步,不会过载ArrayList
更加通用,因为我们可以使用Collections
工具类轻易地获取同步列表和只读列表
Array
和 ArrayList
有何区别?
Array
可以容纳基本类型和对象,而ArrayList
只能容纳对象Array
是指定大小的,而ArrayList
大小是固定的Array
没有提供ArrayList
那么多功能,比如addAll
、removeAll
和iterator
等
在 Queue
中 poll()
和 remove()
有什么区别?
poll()
和 remove()
都是从队列中取出一个元素,但是 poll()
在获取元素失败的时候会返回空,但是 remove()
失败的时候会抛出异常。
哪些集合类是线程安全的?
vector
:就比arraylist
多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web
应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的statck
:堆栈类,先进后出hashtable
:就比hashmap
多了个线程安全enumeration
:枚举,相当于迭代器
迭代器 Iterator
是什么?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小
Iterator
怎么使用?有什么特点?
Java
中的 Iterator
功能比较简单,并且只能单向移动:
- 使用方法
iterator()
要求容器返回一个Iterator
。第一次调用Iterator
的next()
方法时,它返回序列的第一个元素。注意:iterator()
方法是java.lang.Iterable
接口,被Collection
继承 - 使用
next()
获得序列中的下一个元素 - 使用
hasNext()
检查序列中是否还有元素 - 使用
remove()
将迭代器新返回的元素删除
Iterator
是 Java迭代器
最简单的实现,为 List
设计的 ListIterator
具有更多的功能,它可以从两个方向遍历 List
,也可以从 List
中插入和删除元素
Iterator
和 ListIterator
有什么区别?
Iterator
可用来遍历Set
和List
集合,但是ListIterator
只能用来遍历List
Iterator
对集合只能是前向遍历,ListIterator
既可以前向也可以后向ListIterator
实现了Iterator
接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等