java集合类
java中万物皆对象,数据封装成类,类创建对象,容器类似于存放对象的数组。容器较数组而言有以下特点:1、容器长度可变、数组在堆内存中创建后内存固定;2、容器可存放不同类型的对象,而数组元素类型在创建时需表明。两点归根结底即一点,数组内存在创建之初必须分配且不可变化。
集合作为工具,存放在java.util包中。其顶层特点由接口Collection封装。下面对其基本方法举例说明(由于接口需要继承后重写其方法,故使用实现接口的ArrayList类代替)。
import java.util.*; public class Demo1 { public static void out(Object obj){ System.out.println(obj); } public static void main(String[] args){ ArrayList al = new ArrayList(); /*添加数据方法add()*/ al.add("Collection1"); al.add("Collection2"); al.add("Collection3"); al.add("Collection4"); /*删除元素*/ al.remove(2); /*集合长度*/ out("al.size:"+al.size()); /*集合元素*/ out(al); } }
运行结果: al.size:3 [Collection1, Collection2, Collection4]
其中需要注意的是集合中存放的不是集合中存储对象的全部,而是对象的引用,即地址。
在Collection接口中还有一个较为特殊的方法:iterator()迭代器,返回值为Iterator类型的接口。
迭代器用于集合中元素的取出操作。java中集合有多种,而每种集合都是需要元素取出操作且大致处理过程保存一致:先判断集合是否还有元素,若有,继续取出。于是,将该功能提升封装,由于是附加功能,封装成接口,由类implements实现。查看java.util.AbstractList源码如下:
public Iterator<E> iterator() { return new Itr(); }
{ 。。。 private class Itr implements Iterator<E> { 。。。 public boolean hasNext() { return cursor != size(); } public E next() { 。。。 } public void remove() { 。。。 } 。。。 }
java中使用一内部类实现Iterator接口,在内部类中重写了三方法。定义内部类在于该方法存在于AbstractList类内部,且需要操作该类中私有数据。最后java提供iterator方法访问迭代器方法。如下:
Iterator it = al.iterator(); while(it.hasNext()){ out(it.next()); }
java集合类库构成了集合类的框架,Collection是基本的接口,List体系和Set体系是其常见的两种子类接口。List集合中元素有序,元素可以重复,因为每个元素对应唯一索引。Set集合中存储的对象无序,元素则不可重复。
List体系中常见的类有三种:ArrayList、LinkedList、Vector。ArrayList集合中元素存储结构为数组型,易于元素的查询操作,增删操作则随着元素个数的增加而复杂。LinkedList类中元素数据结构是双链表。增删容易查询难。Vector类存储方式也为数组,其渐渐被ArrayList代替,二者所不同在于Vector集合是同步而ArrayList不同步,当多线程对ArrayList对象进行操作时,有可能引发异常。如ArrayList对象和ArrayList列表迭代器同时作出修改操作时,报ConcurrentModificationException异常。
package CollectionDemo; import java.util.*; public class Demo1 { public static void out(Object obj){ System.out.println(obj); } public static void method(){ ArrayList al = new ArrayList(); ListIterator lt = al.listIterator(); al.add("sb1"); lt.add("sb2"); out(al); } public static void main(String[] agrs){ method(); } } 运行结果: Exception in thread "main" java.util.ConcurrentModificationException...
List体系中拥有唯一的列表迭代器ListIterator,通过List对象ListIterator()可获得对象的列表迭代器,基于List体系中元素索引一一对应的特性,其内封装的方法可以实现对应下标元素的增删改查操作,具体可查API文档。