`
tdttyl.cwm
  • 浏览: 23798 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

[笔记]ArrayList的常用操作

    博客分类:
  • Java
阅读更多

愚公移山----ArrayList(增、删操作),虽然这些博文在网络上有很多,但是我觉得还是要经过自己写一遍之后,才能更好的沉淀下来。

 

1、新建ArrayList

        List<String> list = new ArrayList<String>();
        if(log.isDebugEnabled()){
            log.debug("ArrayList初始化长度:"+list.size());
        }

 ArrayList在new的时候,如果不指定大小,默认会Constructs an empty list with the specified initial capacity,这个specified initial capacity是10。在JDK源码中可以看到这部分代码

    public ArrayList(int initialCapacity) {
	super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
	this.elementData = (E[])new Object[initialCapacity];
    }

 身旁的同事都建议,在初始化一个ArrayList的时候,最好吧initial_capacity传进去。

 

2、添加元素

最常用的方法是add(Object)

    public boolean add(E o) {
	ensureCapacity(size + 1);  // Increments modCount!!
	elementData[size++] = o;
	return true;
    }

这个方法中的关键一步是ensureCapacity(),看源码来分析吧

    public void ensureCapacity(int minCapacity) {
        // 这个modCount是ArrayList的一个小灵魂,记录ArrayList被操作的次数
        modCount++;
        int oldCapacity = elementData.length;
        if (minCapacity > oldCapacity) {
            Object oldData[] = elementData;
            int newCapacity = (oldCapacity * 3)/2 + 1; //容量计算方法 (size*3)/2 + 1
            if (newCapacity < minCapacity)
                newCapacity = minCapacity;
            elementData = (E[])new Object[newCapacity];
            System.arraycopy(oldData, 0, elementData, 0, size); //元素拷贝
        }
    }
 

 需要关注的地方有三处:modCount 、int newCapacity=(oldCapacity*3)/2+1;、System.arraycopy(oldData,0,elementData,0,size);

 

3、移除元素

3.1 remove(index) 根据下标移除元素

    public E remove(int index) {
        RangeCheck(index); //Check if the given index is in range

        modCount++;
        E oldValue = elementData[index];

        //每次移动元素的个数,做一次删除操作,
        //被删除的元素后所有元素都会向前移动一位
        int numMoved = size - index - 1; 
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index, numMoved); //数组拷贝
        elementData[--size] = null; // Let gc do its work

        return oldValue;  //返回被移除的元素,这个地方返回之后,该元素在ArrayList中就找不到了
    }

 检查下标合法的方法RangeCheck(index)

    private void RangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(
                    "Index: "+index+", Size: "+size);
    }

 

删除操作1:

 

        for (int i = 0, j = list.size(); i < j; i++) {
            if ("obj-1".equals(list.get(i))) {
                list.remove(i);
            }
        }

 这个代码在做删除的时候会报数组越界,虽然这个时候ArrayList的容量不止这么多,但是在get的时候,回去做一次下标判断,如果大于或等于arrayList的size就会报错了,size和capacity是两个不同的概念。

 

删除操作2

 

        for (int i = 0; i < list.size(); i++) {
            if ("obj-1".equals(list.get(i))) {
                list.remove(i);
            }
        }

 这个代码是不会出错的,但是如果for循环里做了多次remove操作是有安全隐患的。

 

推荐的移除操作

 

        //使用迭代器做移除操作是最好的选择
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            if("ojb-1".equals(iterator.next())){
                iterator.remove();
            }
        }
 

 

 

分享到:
评论

相关推荐

    net学习笔记及其他代码应用

    22.常用的调用WebService的方法有哪些? 答:1.使用WSDL.exe命令行工具。 2.使用VS.NET中的Add Web Reference菜单选项 23..net Remoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域...

    Collections源码java-Java-Collections-Resize-Logic-Note:从源码角度分析Java中常用集合类的

    ArrayList是以数组实现的一个集合类,在ArrayList的源码中可以看到,所有元素都是被储存在elementData这个全局的数组变量中,而所谓的扩容也是针对这个数组对象进行操作。具体来说,当一个添加元素的动作,即add或...

    高级java笔试题-ShiftJava:学到头秃的Java的小笔记

    对象与类:继承、接口、抽象类、内部类、枚举、常用类、常用接口、注解等。 异常:异常体系等。 泛型:用法、类型参数、通配符等。 2. 集合与容器 集合容器类:队列、列表、栈、Map、Set 等结构,含 ArrayList、...

    leetcode下载-Note:我的笔记

    笔记大纲 1、Java 相关 容器(HashMap、HashSet、LinkedList、ArrayList、数组等) 需要了解其实现原理,还要灵活运用,如:自己实现 LinkedList、两个栈实现一个队列,数组实现栈,队列实现栈等。 内存模型 垃圾...

    JavaSourceCodeAnalysis:JDK二进制阅读笔记,包括Java常用集合类和Java常用和发工具(同步工具,线程安全集合,线程池)两个部分-java source code analysis

    ArrayList是基于串联实现的线性表,没有最大容量限制(实际上有,是Integer.MAX_VALUE),可扩容。LinkedList是基于串联实现的线性表(双向链表),没有最大容量限制。 LinkedList还实现了Deque接口,可以作为单向...

    Java学习笔记-个人整理的

    {7.11}文件常用操作}{114}{section.7.11} {7.12}对象序列化}{117}{section.7.12} {8}多线程}{121}{chapter.8} {8.1}线程的常用属性与方法}{121}{section.8.1} {8.2}后台线程}{123}{section.8.2} {8.3}创建线程...

    asp.net知识库

    在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN文章 —— 泛型FAQ:最佳实践 Visual C# 3.0 新特性概览 C#...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题10.ArrayList LinkedList.mp4 │ Java面试题11.HashMap和HashTable的区别.mp4 │ Java面试题12.实现一个拷贝文件的类使用字节流还是字符串.mp4 │ Java面试题13.线程的实现方式 怎么启动线程怎么区分...

    收集的常见的专业问题解决办法.rar

    2009-02-24 08:31 61003 61003 常见的专业问题解决办法\Java容器类List、ArrayList、Vector及map、HashTable、HashMap的使用与区别.rar 2009-02-24 08:29 40960 13763 常见的专业问题解决办法\java容器类介绍.doc ...

    springmybatis

    而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此...

Global site tag (gtag.js) - Google Analytics