首页 > 代码库 > Java笔记十.集合类(一)

Java笔记十.集合类(一)

集合类(一)

   所谓集合类,即为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<? extends E> c):构造一个Vector对象,该对象的内容为Collection包含的所有元素,用于使用迭代器it    erator访问其所有的元素
Vector(int initialCapacity):构造一个Vector对象,其内部数据数组大小为capacity及其标准容量增量为零。
Vector(int initialCapacity, int capacityIncrement):构造一个Vector对象,其内部数据数组大小为capacity及其标准容量增量为increment
(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>接口
booleanhasMoreElements():判定enumeration中是否还有元素
EnextElement():返回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<? extends E> c):Constructs a list containing the elements of the specified collection, in the order they are returned by the collection‘s iterator.
ArrayList(int initialCapacity):Constructs an 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-这个迭代器返回的元素的类型
booleanhasNext()
Returns true if the iteration has more elements.
Enext()
Returns the next element in the iteration.
default voidremove()
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

Java笔记十.集合类(一)