1、List、Set、Map 的区别

1).接口Collection<E>
 
 
2).接口List<E>
 
 

List:1.可以允许重复的对象。

     2.可以插入多个null元素。

         3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。

         4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的              随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

 
3).接口Set<E>
 

Set:1.不允许重复对象

     2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator  或者 Comparable 维                护了一个排序顺序。

        3. 只允许一个 null 元素

        4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于                HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其            compare() 和 compareTo() 的定义进行排序的有序容器。

 
4).接口Map<K,V>
 

1.Map不是collection的子接口或者实现类。Map是一个接口。

2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象           必须是唯一的。

3. TreeMap 也通过 Comparator  或者 Comparable 维护了一个排序顺序。

4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。

5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。   (HashMap、TreeMap最常用)

 
5).面试题:

(1).面试官:你说说collection里面有什么子类(其实面试的时候听到这个问题的时候,面试官是想考(List,Set)

            答:collection接口有两个常用的子接口List和Set 。List常用的实现类有ArrayList、LinkedList、Vector。Set常用的实现类有HashSet 、LinkedHashSet、TreeSet。
 
         面试官:说说List和Set(面试官是想考两者的特点)
        答:list是有序的collection  [kə'lekʃn] (也称序列)。对于此接口,用户可以对列表中每个元素的插入位置进行精确的控制,用户可以根据元素的整数索引(在列表中位置)访问元素,并搜索列表中的元素。
                list的特点:

                         1.可以允许重复的对象。

                           2.可以插入多个null元素。

                                 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。

                                 4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的 随意访问,

                                    而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

                set是一个不包含重复元素的collection。
                set的特点:
                                1.不允许重复对象
                                2. 只允许一个 null 元素
                                3. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。
                                4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于HashMap 实现的HashSet;                                    TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其compare() 和 compareTo() 的定义进行排序的有序容器。

              面试官:说说 ArrayList、LinkedList 和 Vector的区别

              答:Arraylist和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加插入元素,都允许直接序号索引元素,但是插入数据要涉及到数                                组元素移动等内存操作,所以插入数据慢,查找有下标,所以查询数据快,Vector由于使用了synchronized ['sɪŋkrənaɪzd]方法-线程安全,所以性能上比                          ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项前后项即可,插入数据较快。
                
          面试官:说说HashSet、LinkedHashSet 以及 TreeSet的区别
            答:
                    1).HashSet
                            特点:
                                     1.HashSet中不能有相同的元素,可以有一个Null元素,存入的元素是无序的。
                                     2.HashSet如何保证唯一性?
                                        1).HashSet底层数据结构是哈希表,哈希表就是存储唯一系列的表,而哈希值是由对象的hashCode()方法生成。
                                        2).确保唯一性的两个方法:hashCode()和equals()方法。(HashSet是基于HashMap的)
                                     3.添加、删除操作时间复杂度都是O(1)。
                                     4.非线程安全

                    2).LinkedHashSet

特点:
1.LinkedHashSet中不能有相同元素,可以有一个Null元素,元素严格按照放入的顺序排列。
2.LinkedHashSet如何保证有序和唯一性?
1).底层数据结构由哈希表和链表组成。
2).链表保证了元素的有序即存储和取出一致,哈希表保证了元素的唯一性。
3.添加、删除操作时间复杂度都是O(1)。
4.非线程安全

                    3).TreeSet

特点:
1.TreeSet是中不能有相同元素,不可以有Null元素,根据元素的自然顺序进行排序。
2.TreeSet如何保证元素的排序和唯一性?
底层的数据结构是红黑树(一种自平衡二叉查找树)
3.添加、删除操作时间复杂度都是O(log(n))
4.非线程安全

                 4).总结:    通过以上特点可以分析出,三者都保证了元素的唯一性,如果无排序要求可以选用HashSet;如果想取出元素的顺序和放入元素的                                顺序相同,那么可以选用LinkedHashSet。如果想插入、删除立即排序或者按照一定规则排序可以选用TreeSet。

 (2).面试官:什么场景下使用list,set,map呢?(或者会问为什么这里要用list、或者set、map,这里回                                                                                答它们的优缺点就可以了)

答:

  1. 如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。

  2. 如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。

  3. 如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。

  4. 如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择

附:列表要实现排序,需要重写comparable接口的compareTo的方法。
 
posted @ 2020-03-25 12:03  IT界的小白  阅读(285)  评论(0)    收藏  举报