集合类(一)
所谓集合类,即为Java中的一种高级数据结构。在Java编程中,常用的集合类和接口有:Vector、Emumeration、ArrayList、Collection、Iterator、Set、List等。
一、Vector类与Emumeration接口
1.概述:
(1)Vector类:是Java语言提供的一种高级数据结构,可用于保存一系列对象,Vector适用于多线程使用可同步,安全系数较高。因此,Java不支持动态数组,Vector类提供了一种与"动态数组"相近的功能。适用:如果我们不能预先确保要保存对象的数目,或是需要方便获得某个对象的存放位置。
(2)Emumeration接口类:它提供了一种访问各种数据结构(Vector类只是众多数据结构中的一种)中的所有数据的抽象机制,就是我们访问各种数据结构对象中所有元素时,都可以使用同样的方式,调用同样的方法。如我们通过Vector.elements方法返回一个Emumeration接口对象(这个对象保存了Vector集合中所有元素),再用Emueration.nextElement方法逐一取出保存在集合中的每个对象。
2.类与接口剖析
Vector<E>--------javjava.lang.Object->a.util.Vector<E>,E为泛型。
(1)构造函数
Vector():构造一个Vector对象,其内部数据数组大小为10及其标准容量增量为零。 |
Vector(Collection<? iterator访问其所有的元素 |
Vector(int initialCapacity): 构造一个Vector对象,其内部数据数组大小为capacity及其标准容量增量为零。 |
Vector(int initialCapacity, |
(2)常用方法
boolean
add(E e):在Vextor集合末尾添加一个元素(非对象)
void
addElement(E obj):添加一个对象元素到vector集合中
boolean contains(Object
o):(返回)查看集合中是否存在指定的对象元素
Enumeration<E>
elements():返回vector集合中所有的对象元素,并由其组成一个枚举对象
E
get(int index):获取指定位置的对象元素
int
hashCode():返回该Vector类的hash code值
Iterator<E>
iterator():以正确的序列返回这个列表中所有元素的迭代器
int
indexOf(Object o):返回从第一个元素开始第一次出现指定的对象元素,如果这个vector没有
int
size():计算vector集合拥有对象元素的个数
Object[]
toArray():将vector集合中所有元素存储在一个数组中
String
toString() :返回一个字符串表示的Vector类,每个元素包含的字符串表示
Enumeration<E>接口
boolean |
hasMoreElements():判定 enumeration中是否还有元素 |
E |
nextElement():返回enumeration对象中保存的一个元素(当前) |
注意:nextElement不是返回下一个对象,而是返回同指示器正指向的那个对象,并将指示器指向下一个对象。当指示器指向了一个空对象时,Enumeration.hasMoreElement方法将返回false,否则返回true,调用nextElement方法之前,指示器指向第一个对象或空对象。nextElement方法返回的是Object类型。如果我们需要整型数据,则需要对其进行类型转换,转换成Integer。
3.应用开发举例
(1)如何获取vector集合中所有对象元素及相应的内容?
Vector v=new Vector(); //创建一个vector集合类对象
Enumeration e=v.elements();//调用Vector类的elements方法获取所有对象元素并返回到一个Enumeration对象
while(e.hasMoreElements())//遍历Enumeration对象中所有的对象元素
{
Integer intObj=(Integer)e.nextElement();
//获取Enumeration中的一个Object对象元素,并将其转换为Integer类型,指示器指向下一个对象。
System.out.println(intobj.intValue());//输出Intefer对象相应的值
}
(2)如何将一个数字序列存储到vector集合中?
Vector v=new Vector(); //创建一个vector集合类对象
b=System.in.read(); //从键盘获取一个字符
int num=b-‘0‘; //将字符由b的ASCII码转换为数字,其‘0‘的ASCII码为48
v.addElement(new Integer(num)); //将一个数字转换为整型对象,存储到vector数据结构中
(3)源代码实现:从键盘上获取一个数字序列并存储到Vector数据结构中,最后在屏幕上打印每位数字相加的结果
<span style="font-family:Times New Roman;">import java.io.IOException; import java.util.Enumeration; import java.util.Vector; /*Vector集合类实现"动态数组"效果 * 实现:从键盘输入一串数字序列并存储到一种数据结构中,从数据结构中取出数字并相加*/ public class TestVector { public static void main(String[] args) { int b=0; Vector v=new Vector(); System.out.println("请输入数据:"); while(true) { //1.从键盘读取一个字节 try{ b=System.in.read(); } catch(IOException e) { System.out.println(e.getMessage()); } //2.将字节转换为Integer对象,并存储到Vector结构体中 if(b=='\r'||b=='\n') { break; //退出循环,即退出while } else { int num=b-'0'; //由于键盘输入的为字符,1的ASCII码为。。。 v.addElement(new Integer(num)); //将一个数字转换为整型对象,存储到vector数据结构中 } } //3.使用Enumeration接口取出所有Vector集合类存储的对象 int sum=0; Enumeration e=v.elements(); //a.从Vector取出所有对象元素 while(e.hasMoreElements()) //b.判定是否到末尾,取出所有数字 { Integer i=(Integer)e.nextElement();//获取一个数字元素对象,并将其转换为Integer包装类对象 sum+=i.intValue(); //读取Integer对象指定的数字 } System.out.println(sum);//输出结果 } }</span>
二、ArrayList类与Iterator接口
Java2平台发布后,Java设计者又设计了一套综合的数据结构,这些数据结构类的基本接口是Collection,它的使用非常类似于Vector类,只是方法的名称不同。我们要取出保存在实现了Collection接口对象中的所有对象,也必须通过Collection.iterator方法返回一个Iterator接口对象,Iteger接口的功能与使用同Enumeration接口非常相似。
Collection<--类似-->Vector Iterator<--类似-->Enumeration
1.概述:
(1)ArrayList类:由于不能直接用Collection接口类创建对象,而必须用实现了Collection接口的类来创建对象,而ArrayList类就是一个实现了Collection接口的类。AarrylList类是Java语言提供的一种高级数据结构,可用于保存一系列对象(存储空间可变),除了数据不能同步其他操作基本等同于Vector。(Vector适用于多线程使用可同步)如果需要同步,可以执行这步:
List list = Collections.synchronizedList(new ArrayList(...));
(2)Iterator接口:它提供了一种访问各种数据结构中的所有数据的抽象机制,就是我们访问各种数据结构对象中所有元素时,都可以使用同样的方式,调用同样的方法。功能类似于Enumeration
2.类与接口剖析
ArrayList<E>,继承于Collection<E>,
List<E>
(1)构造函数
ArrayList():构造一个空列表且容量为10的ArrayList对象
Constructs an empty list with an initial capacity of ten. |
ArrayList(Collection<? Constructsa list containing the elements of the specified collection, in the order they are returned by the collection‘s iterator. |
ArrayList(int initialCapacity): Constructsan empty list with the specified initial capacity. |
(2)常用方法
boolean add(E
e):在Vextor集合末尾添加一个元素(非对象)
boolean contains(Object o):(返回)查看集合中是否存在指定的对象元素
Enumeration<E>
elements():返回vector集合中所有的对象元素,并由其组成一个枚举对象
E get(int
index):获取指定位置的对象元素
int hashCode():返回该Vector类的hash
code值
Iterator<E>
iterator():以正确的序列返回这个列表中所有元素的迭代器
int indexOf(Object
o):返回从第一个元素开始第一次出现指定的对象元素,如果这个vector没有
int size():计算list集合拥有对象元素的个数
Object[] toArray():将vector集合中所有元素存储在一个数组中
void sort(Comparator<? super E> c):对ArrayList集合中所有元素进行排序
Iterator<E>接口,E-这个迭代器返回的元素的类型
boolean |
hasNext()
Returns |
E |
next()
Returns the next element in the iteration. |
default void |
remove()
Removes from the underlying collection the last element returned by this iterator (optional operation). |
3.应用开发举例
(1)如何获取ArrayList集合中所有对象元素及相应的内容?
ArrayList list=new ArrayList(); //创建一个vector集合类对象
Iterator i=list.iterator();//调用ArrayList类的iterator方法获取所有对象元素并返回到一个Iterator对象
while(i.hasNext())//遍历Iterator对象中所有的对象元素
{
Integer intObj=(Integer)i.next();
//获取ArrayList中的一个Object对象元素,并将其转换为Integer类型,指示器指向下一个对象。
System.out.println(intobj.intValue());//输出Intefer对象相应的值
}
(2)如何将一个数字序列存储到ArrayList集合集合中?
Vector v=new Vector(); //创建一个vector集合类对象
b=System.in.read(); //从键盘获取一个字符
int num=b-‘0‘; //将字符由b的ASCII码转换为数字,其‘0‘的ASCII码为48
v.add(new Integer(num)); //将一个数字转换为整型对象,存储到vector数据结构中
(3)源代码实现:
A.从键盘上获取一个数字序列并存储到Vector数据结构中,最后在屏幕上打印每位数字相加的结果
<span style="font-family:Times New Roman;"><span style="font-size:18px;">import java.io.IOException; import java.util.*; /*ArrayList集合类实现"动态数组"效果 * 实现:从键盘输入一串数字序列并存储到一种数据结构中,从数据结构中取出数字并相加*/ public class TestArrayList { public static void main(String[] args) { int b=0; ArrayList list=new ArrayList(); System.out.println("请输入数据:"); while(true) { //1.从键盘读取一个字节 try{ b=System.in.read(); } catch(IOException e) { System.out.println(e.getMessage()); } //2.将字节转换为Integer对象,并存储到Vector结构体中 if(b=='\r'||b=='\n') { break; //退出循环,即退出while } else { int num=b-'0'; //由于键盘输入的为字符,1的ASCII码为。。。 list.add(new Integer(num)); //将一个数字转换为整型对象,存储到vector数据结构中 } } //3.使用Enumeration接口取出所有Vector集合类存储的对象 int sum=0; Iterator i=list.iterator(); //a.从Vector取出所有对象元素 while(i.hasnext()) //b.判定是否到末尾,取出所有数字 { Integer intObj=(Integer)e.next();//获取一个数字元素对象,并将其转换为Integer包装类对象 sum+=intObj.intValue(); //读取Integer对象指定的数字 } System.out.println(sum);//输出结果 } }</span></span>
B.实现向List接口的ArrayList类对象中添加3个对象成员,然后用Collections类的sort静态方法对其进行排序
<span style="font-family:Times New Roman;"><span style="font-size:18px;">import java.util.*; public class TestSort { public static void main(String[] args) { ArrayList list=new ArrayList(); list.add(new Integer(1)); list.add(new Integer(3)); list.add(new Integer(2)); System.out.println(list.toString()); //排序前 Collections.sort(list); System.out.println(list.toString()); //排序后 } }</span></span>
总结:
1.Vector类中的所有方法都是线程同步的,两个线程并发访问Vector对象将是安全的,但只有一个线程访问Vector对象时,因为源程序仍调用了同步方法,需要额外的监视器检查,运行效率要低些。
2.ArrayList类中的所有方法都是非同步,所以在没有多线程安全问题时,最好用ArrayList,程序的效率会高些。
3.集合类接口的比较
(1)Collection------对象之间没有指定的顺序,允许重复元素;
(2)Set---------------对象之间有指定的顺序,不允许重复元素;
(3)List--------------对象之间有指定的顺序,允许重复元素。
Collection
|________>Set
|________>List
虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。List
用于遍历一个数组时效率最高;比如在循环显示所有信息时经常用到; Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象。
参考:http://docs.oracle.com/javase/8/docs/api/index.html