`
tdttyl.cwm
  • 浏览: 24385 次
  • 性别: 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();
            }
        }
 

 

 

分享到:
评论

相关推荐

    ArrayList的学习821.docx

    ArrayList是Java集合框架中常用的列表实现之一,它继承自List接口,该接口又继承自Collection接口。ArrayList的主要特点是其内部基于数组实现,提供了一系列便捷的操作方法。在开发中,ArrayList通常比LinkedList更...

    达内笔记(自己整理完整)

    3. 集合框架:介绍ArrayList、LinkedList、HashSet、HashMap等集合类的使用和原理。 4. 异常处理:讲解如何捕获和处理运行时错误,以及异常类的层次结构。 5. 文件与流:涉及I/O流的操作,如读写文件、数据传输等。 ...

    非常好的java笔记适合初学者

    最后,笔记可能还会涵盖集合框架,包括ArrayList、LinkedList、HashMap等常用容器,以及泛型、迭代器等概念。这部分内容对于组织和操作数据至关重要。 总的来说,这份"非常好的java笔记"是初学者学习Java编程的理想...

    java控制台版笔记本

    在控制台输出方面,`System.out.println()`是常用的方法,用于显示笔记的列表或者单独的笔记内容。如果需要更复杂的格式化输出,可以使用`printf`方法或者`String.format()`。 为了使程序具有良好的用户体验,...

    狂神说笔记内容.zip

    6. **字符串**:Java中的String类,字符串的不可变性,常用的方法如substring、indexOf、replace等。 7. **异常处理**:了解什么是异常,如何使用try-catch-finally语句进行异常处理,以及自定义异常。 8. **函数...

    java黑马笔记.rar.rar

    在Java集合框架方面,笔记会涵盖ArrayList、LinkedList、HashMap、HashSet等常用容器的使用,以及泛型、迭代器、Lambda表达式等高级特性。这些内容对于理解和操作数据至关重要。 多线程是并发编程的基础,Java提供...

    java学习笔记markdown

    这部分笔记可能涵盖了常用的类,如`String`、`ArrayList`、`HashMap`等,以及I/O流、集合框架和异常处理等。理解并熟练使用API是提高开发效率的关键。 3. **集合框架** (day18集合03.md) 集合框架是Java中处理对象...

    狂神说Java笔记资料

    6. **常用类**:Java标准库提供了大量内置类,这部分会讲解一些常用类的使用,如Math类、String类、Date类等,它们在日常开发中极其常见。 7. **异常机制**:Java的异常处理机制使得程序更加健壮。学习者将了解到...

    传智博客JAVA基础笔记个人总结

    4. **字符串与集合**:Java中的String类和集合框架(如ArrayList、LinkedList、HashSet、HashMap等)是常用的数据结构。笔记会详细讲解它们的使用方法和操作技巧,帮助学习者掌握数据存储和操作的高效方式。 5. **...

    良葛格Java学习笔记(完整版)

    对于Java集合框架,笔记会详细介绍ArrayList、LinkedList、HashSet、HashMap等常用集合类,以及它们之间的区别和选择使用场景。此外,可能还会讲解泛型、迭代器、并发容器如ConcurrentHashMap等高级话题。 在IO流...

    JavaSE精华笔记.zip

    这部分笔记可能详细介绍了这些常用类的使用,帮助开发者快速掌握日常开发中的实用工具。 4. **4.java容器.pdf**: Java集合框架是存储和管理对象的主要手段,包括ArrayList、LinkedList、HashSet、HashMap等容器。...

    毕向东史上最适合初学者入门的Java基础视频笔记

    同时,笔记还会涉及到集合框架,包括ArrayList、LinkedList、HashSet、HashMap等常用容器的使用方法,以及泛型和迭代器的概念。 线程是并发编程的基础,笔记会介绍线程的创建方式,如实现Runnable接口和继承Thread...

    java笔记 Java-Web笔记 J2EE三大框架笔记

    异常处理确保程序在遇到错误时能够优雅地处理,而集合框架如ArrayList、LinkedList、HashMap等则是存储和操作数据的重要工具。多线程和IO流则涉及并发编程和数据读写,对于高性能的Web应用至关重要。 其次,Java-...

    李兴华java word版全部笔记

    笔记会介绍ArrayList、LinkedList、HashSet、HashMap等常用集合的使用方法,以及它们之间的区别和应用场景。 【输入/输出流】 I/O流在处理文件操作和网络通信中起着至关重要的作用。笔记将详细介绍字节流和字符流...

    圣思园张龙JavaSE课堂笔记

    ArrayList、LinkedList、HashSet和HashMap等是常用的集合类。笔记会介绍如何创建和操作数组,以及如何使用集合框架进行高效的数据管理。 【方法与异常处理】 方法是代码的重用单元,通过方法可以将功能模块化。...

    李兴华javase全部笔记

    李兴华老师的课堂笔记通过实例和清晰的解释,将理论知识与实践操作相结合,使得学习过程更加生动有效。通过深入学习这些笔记,读者可以逐步提升自己的编程技能,为从事Java开发打下坚实的基础。

    java se学习笔记

    - **ArrayList与LinkedList**:两者在存储和操作上的性能差异。 - **HashMap与HashSet**:了解它们的工作原理,以及如何选择合适的容器。 - **泛型**:泛型的使用,类型擦除的概念,以及通配符的运用。 6. **IO...

    韩顺平java从入门到精通笔记完整版

    在进阶部分,笔记会涵盖集合框架,包括List、Set、Queue等接口以及ArrayList、LinkedList、HashSet、HashMap等具体实现类的使用。此外,IO流和NIO(非阻塞I/O)也是重要章节,它们是处理输入输出的基础。 多线程...

    java.rar黑马java基础笔记

    - **ArrayList与LinkedList**:学习这两种常用的动态数组实现,了解其增删改查操作的时间复杂度。 - **HashSet与HashMap**:理解无序不重复元素的存储和基于键值对的快速查找。 - **ArrayList与LinkedList的区别*...

    JAVA经典教材笔记

    - **线程常用操作方法** - 启动线程:start()方法。 - 线程睡眠:sleep(long millis)方法。 - **线程操作范例** - 示例分析:两个线程交替打印数字。 - 线程同步:解决线程安全问题。 - **同步与死锁** - 同步...

Global site tag (gtag.js) - Google Analytics