`
sundful
  • 浏览: 1233034 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

List的一些知识

阅读更多

Collection继承了Iterable接口,此接口只有一个方法Iterator.实现这个接口允许对象成为“foreach”语句的目标。
Collection中定义了一些集合中需要用到的基本方法,AbstractCollection提供了Collection的骨干实现。
List实现Collection接口
AbstractList是一个抽象类,实现了List接口,继承了AbstractCollection类
AbstractList类有三个子类:AbstractSequentialList,ArrayList,Vector
ArrayList还实现了List,Cloneable等几个接口
LinkedList继承自AbstractSequentialList类,实现了List,Cloneable,Queue等几个接口
ArrayList是List接口的可变数组的实现和Vector类一样,其区别在于Vector支持线程同步,ArrayList不是同步的,你可以用两个线程同时访问一个Vector对象,当一个线程访问Vector时代码将会在同步操作上浪费相当多的时间,所以在不需要同步时使用ArrayList效率会更高。
由于ArrayList是使用循环数组实现的队列,所以按索引检索速度非常快,但在数组中间插入或删除元素效率就不高了。ArrayList多用于多获取少插入的应用。
API:
void enSureCapacity(int minCapacity)
设置该集合的初始容量。如果列表大小超过了该容量容器会自动增加。
protected void removeRange(int fromIndex, int toIndex)
移除列表中索引在fromIndex(包括)和toIndex(不包括)之间的所有元素,但此方法是protected的
E set(int index, E element)
用指定的元素替代此列表中指定位置上的元素。
Object[] toArray()
返回一个按照正确的顺序包含此列表中所有元素的数组。
<T>T[] toArray(T[] a)
返回数组的运行时类型就是指定数组的运行时类型
void trimToSize()
将此ArrayList实力的容量调整为列表的当前大小。
List的iterator和listIterator方法返回的迭代器是快速失败的。
操作需要给lise附加一个或多个Iterator,他们会维护一个独立的计数值,记录着自身修改list的次数,
如果发现计数值和该list被修改的次数不同就会抛出ConcurrentModificationException
example:
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
Iterator iterator = list.iterator();
此时给list附加了一个遍历器
并且之后对list进行构造上的改变(增加或删除元素,修改不算在内)
list.remove("a");
应用iterator
*iterator.next();
这是就会抛出ConcurrentModificationException
需要注意的是:通过Arrays.asList(T...t)返回的集合不可以进行结构上的修改(增加或删除)这样会导致发生UnsupportedOperationException
如:
List list = Arrays.asList(“a”,”b”,”c”,”d”);
list.add(“e”);或者list.remove(“a”);
这样会抛出上述异常,调用list.set(1,”f”);将正常通过,只有改变集合结构才会抛出。
可以用下述方法进行改善,避免异常的抛出:
List list = Arrays.asList(“a”,”b”,”c”,”d”);
List list1 = new ArrayList(list);
list1.add(“e”);或者list.remove(“a”);
就可以正常通过。
这只是本人使用过程中得出的结果,具体原因没有查明。
LinkedList
是list接口的链接列表实现。链表由节点组成,java中每一个节点含有三个引用,一个是其中元素的引用,一个是前一个节点的引用,一个是后一个节点的引用,链表的第一个是头部迭代器工作时指向的都是两个节点中的间隙,返回的对象都是其包含的最近的节点中元素的引用。链表结构的特点是向其中插入或删除元素非常方便,只需要把链打开插入或删除元素即可,但检索效率非常低,每一次检索一个元素都要重新从链表的头部进行检索,所以LinkedList多用于进行中间插入删除等操作而很少进行检索的应用中。
API:
void addFirst(E o)
将指定的元素插入此列表的开头。
void addLast(E o)
将指定的元素追加此列表的结尾,与add的区别只在于返回值类型不同
E getFirst()
返回此列表的第一个元素
E getLast()
返回此列表的最后一个元素
E removeFirst()
移除并返回此列表的第一个元素
E removeLast()
移除并返回此列表的最后一个元素
E element()
找到但不移除此列表的第一个元素,如果找不到则抛出NoSuchElementException
E peek()
找到但不移除此列表的第一个元素,如果找不到则返回null.
E remove()
找到并移除此列表的第一个元素,如果找不到则抛出NoSuchElementException
E poll()
找到并移除此列表的第一个元素,如果找不到则返回null
boolean offer(E o)
将指定的元素添加到此列表的末尾。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics