`
liuxinglanyue
  • 浏览: 548455 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ArrayList源代码分析(三)(转)

阅读更多

 删除指定位置的元素,返回被删除的元素,由于ArrayList采用一个对象数组存储元素,所以在删除一个元素时需要把后面的元素前移。删除一个元素时只是把该元素在elementData数组中的引用置为null,具体的对象的销毁由垃圾收集器负责

Java代码 
  1.    public E remove(int index) {  
  2. RangeCheck(index);//判断是否越界  
  3.   
  4. modCount++;  
  5. E oldValue = (E) elementData[index];  
  6.   
  7. int numMoved = size - index - 1;//新的数组长度  
  8. if (numMoved > 0)  
  9.     System.arraycopy(elementData, index+1, elementData, index,  
  10.              numMoved);  
  11. elementData[--size] = null// Let gc do its work  
  12.   
  13. return oldValue;//返回删除前的数据  
  14.    }  

 内部删除方法,跳过越界检查,不返回删除元素的值:ArrayList内部调用的删除方法

Java代码 
  1. /* 
  2.   * Private remove method that skips bounds checking and does not 
  3.   * return the value removed. 
  4.   */  
  5.  private void fastRemove(int index) {  
  6.      modCount++;  
  7.      int numMoved = size - index - 1;  
  8.      if (numMoved > 0)  
  9.          System.arraycopy(elementData, index+1, elementData, index,  
  10.                           numMoved);  
  11.      elementData[--size] = null// Let gc do its work  
  12.  }  

 删除指定元素:

Java代码 
  1.    public boolean remove(Object o) {  
  2. if (o == null) {  
  3.            for (int index = 0; index < size; index++)  
  4.     if (elementData[index] == null) {  
  5.         fastRemove(index);  
  6.         return true;  
  7.     }  
  8. else {  
  9.     for (int index = 0; index < size; index++)  
  10.     if (o.equals(elementData[index])) {  
  11.         fastRemove(index);  
  12.         return true;  
  13.     }  
  14.        }  
  15. return false;  
  16.    }  

 清空列表:

Java代码 
  1.    public void clear() {  
  2. modCount++;  
  3.   
  4. // Let gc do its work  
  5. for (int i = 0; i < size; i++)  
  6.     elementData[i] = null;  
  7.   
  8. size = 0;//设定元素大小为0  
  9.    }  

 

添加集合c中的元素到ArrayList的末尾,添加成功返回true,如果集合c为空,返回false。

Java代码 
  1.   public boolean addAll(Collection<? extends E> c) {  
  2. Object[] a = c.toArray();  
  3.        int numNew = a.length;  
  4. ensureCapacity(size + numNew);  // Increments modCount  
  5.        System.arraycopy(a, 0, elementData, size, numNew);//添加到列表的末尾  
  6.        size += numNew;  
  7. return numNew != 0;  
  8.    }  

 

在指定位置插入集合中的所有元素,和上面一个方法基本差不多,指定位置元素和以后的都要后移

Java代码 
  1.    public boolean addAll(int index, Collection<? extends E> c) {  
  2. if (index > size || index < 0)//判断越界   
  3.     throw new IndexOutOfBoundsException(  
  4.     "Index: " + index + ", Size: " + size);  
  5.   
  6. Object[] a = c.toArray();  
  7. int numNew = a.length;  
  8. ensureCapacity(size + numNew);  // Increments modCount  
  9.   
  10. int numMoved = size - index;  
  11. if (numMoved > 0)//两种情况  
  12.     System.arraycopy(elementData, index, elementData, index + numNew,  
  13.              numMoved);  
  14.   
  15.        System.arraycopy(a, 0, elementData, index, numNew);//这里是等于0的情况也就是说直接在数组后面加  
  16. size += numNew;  
  17. return numNew != 0;  
  18.    }  

 

删除指定范围的元素

Java代码 
  1. protected void removeRange(int fromIndex, int toIndex) {  
  2. modCount++;  
  3. int numMoved = size - toIndex;  
  4.        System.arraycopy(elementData, toIndex, elementData, fromIndex,  
  5.                         numMoved);  
  6.   
  7. // Let gc do its work  
  8. int newSize = size - (toIndex-fromIndex);  
  9. while (size != newSize)  
  10.     elementData[--size] = null;  
  11.    }  

 



分享到:
评论

相关推荐

    javajdk1.8源码-Java-source-reading:jdk1.8源代码分析

    java jdk1.8 源码 Java-source-reading 缓慢更新一些个人学习java相关源码过程中的笔记,在这里你将不可避免地看到以下情况: 个别不懂/没想好的地方留空待补全 ...ArrayList LinkedList HashMap HashSet LinkedHashMap

    javalist数据结构-Java数据结构-------List.pdf

    源代码分析 1、添加元素到列表尾端(Appends the specified element to the end of this list.) ArrayList:当所需容量超过当前ArrayList的⼤⼩时,需要进⾏扩容,对性能有⼀定的影响。 优化策略:在能有效评估...

    深入线程安全容器的实现方法

    最近写了个小程序用到了C#4.0中的线程安全集合。想起很久以前用C#2.0开发的时候写后台windows服务,为了利用多线程实现生产者和消费者模型,经常要封装一些线程安全...我们从Synchronized方法入手,分析它的源代码看是

    Note_scalad.tar.gz

    常规Java工具,算法,加密,数据库,面试题,源代码分析,解决方案: Alibaba_Druid AngularJS_String_SubString Big_Data_ETL C# CROS CrossOrigin_Request Eclipse_Referenced_File_Contains_Errors Git_Language_...

    Android编程之控件ListView使用方法

    本文实例讲述了Android编程之控件...源代码: package com.list; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.os.Bundle; import android.util.Log; import

    WindowManagerService服务是如何以堆栈的形式来组织窗口

    我们知道,在Android系统中,Activity是以堆栈的形式组织...从前面Android应用程序启动过程源代码分析一文可以知道,应用程序进程中的每一个Activity组件在Activity管理服务ActivityManagerService中都对应有一个Activi

    黑马程序员入学测试题详解

    1、 ArrayList&lt;Integer&gt; list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。 2、 编写一个类,在main方法中定义一个Map对象(采用泛型),加入若干个对象,然后遍历并打印出...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

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

    29.根据线程安全的相关知识,分析以下代码,当调用test方法时i&gt;10时是否会引起死锁?并简要说明理由。 public void test(int i) { lock(this) { if (i&gt;10) { i--; test(i); } } } 答:不会发生死锁,(但...

    二十三种设计模式【PDF版】

    主要用来对语言的分析,应用机会不多. 设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. 设计模式引言 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。...

    java记忆测试系统课程设计.doc

    5 4.1 操作界面设计 5 4.2 类成员变量及方法设计 6 4.3* 数据库设计 7 4.4 源代码分析 8 5 系统部署及使用说明 14 记忆测试系统 1. 题目简介 记忆测试系统通过回忆法测试记忆能力,测试手段分为初级,中级,高级...

    疯狂JAVA讲义

    1.5.1 编辑Java源代码 12 1.5.2 编译Java程序 13 学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 &lt;br&gt;1.1 Visual Studio开发环境安装与配置 2 &lt;br&gt;0001 安装Visual Studio 2005开发环境须知 2 &lt;br&gt;0002 配置合适的Visual Studio 2005...

    2017最新大数据架构师精英课程

    10_多线程-同步代码块-同步方法 11_多线程-生产消费问题 12_多线程-死锁问题 13_字符集问题' X4 e; v9 q' U2 W% f" l7 f$ F 14_String-StringBuffer-StringBuilder 15_集合-list-arrayList-linkedlist 16_集合-...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    2.2.7 Eclipse中的源代码编辑器 26 2.2.8 Eclipse的设置窗口 26 2.2.9 Eclipse中的其他视图 27 2.3 如何使用Eclipse 28 2.3.1 在Eclipse中创建自己的第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    2.2.7 Eclipse中的源代码编辑器 26 2.2.8 Eclipse的设置窗口 26 2.2.9 Eclipse中的其他视图 27 2.3 如何使用Eclipse 28 2.3.1 在Eclipse中创建自己的第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 ...

    Java开发技术大全 电子版

    2.5.1三种基本控制结构58 2.5.2表达式语句和空语句59 2.5.3块语句60 2.5.4if~else分支语句61 2.5.5多路分支switch~case语句69 2.5.6当型循环while语句71 2.5.7直到型循环do~while语句72 2.5.8当型循环for...

    HttpClient以及获取页面内容应用

    18. 源代码基于Apache License 可免费获取。 1.3版本 org.apache.http.impl.client.HttpClients 与 org.apache.commons.httpclient.HttpClient目前后者已被废弃,apache已不再支持。 一般而言,使用HttpClient均需...

Global site tag (gtag.js) - Google Analytics