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

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

阅读更多

clone一个副本:

Java代码 
  1.    public Object clone() {  
  2. try {  
  3.     ArrayList<E> v = (ArrayList<E>) super.clone();  
  4.     v.elementData = Arrays.copyOf(elementData, size);  
  5.     v.modCount = 0;  
  6.     return v;  
  7. catch (CloneNotSupportedException e) {  
  8.     // this shouldn't happen, since we are Cloneable  
  9.     throw new InternalError();  
  10. }  
  11.    }  

 转换为数组:

Java代码 
  1. public Object[] toArray() {  
  2.     return Arrays.copyOf(elementData, size);//调用Arrays.copyOf()方法  
  3. }  

 下面是转换为泛型数组:

Java代码 
  1.    public <T> T[] toArray(T[] a) {  
  2.        if (a.length < size)  
  3.            // Make a new array of a's runtime type, but my contents:  
  4.            return (T[]) Arrays.copyOf(elementData, size, a.getClass());  
  5. System.arraycopy(elementData, 0, a, 0, size);  
  6.        if (a.length > size)  
  7.            a[size] = null;  
  8.        return a;  
  9.    }  

 

范围检查:臭名昭著的 IndexOutOfBoundsException异常

Java代码 
  1. private void RangeCheck(int index) {  
  2. (index >= size)//数组越界,这里没有判断小于0的情况  
  3.  throw new IndexOutOfBoundsException(  
  4. ndex: "+index+", Size: "+size);  
  5. }  

 通过下标得到一个元素:

Java代码 
  1.    public E get(int index) {  
  2. RangeCheck(index);//先检查是否越界  
  3.   
  4. return (E) elementData[index];//返回的是数组中的下标    }  

 通过下标和一个元素赋值,返回的是原先的值:

Java代码 
  1.    public E set(int index, E element) {  
  2. RangeCheck(index);//先检查是否越界  
  3.   
  4. E oldValue = (E) elementData[index];//通过临时变量把当前下标的值保存  
  5. elementData[index] = element;//赋值  
  6. return oldValue;//注意返回的是当前下标的原先值  
  7.    }  

 

添加一个新的元素到末尾,前面说道新增方法都要先调用ensureCapacity方法:

Java代码 
  1.    public boolean add(E e) {  
  2. ensureCapacity(size + 1); //大小加一 // Increments modCount!!  
  3. elementData[size++] = e;//size默认是0所以是从0开始赋值  
  4. return true;  
  5.    }  

 API文档中的说明是:将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)。通俗的说法是在指定位置插入元素,指定元素和后面的元素后移

这个方法和set(int index, E element) 不一样,set只是把元素赋值给指定的下标同时返回下标的原先值.

add(int index, E element)的判断越界是通过元素的大小来判断的

所以如果

Java代码 
  1. ArrayList list=new ArrayList();  
  2. list.add(18);  
  3. //报错,因为size元素大小还是0  
  4. //如果l  
  5. list.add(0,"")//就可以  

 

如果一致add同一下标所有后续元素索引加1

如下:

Java代码 
  1. ArrayList list=new ArrayList();  
  2. list.add(08);  
  3. list.add(08);  
  4. list.add(08);  
  5. System.out.println(list);  
  6. //结果为[8, 8, 8]  

 

:

Java代码 
  1.    public void add(int index, E element) {  
  2. if (index > size || index < 0)//判断是否越界,注意这里是以元素的个数来判断的  
  3.     throw new IndexOutOfBoundsException(  
  4.     "Index: "+index+", Size: "+size);  
  5.   
  6. ensureCapacity(size+1);  // Increments modCount!!  
  7. System.arraycopy(elementData, index, elementData, index + 1,  
  8.          size - index);  
  9. //源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到  
  10. //目标数组中的 destPos 到 destPos+length-1 位置  
  11. elementData[index] = element;  
  12. size++;//元素加一  
  13.    }  


分享到:
评论

相关推荐

    web用户管理系统源代码

    Web用户管理系统源代码分析 一、Java数据库连接 在Web用户管理系统源代码中,我们可以看到使用Java连接Oracle数据库的示例代码。首先,需要导入必要的Jar包和加载驱动程序。然后,使用DriverManager.getConnection...

    c#自动采集程序源代码

    C# 自动采集程序源代码分析 在这篇文章中,我们将对 C# 自动采集程序源代码进行分析和解释,涵盖了该程序的主要功能、变量声明、方法实现等方面。 标题和描述 该程序的标题和描述都是 "C# 自动采集程序源代码",...

    网络爬虫源代码,word文档,纯代码,开发者参考

    网络爬虫源代码解析 本文将对网络爬虫源代码进行详细的解析,了解爬虫的实现机制和关键技术要点。 爬虫的基本概念 网络爬虫是一种自动化程序,用于从互联网上抓取和提取数据。爬虫可以根据特定的规则和算法来抓取...

    (完整word)c#上位机串口通信助手源代码详解.doc

    本文档将对C#上位机串口通信助手源代码进行详细的分析和解释,旨在帮助读者更好地理解串口通信的实现机制。 首先,让我们来了解串口通信的基本概念。串口通信是一种常用的数据传输方式,它通过串口连接两个或多个...

    java项目ATM银行系统源代码.docx

    Java 项目 ATM 银行系统源代码分析 本文档是 Java 项目 ATM 银行系统的源代码,下面是对该项目的详细分析和知识点摘要: 1. Java 语言基础 在该项目中,我们可以看到大量的 Java 语言基础知识点的应用,例如: *...

    C#控制台学生成绩管理系统实训报告(含源代码)

    系统的源代码使用C#语言编写,使用ArrayList动态数组存储学生信息,使用switch语句选择应用选项,使用goto Return返回主菜单。 该系统实现了一个功能齐全的学生成绩管理系统,能够满足学生成绩管理的需求。

    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的⼤⼩时,需要进⾏扩容,对性能有⼀定的影响。 优化策略:在能有效评估...

    java类的设计举例-animal

    一.Animal类的设计要求: 根据实际需求设计Animal类,并完成以下功能: 1. 输出全部信息 2. 对2个实例进行比较 3. 使用static对共同的属性进行修饰 ...8. 利用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

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

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

    asp.net知识库

    Asp.net地址转义(分析)加强版 Web的桌面提醒(Popup) Using the Popup Object Click button only once in asp.net 2.0 Coalesys PanelBar + R.a.d Treeview +Xml 构建的Asp.net 菜单和权限管理模块 突破屏蔽限制...

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

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

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

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

    c#中动态加载水晶报表自定义字段

    二、C#中动态加载水晶报表的步骤 在C#中动态加载水晶报表需要遵循以下步骤: 1. 创建一个水晶报表模版 首先需要创建一个水晶报表模版,报表模版可以是空白的,也可以是已经设计好的报表模版。 2. 添加记录集...

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

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

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

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

    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...

Global site tag (gtag.js) - Google Analytics