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,这里就不用使用泛型也能代表任意类型,值得借鉴.

原文地址:https://www.cnblogs.com/sunnysola/p/4803463.html