Collection:
①List: Vector(Stack) , ArrayList , LinekdList
②Set: HashSet(LinkedHashSet) , TreeSet
③Queue: PriorityQueue , ArrayDeque , LinekdList
Map:
HashMap , TreeMap , HashTable(Properties)
2.Collection 和Collections 的区别?
Collection:
①是集合的顶级接口,定义了集合中统一的接口方法
②Collection接口有很多常用的实现类
③Collection的意义是为了具体的集合提供了最大化的统一操作方法
④其直接继承的接口有List和Set及Queue
Collections:
①集合的工具类
②提供了很多静态方法用于对集合元素进行排序,搜索及线程安全等操作
3.HashMap是线程安全的吗?如何得到一个线程安全的Map?
①HashMap线程不安全
②利用Collections工具类提供的synchronizedMap(map),利用装饰者设计模式,增强方法。
使用ConcurrentHashMap
HashTable
4.List和Set的区别?
①List
List:元素有序,可以通过索引获取元素,允许重复元素;底层通常是通过线性表(数组,链表)实现;
②Set
Set:元素无序,不可以通过索引获取元素,不允许重复;底层通常是通过二叉搜索树,hash表实现
5.HashMap 和Hashtable 的区别?
①Hashtable是线程安全的,HashMap线程不安全
②HashMap允许null键和null值,HashTable不允许
6.ArrayList和LinkedList的区别?
①ArrayList
ArrayList底层基于数组实现,采用动态扩容机制;
由于数组在内存中是连续的存储单元;所以在中间删除|插入元素比较慢;尾部却很快;
插入和删除的平均复杂度0(n)
根据索引查找的平均复杂度0(1)
②LinkedList
LinkedList底层基于双向非循环链表
由于双向链表可以从头部和尾部操作;所以在中间删除|插入元素比较慢;头部尾部比较快
插入和删除的平均复杂度0(n)
根据索引查找的平均复杂度0(n)
7.HashSet的实现原理
①、HashSet底层利用HashMap实现
②、HashSet中的元素存储在HashMap的key
③、HashMap的value统一采用: private static final Object PRESENT = new Object();
8.如何实现数组和List之间的转化
①、List转化为数组:toArray() T[]
②、数组转化为List:Arrays.asList(T...t) List<T>
9.ArrayList和Vector的区别
底层都是基于数组实现
①线程安全:
Vector是线程安全(synchronized)
ArrayList不是
如果需要一个线程安全的ArrayList,一般推荐CopyOnWriteArrayList
②扩容:
ArrayList扩容1.5倍
Vector默认扩容2倍
10.Queue中的peek()和poll()方法有什么区别
①peek()查看队列头部元素
②poll()出队
11.Iterator和ListIterator的区别
Iterator和ListIterator都是迭代器接口,不同的集合有不同的实现;ListIterator是Iterator的子接口
①Iterator可以遍历List也可以遍历Set,因为List和Set接口中都有:Iterator<E> iterator();
②ListIterator不能遍历Set,只有List接口中有:ListIterator<E> listIterator();
③Iterator只能向后遍历(hashNext,next),ListIterator不尽可以向后遍历,也可以向前遍历(hasPrevious,previous)
④Iterator中对集合元素的操作只有删除,ListIterator提供了获取前一个元素索引,后一个元素索引,添加元素,替换元素等方法
标签:面试题,Set,HashMap,ArrayList,元素,List,线程,集合 From: https://www.cnblogs.com/carney/p/17117671.html