详述List、Map、Set的区别?(

(1)List:有序,可重复。

    ArrayList:底层实现的数据结构是数组,查询快,增删慢。线程不安全,效率高

    LinkedList:底层实现的数据结构是链表,查询慢,增删块。线程不安全,效率高

    Vector:底层实现的数据结构是数组,查绚块,增删慢。线程安全,效率低。

  (2)Set:无序,唯一。

    HashSet:底层数据结构是哈希表(无序,唯一)。保证元素唯一性依赖于两个方法:hashCode()和equals()

    LinkedHashSet:底层数据结构是链表和哈希表。(FIFO,有序,唯一)。通过链表保证有序性, 通过哈希表保证唯一性。

    TreeSet:底层数据结构是红黑树。(唯一,有序)

  一般。ArrayList和HashSet用的比较广泛。如果明确知道需要线程安全或者有序,就根据集合的具体特点选择使用哪一个集合。Set和List都是单列元素的集合,父接口都是Colelction,有一定的相似之处。

List表示有先后顺序的集合, 按元素先来后到的元素进行插入,当然,可以插队,使用add(int index,object e)指定元素的位置。其实并不是把对象本身存储在集合里,而是在集合中用一个索引变量指向这个对象,当集合中包含多个同样的对象时,是多个索引指向同一个对象。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。

Set里面不允许有重复的元素,即不能有两个相等(注意,不是仅仅是相同equals)的对象。所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

  (3)Map中常用的是Hash Map,HashMap,HashTable,TreeMap。

    TreeMap:有序

    HashMap:无序,线程不安全,效率高

    HashTable:无序,线程安全,效率低。

    HashMap和hashTable的区别:

        Hashtable不允许null值,HashMap允许null值(key和value都允许)

        Hashtable是Java1.1的一个类,它基于陈旧的Dictionary类。而HashMap是Java1.2引进的Map接口的一个实现。

        Hashtable是线程安全的,而HashMap是线程不安全的。如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。 查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized关键字,而HashMap的源码中则没有。

Map和List、Set不同,是双列元素的集合,不允许重复的key(equals),通过put(obj key,obj value)将元素存储到map集合中。取值时通过get(Object key),或者通过map.keySet(),map.values(),map.entrySet()获得keys,values的信息。

总结:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

3、List时如何扩容的?

lsit初始化的长度是10,当长度达到10时,再新增数据会进行扩容。每次扩容为1.5倍+1,并将之前的数据copy到新的array中去。发现不同jdk是不一样的,关于(1.5倍+1)出现在jdk1.6,其他1.7和1.8都是(1.5倍扩容)。

4、HashSet的底层实现是?

HashMap,主要利用了HashMap的键不可重复的特性。

5、Iterator的机制?

猜你喜欢

转载自blog.51cto.com/2096101/2497905
今日推荐