问题一:Java有哪些容器?
Java集合主要包括两种类型的容器,一种是集合(Collection),一种是Map,存键值对。Collection接口有三种子类型,List,Set,Queue(队列),再下面是一些抽象类,然后是具体的实现类,常见ArrayList、LinkenList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等。
list接口存储不唯一重复、有序的对象;和数组类似,动态增长,查找效率高,插入删除效率低,会引起其他元素位置改变。
Set接口存储唯一不重复、无序对象;检索效率低,删除插入效率高,不会引起元素改变。
问题二:Collection和Collections的区别?
答:java.util.Collection是集合类的一个顶级接口,提供了对集合对象基本操作的通用接口方法。Collections是集合类的一个工具类,提供了一系列静态方法,用于对集合排序、搜索及线程安全等操作。
问题三:List、Set、Map有什么区别?
答:List、Set都继承Collection接口,Map存储的是键值对形式;
List常见子类是ArrayList、LinkedList,存储元素可重复元素,有序,其中Vector和ArrayList非常相似,但该类同步,线程安全。
Set常用子类HashSet、LinkedHashSet、TreeSet,存储元素不重复,无需。但也有有序的。
Map常见子类HashMap,Hashtable,元素不可重复,Hashtable线程安全。
问题四:HashMap和Hashtable有什么区别?
答:hashMap去掉了hashtable的contains方法加上了containsValue()和containsKey()方法。
hashtable同步,线程安全;hashMap非同步,效率更高;
hashMap允许空键值,hashtable不允许。
问题五:如何决定用HashMap还是TreeMap?
答:插入、删除和定位元素,hashMap更好,对一个有序的key集合遍历,treeMap更好。
问题六:说一下HashMap的实现原理?
答:HashMap是基于哈希表的Map接口的实现,非同步,允许空键值对,无序。java语言中基本结构有两种一种是数组,另一个是模拟指针也就是引用,所有数据结构都可以用这两个基本结构来构造。HashMap实际是一个链表散列的数据结构,即数组和链表的结合体。
往HashMap中放元素时,首先根据key重新计算hash值,根据hash值得到下标,如果已经有其他元素,在该位置的元素以链表形式存放,新放的放入链头,先放的放在链尾,如果没有直接放到该位置。jdk1.8以后,当hashMap中链表的节点数据超过八个后,链表会转为红黑树提高效率,从O(n)到O(logn)。O(n),就代表数据量增大几倍,耗时也增大几倍。O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。
问题七:说一下HashSet的实现原理?
答:底层是HashMap实现,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
问题八:ArrayList和LinkedList的区别是什么?
答:ArrayList底层的数据结构是数组,支持随机访问,LinkedList的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList时间复杂度是O(1),LinkedList是O(n)。
问题九:数组List之间如何转换?
答:调用ArrayList的toArray方法,转换为数组;
调用ArrayList的asList方法,转换为List。
问题十:ArrayList和Vector的区别?
答:vector是同步的,Arraylist不是。如果在迭代时对列表改变,应该用CopyOnWriteArrayList,它是ArrayList线程安全版本。
ArrayList比Vector快,ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。
ArrayList更通用,因为Collections工具类能轻易获取同步列表和只读列表。
问题十一:Array和ArrayList有什么区别?
答:Array可以容纳基本类型和对象,ArrayList只能容纳对象。
Array指定大小,ArrayList大小固定。
Array没有ArrayList功能多。比如addAll,removeAll,iterator。
问题十二:在Queue中poll()和remove()有什么区别?
答:意思相同,poll在获取元素失败会返回null,而remove则会报异常。
问题十三:哪些集合类线程是安全的?
Vector:比ArrayList多了个同步,但效率低,不建议使用;
statck:堆栈类,先进后出。
hashtable:就比hashMap多了个线程安全。
enumeration:枚举,相当于迭代器。
问题十四:迭代器Iterator是什么?
答:迭代器是一种设计模式,是一个对象,可以遍历并选择序列中的对象。迭代器通常被称为"轻量级"对象,创建代价小。
问题十五:Iterator怎么使用?有什么特点?
答:iterator()方法返回一个Iterator,它的next()方法,获得序列的下一个元素,hasNext()检查序列是否还有元素,remove()返回的元素删除。
问题十六:Iterator和ListIterator有什么区别?
Iterator可以遍历Set和List,ListIterator只能遍历List;
Iterator是迭代器最简单的实现,ListIterator实现了Iterator,可以从两个方向遍历List,也可以操作元素。
相关文章: