Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26278340
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-05-03 22:48:57

ArrayList模块整理学习

[时间:2010-5-03]

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。

笔记:此类实现了List接口

注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 方法将该列表包装起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:

List list = Collections.synchronizedList(new ArrayList(...)); //同步加锁用

构造方法摘要

() 构造一个初始容量为 10 的空列表。

示例:List alist = new ArrayList(5);

 

( c)
          
构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。

 

(int initialCapacity)
          
构造一个具有指定初始容量的空列表。

 

 

方法摘要

 boolean

( e)
          
将指定的元素添加到此列表的尾部。[可以添加 null值]

 void

(int index,  element)
          
将指定的元素插入此列表中的指定位置。

 boolean

( c)
          
按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

 boolean

(int index,  c)
          
从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。

 void

()
          
移除此列表中的所有元素。

 

() 返回此 ArrayList 实例的浅表副本

浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象。深拷贝就是两个对象的值相等,但是互相独立。C++的定义

 boolean

( o) 如果此列表中包含指定的元素,则返回 true

 void

(int minCapacity)
          
如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。

 

(int index)
          
返回此列表中指定位置上的元素。

 int

( o)
          
返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。[经常看到这个方法]

 boolean

()
          
如果此列表中没有元素,则返回 true

 int

( o)
          
返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1

 

(int index)
          
移除此列表中指定位置上的元素。

 boolean

( o)
          
移除此列表中首次出现的指定元素(如果存在)。

protected  void

(int fromIndex, int toIndex)
          
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。

 

(int index,  element)
          
用指定的元素替代此列表中指定位置上的元素。

 int

()
          
返回此列表中的元素数。

 []

()
          
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。

T[]

(T[] a)
          
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

 void

()
          
将此 ArrayList 实例的容量调整为列表的当前大小。

 

 

 

 

 

 

 

 

测试示例

public static void main(String[] args) {

        List alist = new ArrayList(5);

        if(alist.add(null))

            try {

                throw new Exception("a");

            } catch (Exception e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        if(alist.get(0) == null) {

            System.out.println("null");

        }

    }

笔记:果然是可以添加null值进来的。

1.2 分析浅拷贝与深拷贝

浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。换言之,深复制把要复制的对象所引用的对象都复制了一遍。  

PS:假如对象a引用对象b. 所谓浅拷贝就是只拷贝对象a 而对象b是不被复制的。而深拷贝的话是两个都要复制的!

示例:

ArrayList a = new ArrayList();

        for (int i = 0; i < 10; i++) {

            a.add(i);

        }

        //浅拷贝

        ArrayList b = a;

        //深拷贝

        ArrayList c = new ArrayList(a);

        //深拷贝

        ArrayList d = (ArrayList)a.clone();

        System.out.println("a:"+a.get(1)+" b:"+b.get(1)+" c:"+c.get(1)+" d:"+d.get(1)); 

        b.set(1, "bbb");

        c.set(1, "ccc");

        System.out.println("a:"+a.get(1)+" b:"+b.get(1)+" c:"+c.get(1)+" d:"+d.get(1)); 

输出:

a:1 b:1 c:1 d:1

a:bbb b:bbb c:ccc d:1

哦!我明白了。所谓深拷贝我们完全可以这样来想像。就是两份完全独立的对象了。AB之间完全是相互独立 的。不会互相受到彼此的影响。而浅拷贝的话变化任何一个对象就会影响到其他的呢!

即它们共用了一个引用对象!

 

此模块的常用代码整理


package util.concurrent;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class TestArrayList {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(1);
        list.add("abc");
        list.add(new Float(1.11));
        //在头部直接添加

        list.add(0, 2);
        list.add(0,"header");
        list.add(0,new Double(2.34));
        for (Iterator iterator = list.iterator(); iterator.hasNext();) {
            Object object = (Object) iterator.next();
            System.out.println(object);//2.34 header 2 1 abc 1.11 注意顺序

        }
        System.out.println(list.contains("header"));
        Collection c = new ArrayList();
        c.add(1);
        c.add(2);
        System.out.println(list.containsAll(c));    //true

        //如何使用VO处理问题

        List<VO> volist = new ArrayList<VO>();
        VO object = null;
        for (int i = 0; i < 5; i++) {
            object = new VO();
            object.setNameString("Name"+String.valueOf(i));
            volist.add(object);
        }
        for (Iterator iterator = volist.iterator(); iterator.hasNext();) {
            VO vo = (VO) iterator.next();
            System.out.println(vo.getNameString());
        }
    }
}

class VO {
    private String nameString;

    public String getNameString() {
        return nameString;
    }

    public void setNameString(String nameString) {
        this.nameString = nameString;
    }
    
}


阅读(829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~