集合常见的面试题
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);
}
}