没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
比较 List Set Map
继承
接口
Collection Collection
常见
实现
类
ArryList、
LinkedList、
Vector
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判断) 不可重复
顺序 有序
无序(实际上是由哈希值决定),但有支持
排序的实现类(TreeSet)
线程
安全
Vector线程安
全
Hashtable安全
面试官追问:说说集合有哪些类及他们各自的区别和特点?
答:
Set
TreeSet 基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找
效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
HashSet 基于HashMap实现,支持快速查找,但不支持有序性操作。并且失去了元素的插
入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。
LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。内部
使用双向链表维护元素的插入顺序。
List
ArrayList 基于动态数组实现,支持随机访问。
Vector 和 ArrayList 类似,但它是线程安全的。
LinkedList 基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元
素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。
Queue
LinkedList 可以用它来实现双向队列。
PriorityQueue 基于堆结构实现,可以用它来实现优先队列。
ArrayQueue 基于数组实现,可以用它实现双端队列,也可以作为栈。
面试官追问:说说Map有哪些类及他们各自的区别和特点?
答:
TreeMap 基于红黑树实现。
HashMap 1.7基于数组+链表实现,1.8基于数组+链表+红黑树。链表则是主要为了解决哈希冲突
而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于
阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先
进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。
HashTable 和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入
HashTable 并且不会导致数据不一致。它是遗留类,不应该去使用它。(现在可以使用
ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高(1.7
ConcurrentHashMap 引入了分段锁, 1.8 引入了红黑树)。)
LinkedHashMap 继承自 HashMap。使用双向链表来维护元素的顺序,顺序为插入顺序或者最近
最少使用(LRU)顺序。
2.详细说说 Arraylist 和 LinkedList的区别?
ArrayList :底层是基于数组实现的,查找快,增删较慢。LinkedList 不支持高效的随机元素访
问,而 ArrayList 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int
index)方法)。
LinkedList :底层是基于链表实现的。确切的说是循环双向链表(JDK1.6之前是双向循环链表、
JDK1.7之后取消了循环),查找慢、增删快。LinkedList链表由一系列表项连接而成,一个表项包
含3个部分︰元素内容、前驱表和后驱表。因此内存空间占用比ArrayList 更多。
面试官追问:ArrayList的增删一定比LinkedList要慢吗?
答:
不一定的
1. 如果增删都是在末尾来操作(每次调用的都是 remove() 和 add() ),此时 ArrayList就不需要
移动和复制数组来进行操作了。如果数据量有百万级的时,速度是会比 LinkedList 要快的。
2. 如果删除操作的位置是在中间。由于LinkedList的消耗主要是在遍历上,ArrayList的消耗主要是在
移动和复制上(底层调用的是 arrayCopy() 方法,是native方法)。LinkedList 的遍历速度是要慢于
ArrayList的复制移动速度的。如果数据量有百万级的时,还是ArrayList要快。
3.ArrayList实现 RandomAccess接口有何作用?
查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。
从源码可以看出RandomAccess 接口只是一个标志接口,只要List集合实现这个接口,就能支持快速随
机访问。通过查看 Collections 类中的 binarySearch() 方法,可以看出,判断List是否实现
RandomAccess接口来实行 indexedBinarySerach(list, key) 或 iteratorBinarySerach(list,
key) 方法。再通过查看这两个方法的源码发现:实现RandomAccess接口的List集合采用一般的 for
循环遍历,而未实现这接口则采用迭代器,即ArrayList 一般采用for循环遍历,而 LinkedList 一般采用
迭代器遍历:
public interface RandomAccess {
}
剩余14页未读,继续阅读
资源评论
射手座的程序媛
- 粉丝: 1693
- 资源: 114
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功