赞
踩
集合框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部分上,而不是为了让程序能正常运转而将注意力于低层设计上。 通过这些在无关API之间的简易的互用性,使你免除了为改编对象或转换代码以便联合这些API而去写大量的代码。 它提高了程序速度和质量。
迭代器Iterator是一个接口,提供遍历任何集合的功能。
使用代码:
- List<String> list = new ArrayList<>();
- Iterator<String> it = list. iterator();
- while(it. hasNext()){
- String obj = it. next();
- System. out. println(obj);
- }
Iterator只能单向遍历,但是更加安全,因为它可以确保在当前遍历的集合元素被修改的时候,就会抛出ConcurrentModificationException 异常。
正确方式:
- Iterator<Integer> it = list.iterator();
- while(it.hasNext()){
- *// do something*
- it.remove();
- }
错误方式:
- for(Integer i : list){
- list.remove(i)
- }
上面的错误方式会抛出ConcurrentModificationException 异常。
优点:
缺点:
ArrayList适合顺序添加,随机访问的场景。
ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样:
- List<String> synchronizedList = Collections.synchronizedList(list);
- synchronizedList.add("aaa");
- synchronizedList.add("bbb");
-
- for (int i = 0; i < synchronizedList.size(); i++) {
- System.out.println(synchronizedList.get(i));
- }
ArrayList 实现了 Serializable 接口,这意味着 ArrayList 支持序列化。transient 的作用是说不希望 elementData 数组被序列化,重写了 writeObject 实现:
- private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{
- *// Write out element count, and any hidden stuff*
- int expectedModCount = modCount;
- s.defaultWriteObject();
- *// Write out array length*
- s.writeInt(elementData.length);
- *// Write out all elements in the proper order.*
- for (int i=0; i<size; i++)
- s.writeObject(elementData[i]);
- if (modCount != expectedModCount) {
- throw new ConcurrentModificationException();
- }
每次序列化时,先调用 defaultWriteObject() 方法序列化 ArrayList 中的非 transient 元素,然后遍历 elementData,只序列化已存入的元素,这样既加快了序列化的速度,又减小了序列化之后的文件大小。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。