面试准备之集合接口及底层及特点描述
基本上找到的上层就是Collection、Map、Dictionary啦~,
首先说一下Collection和Map的区别,Collection是链表数组类型的集合List、Set,只包含一种数据结构,而Map是键值对类型的集合,包含着AbstractMap。
下面说一下List和Set的区别,其实很简单啦 List有序而Set无序,而且List可以添加重复的元素哦 Set可不行,
这里引用一下,说明一下Set和List的区别
List:1.可以允许重复的对象。
2.可以插入多个null元素。
3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。(因为链表的增加和删除比数组快,注意底层)
Set:1.不允许重复对象
2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
3. 只允许一个 null 元素
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
https://www.cnblogs.com/IvesHe/p/6108933.html
这时候问题来了,一个宝宝问:那Map接口下的集合就不能排序了嘛?一下是解决方案
-
public static void main(String[] args){
-
Map<String,String> map = new HashMap();
-
map.put("A","@");
-
map.put("W","@");
-
map.put("E","@");
-
map.put("Q","@");
-
map.put("R","@");
-
map.put("B","@");
-
map.put("U","@");
-
//这样能得到map的key和value,在某些应用中,这很有用
-
for(Entry<String,String> entry:map.entrySet()){
-
System.out.println(entry.getKey()+""+entry.getValue());
-
}
-
//如果想对Map集合的元素按照key进行排序怎么办?如下,用Collections.sort方法
-
List<Map.Entry<String, String>> list = new LinkedList<>(map.entrySet());
-
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
-
@Override
-
public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
-
return (o1.getKey()).compareTo(o2.getKey());
-
}
-
});
-
System.out.println(list);
-
}
然后就开始说Map下的hashMap TreeMap 和ConcurrentHashMap了
HashMap太多了 主要就是线程不安全,但人家速度快啊,那为了解决这个问题ConcurrentHashMap来了
ConcurrentHashMap有 concurrencyLevel:并行级别、并发数、Segment 数,怎么翻译不重要,理解它。默认是 16,也就是说 ConcurrentHashMap 有 16 个 Segments,所以理论上,这个时候,最多可以同时支持 16 个线程并发写,只要它们的操作分别分布在不同的 Segment 上。这个值可以在初始化的时候设置为其他值,但是一旦初始化以后,它是不可以扩容的。这里不赘述,相信可参考http://www.importnew.com/28263.html;