java面试系列--J2SE基础(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weisong530624687/article/details/79050136

9. Map、Set、List、Queue、Stack的特点与用法。

参考 https://www.cnblogs.com/yw-ah/p/5841369.html

Collection 是对象集合, Collection 有两个子接口 List 和 Set

List 可以通过下标 (1,2..) 来取得值,值可以重复

Set 只能通过游标来取值,并且值是不能重复的

 ArrayList ,Vector , LinkedList 是 List 的实现类

ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的

LinkedList 是线程不安全的,底层是由链表实现的  

Map 是键值对集合

HashTable 和HashMap 是 Map 的实现类  

HashTable 是线程安全的,不能存储 null 值  

HashMap 不是线程安全的,可以存储 null 值 

Stack类:继承自Vector,实现一个后进先出的栈。提供了几个基本方法,push、pop、peak、empty、search等。

Queue接口:提供了几个基本方法,offer、poll、peek等。已知实现类有LinkedList、PriorityQueue等。

Collection          接口的接口   对象的集合

├ List                  子接口      按进入先后有序保存   可重复

│├ LinkedList                接口实现类   链表   插入删除   没有同步   线程不安全

│├ ArrayList                  接口实现类   数组   随机访问   没有同步   线程不安全

│└ Vector                      接口实现类   数组                  同步        线程安全

│   └Stack

└ Set                  子接口       仅接收一次,并做内部排序

  ├ HashSet

  │   └ LinkedHashSet

  └ TreeSet 

对于 List ,关心的是顺序, 它保证维护元素特定的顺序(允许有相同元素),使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素。

对于 Set ,只关心某元素是否属于 Set (不 允许有相同元素 ),而不关心它的顺序。

Map                接口     键值对的集合

├ Hashtable                  接口实现类                  同步           线程安全

├ HashMap                   接口实现类                  没有同步    线程不安全

│├LinkedHashMap

│└ WeakHashMap

├ TreeMap

└ IdentifyHashMap

对于 Map ,最大的特点是键值映射,且为一一映射,键不能重复,值可以,所以是用键来索引值。 方法 put(Object key, Object value) 添加一个“值” ( 想要得东西 ) 和与“值”相关联的“键” (key) ( 使用它来查找 ) 。方法 get(Object key) 返回与给定“键”相关联的“值”。

Map 同样对每个元素保存一份,但这是基于 " 键 " 的, Map 也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet 或者LinkedHashMap.

对于效率, Map 由于采用了哈希散列,查找元素时明显比 ArrayList 快。

10. HashMap和HashTable的区别。

参考

https://www.cnblogs.com/langtianya/archive/2013/03/19/2970273.html


hashmap 线程不安全 允许有null的键和值 效率高一点 方法不是Synchronize的要提供外同步 有containsvalue和containsKey方法 HashMap 是Java1.2 引进的Map interface 的一个实现 HashMap是Hashtable的轻量级实现
hashtable 线程安全 不允许有null的键和值 效率稍低 方法是Synchronize的 有contains方法方法 Hashtable 继承于Dictionary 类 Hashtable 比HashMap 要旧

11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

(1)ConcurrentHashMap引入了一个“分段锁”的概念,对整个数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的syn关键字锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。

(2)HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。

注意:ConcurrentHashMap的读是不需要加锁的,支持完全并发的读以及一定程度并发的写,ConcurrentHashMap的迭代器是弱一致性的迭代器

12. TreeMap、HashMap、LindedHashMap的区别。

参照http://blog.csdn.net/xin_jmail/article/details/25975085

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。
Hashmap是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

13. Collection包结构,与Collections的区别。

参考https://www.cnblogs.com/fankongkong/p/5586504.html

Collection

1、Collection是集合类顶级接口;

2、实现接口和类主要有Set、List、LinkedList、ArrayList、Vector、Stack、Set;

Collections

1、是针对集合类的一个帮助类提供操作集合的工具方法

2、一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作;

3、服务于Java的Collection的框架;

 



猜你喜欢

转载自blog.csdn.net/weisong530624687/article/details/79050136