集合常见的面试题

集合常见的面试题

1、你在开发种常用的集合有哪些?

如果没有特殊要求,且元素是单列元素的话,使用ArrayList居多,如果是键值对元素的话,默认使用HashMap居多
其他的集合根据查询或者增删的需求,或者线程安全或不安全来选择。

2、HashMap和Hashtable的区别

共同点:都是实现了Map接口的实现子类,元素都是以键值对的方式存储
不同点:
1、HashMap键和值都允许为null值,Hashtable的键和值都不允许为null值
2、HashMap线程不安全,Hashtable是线程安全的

3、List,Set,Map等接口是否都继承子Map接口

Map接口才是,List和Set是继承Collection接口的

Collection(接口)
        - List(接口) 元素有序且允许重复
            - ArrayList 底层数据结构是数组,查询快,增删慢,线程不安全,效率高
            - Vector 底层数据结构是数组,查询快,增删慢,线程安全的,效率低。即便是线程安全的,后面也不用。
            - LinkedList 底层数据结构是双链表,增删快,查询慢,线程不安全,效率高
        - Set(接口)  元素无序且唯一
            - HashSet 底层数据结构是哈希表,元素类中要重写hashCode()和equals方法,线程不安全,效率高
                - LinkedHashSet 底层数据结构是哈希表和双链表,哈希表保证了元素的唯一性,双链表保证了元素的有序,线程不安全,效率高
            - TreeSet 底层数据结构是红黑树,可以进行自定义排序
                自然排序:要求创建集合对象的时候是无参构造方法,且元素类要实现Comparable接口,并重写compareTo方法
                比较器排序:要求在创建集合对象的时候,构造方法中需要传入Comparator接口的实现子类对象,重写compare方法

Map(接口)
    - HashMap(子类)
        - LinkedHashMap(子类)
        - TreeMap(子类)

这里的 HashMap 可以在key和value传值的时候任意传入null

package com.shujia.day14;
import java.util.HashMap;

public class MianShiDemo {
    public static void main(String[] args) {
        HashMap<String, String> map1 = new HashMap<>();
     /*
            public V put(K key, V value) {
                return putVal(hash(key), key, value, false, true);
            }
     */
        map1.put("s","a");
        System.out.println(map1);
        map1.put(null,"a");
        System.out.println(map1);
        map1.put("s",null);
        System.out.println(map1);
        map1.put(null,null);
        System.out.println(map1);
    }
}

但是这里的 Hashtable 在传入值的时候key和value都不能传入null

package com.shujia.day14;
import java.util.HashMap;
import java.util.Hashtable;

public class MianShiDemo {
    public static void main(String[] args) {
           /*
        public synchronized V put(K key, V value) {
            // Make sure the value is not null
            if (value == null) {
                throw new NullPointerException();
            }

            // Makes sure the key is not already in the hashtable.
            Entry<?,?> tab[] = table;
            int hash = key.hashCode();
            int index = (hash & 0x7FFFFFFF) % tab.length;
            @SuppressWarnings("unchecked")
            Entry<K,V> entry = (Entry<K,V>)tab[index];
            for(; entry != null ; entry = entry.next) {
                if ((entry.hash == hash) && entry.key.equals(key)) {
                    V old = entry.value;
                    entry.value = value;
                    return old;
                }
        }
         */
        Hashtable<String, String> map2 = new Hashtable<>();
        map2.put("s","a");
        System.out.println(map2);
        map2.put(null,"a");
        System.out.println(map2);
        map2.put("s",null);
        System.out.println(map2);
        map2.put(null,null);
        System.out.println(map2);
    }
}

这里除了第一个可以正常传值之外,其他三个都会报错

posted @ 2024-03-08 15:30  peculiar-  阅读(9)  评论(0编辑  收藏  举报