list和set实现了collection接口。
list允许重复的元素,允许多个null元素,和数组一样,基于0的。list接口提供了特殊的迭代器:ListIterable。
list常用实现类:ArrayList、LinkedList、Vector。
ArrayList最流行,提供了使用索引的随意访问;LinkedList对于经常需要list中添加或删除元素的场景。
set不包含重复元素的集合,最多包含一个null元素。实现类:HashSet、LinkedHashSet、TreeSet。
无序容器,最流行的是基于HashMap实现的HashSet。
map常用实现类HashMap、Hashtable、LinkedHashMap、TreeMap。
Map<key,value>将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射一个值、
Map是一个接口,不是collection的子接口或实现类。Map的value可以随意有null值,但是key只能有一个null。
什么场景下使用list、set、map?
如果经常使用索引对容器中元素进行访问,使用list;
如果知道索引,那么list的实现类就用ArrayList;
如果经常添加删除元素,那么就用LinkedList;
如果需要容器中元素有序的存储,则用list;
如果保证插入元素的唯一性,可以用set的实现类;
如果以键值对的形式存储数据,用map。
ArrayList是基于数组实现的,动态数组,容量可自动增长,不是线程安全的。多线程环境下,可以使用concurrent并发包下的CopyOnWriteArrayList类。
ArrayList实现了serializable接口,支持序列化;实现了randomAccess接口,支持快速随机访问;实现了cloneable接口,可以被克隆。
linkedList是list的实现类,基于联表实现的,插入、删除元素速度快,实现了Deque接口。
Hashtable基于Dictionary类是同步的,可以用collections类的synchronizedMap()方法创建一个安全的map对象,并把它作为一个封装对象返回。
HashMap中的key、value允许为空,key只能有一个null,value可以有多个null,是线程不安全的。
Hashtable的key、value不允许为空。Hashtable的所有get/put相关操作都是synchronized的,这相当于对整个哈希表加了一个大锁,多线程访问时,只要有一个线程访问或操作对象,其他的线程都阻塞,所有的操作都是串行化的,这样性能就非常低。
如果容器中有多把锁,那么多线程访问不同段数据,就不会有锁竞争,这样就提高了并发效率。这就是concurrentHashMap的分段锁思想。
concurrentHashMap主干是segment数组,一个segment就是一个子哈希表,所以对于同一个segment的操作才考虑线程同步,不同的segment不需要考虑。
collection、List、Set、Map接口的使用,包括如何定义、初始化、赋值、取值、修改删除。
Collection c = new ArrayList();
//List l = new ArrayList();
//Set s = new HashSet();
//Map m = new HashMap();
String oldValue = "abc";String newValue = "123";
//增加
c.add(oldValue);
Iterator it = c.iterator();
while(it.hasNext()){
//取值
String str = (String)it.next();
if(str.equals(oldValue)){
//删除
c.remove(oldValue);
//修改
c.add(newValue);
}
}