数据储存一般用数组或容器集合,下标第一位都是0,集合主要有List,Set,Map 10 010 10 0x10
List特点:元素有顺序,有重复(Collection子接口)
Set特点:元素无顺序,无重复(Collection子接口)
Map特点:元素按键值对存储,无放入顺序,一个Map中不能有相同的key,每个key映射一个 value
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();//Map遍历
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
经常看到介绍 ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的。
比如A B两个线程 同时操作modelHashMap
1.B线程执行存放数据
modelHashMap.put("1","2");
2.A线程执行get获取数据
modelHashMap.get("1")
它的值本来应该是2,但是如果A线程在刚到达获取的动作还没执行的时候,
线程执行的机会又跳到线程B,此时线程B又对modelHashMap赋值 如:modelHashMap.put("1","3");
然后线程虚拟机又执行线程A,A取到的值为3,这样map中第一个存放的值 就会丢失。。。。。
之前来说,如果要保证多个线程同时访问安全性,一般使用同步集合包装器 synchronizedMap
和 synchronizedList,
而现在JDK又新增了ConcurrentHashMap
和CopyOnWriteArrayList
:
有条件的线程安全性
Map m = Collections.synchronizedMap(new HashMap()); List l= Collections.synchronizedList(new ArrayList()); synchronized (l) { Iterator i = l.iterator(); // Must be in synchronized block while (i.hasNext()) System.out.println(i.next()); }