ArrayList--卧槽这就是源码

最近在《数据结构与算法分析(java版)》中看到了实现ArrayList的简易代码,亲自做了一下.个中的疑点还是在代码中实现了一下.其中就包括内部类Iterator对外部成员访问的问题.

 1 private class MyIterator implements Iterator<AntType> {
 2
 3         private int current = 0;
 4
 5         @Override
 6         public boolean hasNext() {
 7             return current < size();
 8         }
 9
10         @Override
11         public AntType next() {
12             if(!hasNext())
13                 throw new NoSuchElementException();
14             return theItems[current++];
15         }
16         public void remove(){
17             MyArrayList.this.remove(--current);
18         }
19     }

在14行有一个 theItems[current++],最好写法当然是MyArrayList.this.theItems[current++].

此后我又看了一下源代码,ArrayList中elementData的声明也是非常奇葩的:

1 transient Object[] elementData; // non-private to simplify nested class access

于是向百度寻找答案,说transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。说这个反正也不懂,继续往下看说用户的一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

对于后面的注释

non-private to simplify nested class access

翻译过来就是"非私有化以简化嵌套类访问",

同时可以发现一下几个构造函数中elementData 都用的this.elementData

 1    public ArrayList(int initialCapacity) {
 2         if (initialCapacity > 0) {
 3             this.elementData = new Object[initialCapacity];
 4         } else if (initialCapacity == 0) {
 5             this.elementData = EMPTY_ELEMENTDATA;
 6         } else {
 7             throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
 9         }
10     }
11
12
13     public ArrayList() {
14         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
15     }
16
17     public ArrayList(Collection<? extends E> c) {
18         elementData = c.toArray();
19         if ((size = elementData.length) != 0) {
20             // c.toArray might (incorrectly) not return Object[] (see 6260652)
21             if (elementData.getClass() != Object[].class)
22                 elementData = Arrays.copyOf(elementData, size, Object[].class);
23         } else {
24             // replace with empty array.
25             this.elementData = EMPTY_ELEMENTDATA;
26         }
27     }

对于这种方式,就暂时归为严谨吧.第一段代码中elementData的定义使用的this.elementData = new Object[initialCapacity];成员类型为Object,这里就不用使用泛型也能代表任意类型,值得借鉴.

时间: 2024-10-06 05:26:19

ArrayList--卧槽这就是源码的相关文章

Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayList有个整体认识,再学习它的源码,最后再通过例子来学习如何使用它.内容包括:第1部分 ArrayList简介第2部分 ArrayList数据结构第3部分 ArrayList源码解析(基于JDK1.6.0_45)第4部分 ArrayList遍历方式第5部分 toArray

Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayLis

【转】Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayList有个整体认识,再学习它的源码,最后再通过例子来学习如何使用它.内容包括:第1部分 ArrayList简介第2部分 ArrayList数据结构第3部分 ArrayList源码解析(基于JDK1.6.0_45)第4部分 ArrayList遍历方式第5部分 toArray

(转)Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayList有个整体认识,再学习它的源码,最后再通过例子来学习如何使用它.内容包括:第1部分 ArrayList简介第2部分 ArrayList数据结构第3部分 ArrayList源码解析(基于JDK1.6.0_45)第4部分 ArrayList遍历方式第5部分 toArray

Java 集合系列: ArrayList详细介绍(源码解析)和使用示例

概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayList有个整体认识,再学习它的源码,最后再通过例子来学习如何使用它. 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了Lis

Java中arraylist和linkedlist源码分析与性能比较

Java中arraylist和linkedlist源码分析与性能比较 1,简介 在java开发中比较常用的数据结构是arraylist和linkedlist,本文主要从源码角度分析arraylist和linkedlist的性能. 2,arraylist源码分析 Arraylist底层的数据结构是一个对象数组,有一个size的成员变量标记数组中元素的个数,如下图: * The array buffer into which the elements of the ArrayList are sto

关于ArrayList的一些源码分析

集合是Java中非常重要而且基础的内容,因为任何数据必不可少的就是该数据是如何存储的,集合的作用就是以一定的方式组织.存储数据.这里写的集合,一部分是比较常见的.一部分是不常用但是我个人平时见到过的,一些比较相似的集合(比如HashMap和Hashtable)就只讲一个,突出它们之间的区别即可. 最后,要指出一点,对于集合,我认为关注的点主要有四点: 1.是否允许空 2.是否允许重复数据 3.是否有序,有序的意思是读取数据的顺序和存放数据的顺序是否一致 4.是否线程安全 ArrayList Ar

JAVA中ArrayList的扩增源码解读

今天某位大佬问了一下我关于ArrayList扩增的大小,本人甚是愚昧,用记忆之中的答案回复了一下,大佬大手一挥,去看源码再来回答我,所以就有了这篇观后感,个人愚见,共同进步吧. 然后先二话不说,上关于ArrayList的源码: /* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to l

2.8.2 并发下的ArrayList,以及源码分析

package 第二章.并发下的ArrayList; import java.util.ArrayList;import java.util.List; /** * Created by zzq on 2018/1/19. */public class 并发下的ArrayList { static ArrayList<Integer> list=new ArrayList<Integer>(); public static class AddThread extends Threa

LinkedList插入数据效率不一定比ArrayList高,源码分析+实验对比

(一)结论 在尾部插入数据,数据量较小时LinkedList比较快,因为ArrayList要频繁扩容,当数据量大时ArrayList比较快,因为ArrayList扩容是当前容量*1.5,大容量扩容一次就能提供很多空间,当ArrayList不需扩容时效率明显比LinkedList高,因为直接数组元素赋值不需new Node 在首部插入数据,LinkedList较快,因为LinkedList遍历插入位置花费时间很小,而ArrayList需要将原数组所有元素进行一次System.arraycopy 插