二、容器
1.java 容器都有哪些?
- 首先分为Collection、Map;Collection下分为List、Set和Queue;Map下分为HashMap、LinkedHashMap、TreeMap、WeakHashMap;
- List下分为ArrayList和LinkedList;Set下分为HashSet、LinkedHashSet和TreeSet;Queue下有PriorityQueue。
- Collection代表的是单个元素对象的序列;Map代表的是“键值对”对象的集合。
2.List、Set、Map 之间的区别是什么?
- List是一个有序的Collection,可以精确掌控元素的插入,还可以根据index获取相应位置的元素。允许重复元素的插入。它还提供了一种特殊的iterator遍历器,ListIterator。这种遍历允许遍历时插入,替换,删除,双向访问。并且还有一个重载方法允许从一个指定位置开始遍历。
- Set的核心就是集合内所有元素不重复。HashSet实现Set接口,基于HashMap进行存储。遍历时不保证顺序,并且不保证下次遍历的顺序和之前一样。HashSet中允许null元素。
- LinkedHashSet的核心就是他是一个可以保持顺序的set集合,它的数据结构是基于LinkedHashMap
- TreeSet是一组有次序的集合,如果没有指定排序规则Comparator,就会按照自然排序。TreeSet内的元素必须实现Comparable接口。
- HashMap就是最基础最常用的一种Map,它无序,以散列表的方式进行存储。之前提到过,HashSet就是基于HashMap,只使用了HashMap的key作为单个元素存储。
- LinkedHashMap的存储还是跟HashMap一样,采用哈希表方法存储,只不过LinkedHashMap多维护了一份head,tail链表。
- WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,
3.HashMap 和 Hashtable 有什么区别?ConcurrentHashMap
- Hashtable较早实现,继承的是陈旧的Dictionary类,HashMap是java1.2之后对Map接口的一个实现。
- Hashtable线程安全,HashMap线程不安全。
- Hashtable中key和value都不允许出现null值,而在HashMap中null可以作为键
- Hashtable直接使用对象的hashCode,HashMap重新计算hash值
- ConcurrentHashMap是线程安全的集合容器,可以使用Collections.synchronizedMap(HashMap)来包装HashMap作为同步容器
4.说一下 HashMap 的实现原理?
- HashMap底层就是一个数组结构,数组中的每一项又是一个链表。
- HashMap内部实现了一个Node节点,它实现了Map.Entry接口
5.说一下 HashSet 的实现原理?
- 它底层是使用HashMap,将hashset中的值放在hashmap中的key中,将hashmap的value统一设置为PRESENT,PRESENT是一个静态的类对象,Object类型,所有HashSet的实例都共享这个对象。因为key是惟一的,这就实现了set的唯一性。
- HashSet实现了Set这个接口。
6.ArrayList 和 LinkedList 的区别是什么?
- ArrayList是一个实现了List接口的可变数组,它可以插入null,它的size, isEmpty, get, set, iterator,add这些方法的时间复杂度是O(1),如果add n个数据则时间复杂度是O(n),ArrayList不是synchronized的。
- LinkedList是一个链表维护的序列容器。
- 查找方面,ArrayList的效率更高,链表必须从头查找。
- 插入删除方面,一般情况下链表的效率要比数组高不少,链表的插入只涉及几个元素,而数组需要涉及整个数组
- 在内存申请方面,数组在达到初始的申请长度之后,就需要重新申请一个更大的数组然后迁移数据;而链表只需要动态创建既可
7.如何实现数组和 List 之间的转换?
8.ArrayList 和 Vector 的区别是什么?
- ArrayList和Vector都实现了List接口,Vector支持线程的同步,访问速度比ArrayList要慢
- 还有在内存不够的时候扩展是有区别的,ArrayList默认扩展50%+1个,Vector默认扩展1倍
9.Array 和 ArrayList 有何区别?
- 可以把ArrayList看出一种会自动扩容的Array,Array是最高效的,但容量固定,而ArrayList是可扩容的,但牺牲效率
10.在 Queue 中 poll()和 remove()有什么区别?
- 这两个方法都是从队列中删除第一个元素,但如果队列元素为空,remove则会抛出异常,而poll则只是返回null
11.哪些集合类是线程安全的?
- hashtable、vector
12.迭代器 Iterator 是什么?
- 迭代器模式又称游标模式,它提供一种方法访问一个容器
- 相当于把一个Collection容器的所有对象,做成一个线性表,而iterator相当于一个指针
13.Iterator 怎么使用?有什么特点?
- 主要有三个函数,hasNext、next、remove;
- 我们不用关心各种容器的遍历机制, 只要使用Iterator , 会让人觉得各种容器的遍历方法都是一样的, 这也是java接口的重要意义.
- ArrayList, HashSet容器内是没有 hasNext(), next()的方法的,而是具有 iterator() 这个方法,
14.Iterator 和 ListIterator 有什么区别?
- listiterator有add方法,而iterator没有
- listiterator有hasPrevious和previous方法,可以实现逆向遍历。而iterator不行
- listiterator可以定位当前的索引位置,nextIndex和previousIndex都可以实现该功能。而iterator不行
- 都可以实现删除对象,但是listiterator可以通过set方法实现对象的修改,而iterator不能
15.怎么确保一个集合不能被修改?
- 可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。