一 Map List Set区别与联系
1. List接口:
继承自Collection接口,线性方式存储元素,即存储是有顺序的,并且元素可以重复,如:可以添加多个null。
主要实现类有ArrayList LinkedList.
ArrayList:顾名思义,它有数组的特性,相当于增强版的数组,大小可变访问元素快,插入删除慢。
如:
List arrayList=new ArrayList();
arrayList.add(null);
arrayList.add(null);
此时size=2
LinkedList:有链表属性,插入删除快,访问慢。和ArrayList一样可以添加多个null。
注意:ArrayList 和LinkedList都是线程不安全的,没有同步方法。
2. Set接口:
和List一样继承自Collection接口,关键是:集合中没有重复的对象,且存储时没有特定方式的排序。
主要实现类有:HashSet TreeSet
HashSet:
无序的Set,基于HashMap实现的,采用hashcode来决定元素的存储位置,它是无序的,线程不安全的,不可重复的。比如:
Set hashset=new HashSet();
hashset.add(null);
hashset.add(null);
此时hashset的size==1,也就是说元素只有一个。
TreeSet:
提供有序的Set集合,实际上是基于TreeMap实现的,缺省是按照自然排序,特定排序可以实现Compareble接口或者定义一个Compatator.
TreeSet不能添加null。
3. Map 接口:
存储的元素是键值对,通过key映射对应的value。
Map中key是不可重复的,相当于一个set,但映射的值可以重复,可以多个key映射到同个value。
实现类主要有HashMap TreeMap
HashMap:
采用hashcode来找到value提高效率。key/value都可以添加null,注意的是
它不同与HashTable,hashMap是线程不安全的。
TreeMap:
底层数据结构是红黑树,实现了排序功能,key/value都不可以添加null
结论:
List Set 都实现了Collection接口,但list有序可重复,Set一般无序,并且一定不重复。
Map 存储键值对key-value,而list set一个位置存一个对象.
List存入有序,set,Map存入一般无序
Set元素不可重复,Map的value和list元素可以重复
Map可以返回keySet,因为不可以重复,而value返回则是Collection,因为value值可以重复
二 Map List Set使用场景:
涉及队列,堆栈等优先考虑用List,经常插入删除用LinkedList,快速获取元素用ArrayList.
元素不可重复的用集Set ,不要求排序的优先用效率高的HashSet,如果要求元素排序,才用TreeSet。
如果数据类型是键值对的用Map,追求效率用hashMap,但如果要排序的话用TreeMap,多线程的话用hashTable,单线程用hashMap.