注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

IOS & JAVA KEY

(iMilo)

 
 
 

日志

 
 
关于我

All the splendor in the world is not worth a good friend!! Hello my friend!!

网易考拉推荐

对集合类ArrayList的认识  

2011-01-25 16:38:58|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

2011-01-25

@ public void trimToSize()将此 ArrayList 实例的容量调整为列表的当前大小。应用程序可以使用此操作来最小化 ArrayList 实例的存储量。

CODE

public void trimToSize() {

    modCount++;

    int oldCapacity = elementData.length;

    if (size < oldCapacity) {

            elementData = Arrays.copyOf(elementData, size);

    }

}

说明:modCountArrayList的父类AbstractList的字段:表示从结构上修改此列表的次数。

    elementDataArrayList的字段:Object数组,事实上ArrayList中的元素就存储到此Object数组中。

    sizeArrayList的字段:表示此ArrayList的实际长度。

程序流程:首先增加列表的修改次数à保存ArrayList的实际长度à如果ArrayList的大小 < 实际长度,则调用Array.copyOf(elementData, size)ArrayList的大小调整到实际长度。

原因:为什么ArrayList的大小 < 实际长度?

    ArrayList源代码之构造函数:

    public ArrayList() {

    this(10);

}

 

    public ArrayList(int initialCapacity) {

        super();

        if (initialCapacity < 0)

            throw new IllegalArgumentException("Illegal Capacity: "+

                                               initialCapacity);

        this.elementData = new Object[initialCapacity];

    }

由此可看出ArrayList初始化时,初始大小为10,而我们实际添加的元素个数不一定是10个,还用当ArrayList中的元素超过10个时,ArrayList会自动将初始大小变为(10 * 3/2 + 1……

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

public boolean contains(Object o) {

    return indexOf(o) >= 0;

 }

@ public int indexOf(Object o)返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。更确切地讲,返回满足 (o==null ? get(i)==null : o.equals(get(i))) 的最低索引 i ,如果不存在此类索引,则返回 -1

public int indexOf(Object o) {

    if (o == null) {

        for (int i = 0; i < size; i++)

        if (elementData[i]==null)

            return i;

    } else {

        for (int i = 0; i < size; i++)

        if (o.equals(elementData[i]))

            return i;

    }

    return -1;

}

说明:对于ArrayListcontains方法实际上是调用的indexOf方法。

流程说明:对于要查找到对象o,如果是空对象,则返回第一个空元素的索引值,否则返回o.equals(elementData[i])的索引值。[oObject对象,而Objectequals方法,实际上是==]

 

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

 public E get(int index) {

    RangeCheck(index);

    return (E) elementData[index];

 }

 private void RangeCheck(int index) {

    if (index >= size)

        throw new IndexOutOfBoundsException(

        "Index: "+index+", Size: "+size);

}

流程说明:程序首先调用私有方法RangeCheck(int index),这个方法很简单,就是判断index是否符合规则,即:index是否越界,否则抛出异常,这样在get(int index)方法中就不能继续执行。

问题:为何让其抛出异常?这样做的好处?

  评论这张
 
阅读(387)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017