数组与集合

日期:2015-08-25点击次数:16512

      最近在整理多态、数组和集合的相关知识,所以这里就给大家简单的介绍下数组和集合的部分内容。
      我们先介绍下数组的相关知识,组就是一个容纳一组相关数据的容器,一个数组实际上就是一系列有关联的变量,数组可以分为一维数组、二维数组、多维数组。
      我们可以通过以下两种方式来声明一个数组:int[] b = new int[5]与int[] c = {1,2,3,4}。
      在JAVA的开发过程中,如果我们想要保存或访问一系列有关联的变量时,使用数组无疑是最好的选择。因为数据是一个线性的序列,所以能够使我们能够快速的访问数组中指定位置的对象。
      但是数组也有对应的不足,那就是每一个数组对象在创建的时候必须指定大小,也就是我们常说的数组的长度(容量)。当这个数组指定的容量全部被使用完全的时候,这时我们想要对数组进行扩充是一个很麻烦的事情。我们必须先创建一个更大容量的数组,然后把原来数组中的对象复制到新创建的数组中。
      所以当我们在选择放置对象的容器的时候,如果不确定需要放置对象的个数时,我们尽量不使用数组来实现。如果我们要放置的数据为基本类型,我们则必须使用数组来进行放置。
      那么当我们不能够确定容器所需的容量大小或者想要用更加复杂的方式类存放对象要怎么办呢,这我们就要使用到集合这种容器了。这里主要给大家介绍JAVA中新的集合类型:List,Set和Map。
      集合的容量会随着我们放入对象的增加,自动的去进行扩充,这样就不存出现容量不足的情况。集合也有自己的缺点,因为在设计集合这个容器的时候,设计人员并不清楚用户将来会向集合中放入什么类型的对象,所以导致对象在放入集合时候丢失了类型信息,这样就会发生一些错误。下面据个例子:
class Man
{
    private int manNumber;
    Man( int i )
    {
        manNumber = i;
    }
    void print()
    {
        System.out.println( "Man #" + manNumber );
    }
}
class Woman
{
    private int womanNumber;
    Woman( int i )
    {
        womanNumber = i;
    }
    void print()
    {
        System.out.println( "Woman #" + womanNumber );
    }
}
public static void runWithError()
    {
        List mans = new ArrayList();
        for ( int i = 0; i < 7; i++ )
        {
            mans.add( new Man( i ) );
        }
        mans.add( new Woman( 7 ) );
        for ( int i = 0; i < mans.size(); i++ )
        {
            ( (Man) mans.elementAt( i ) ).print();
        }
    }
      上面的这段代码中,我们在runWithError方法中对集合遍历过程中,对集合中对象进行了强制类型转换,这是因为类型信息的缺失,我们在放入集合的时候不会有任何提示,但是后面会出现类型转换异常。
       JAVA的设计人员也正是因为考虑到了这种情况,所以添加了范型的概念,当我们能够明确集合中放入元素的类型时,我们只需要给集合添加泛型即可,这样该集合就只允许放入指定类型的对象,而不会出现上面例子中的错误。
      下面用一张图来展示下JAVA中新类型集合之间的关系:

      上面这幅图表名了JAVA中新类型集合之间的关系。虚线框代表接口;点线框代表抽象类。实线框代表普通类;点线箭头表示一个特定的类 准备实现一个接口;双线箭头表示一个类可生成箭头指 向的那个类的对象。
      下面分别介绍下List,Set和Map。
       List接口描述一个集合需要按照一定顺序来存放对象,List集合的子类常用的有ArrayList,LinkedList和Vector,其中除了Vector是线程安全的以外,剩余的两种均是非线程安全的。下面我们主要说下使用ArrayList和LinkedList的时机,当我们需要对List进行随机访问或遍历时通常使用ArrayList,如果我们需要频繁的对List进行插入或删除操作通常使用LinkedList。
       Set接口要求添加到集合的每个元素都必须是独一无二的,Set常用的子类有HashSet,TreeSet。只有我们需要获得一个有序的Set集合时才会使用TreeSet,其它情况下我们一般都会选择使用HashSet。
       Map接口维持“键-值”对应关系,以便通过一个键查找相应的值。常用的子类有HashMap、Hashtable、TreeMap,其中除了HashTable是线程安全的以外,剩余的两种均是非线程安全的。当我们需要频繁的放入和取出元素时通常使用HashMap,需要获得一个有序的Map时使用TreeMap。同时Map的创建时间上也是有差距的,通过测试我们得出的结果是:Hashtable: 15ms、TreeMap: 8ms、HashMap: 1ms。


 

 
软件部      李冰