JDK源码阅读之旅(一)——ArrayList

ArrayList是实现List接口的类中最为常用的。现在实习的公司基本上都在用这个。。

首先我们来看下它的成员变量有哪些。

序列化的ID


默认容量为10


空List时的内部数组


默认容量时内部的数组


真正存放内容的数组

可以看到注释说明一旦有元素加入就把默认List扩展为默认容量的List


ArrayList包含内容大小

接下来看看它的构造方法们。

1.


可以定义初始容量的构造方法

如果初始容量大于0,那么内部的数组指向一个新的对象数组,数组容量为initialCapacity。如果等于0,那么指向一开始定义的空数组。

2.


空的构造方法

内部数组指向之前定义的那个空的但是有初始容量为10的数组?但是哪里定义这个数组容量为10了?可能后面才会写出来吧,先放着。

3.


参数为Collection接口的构造方法

内部数组指向参数转化后的Array。如果大小为0的话,elementData指向空数组,否则进入下一个判断。下一个判断中是为了知道重新指向后的内部数组是不是还是Object数组类型,如果不是的话,要进行转化。看一下这个copyof方法。


copyof方法

两者相同类型那么就以新长度创建一个新的Object数组,不同那么就用Array类的newInstance创建新的实例。先看下这个方法和getComponentType方法。


newInstance方法
newArray方法
获取类类型的componenttype

说实话后面这几个方法有些难,看的不是很明白,因为后面触及到了native方法。

总之,之前那一个copy变成了目标类型的具有新长度的数组。

再回到那一步,调用System.arraycopy方法。其实就是将原始数组拷贝到目标数组,但是长度是两者的最小值。最后返回这个copy数组,完成拷贝。

接下来看看它的几个常用成员方法。

1.


返回ArrayList大小

2.

判断是否为空

3.


判断某个对象是否在ArrayLIst中

看一下这个indexOf方法如何实现的。


indexOf方法

可以看到如果为空的话也会在内部数组中检查是否有空值,并且返回第一次出现空值的位置。注意了这个方法找的都是第一个出现那个值的位置。不存在的话返回-1,因为第一个是0。

4.

lastindexOf方法

这个方法跟indexOf方法类似,不过是从最后开始往前找,记下第一个出现兑现的位置。也是用的for循环查找。

5.


clone方法

这个clone方法的作用与其他的clone方法类似,就是重新创建了一个对象并且将内部数组进行了复制。

6.

转为普通数组

7.

带参数的toArray方法

内部要进行长度的判断,如果目标数组长度小的话,需要增加数组长度。如果长度一样就进行普通的拷贝。如果目标数组长度大的话,把目标数组多出来的位置置空。

8.


获取元素的get方法

先看rangeCheck方法。


检查是否越界

如果大于原本的大小的话会抛出常见的越界异常。

然后是elementData方法。


elementData方法

好吧,就是取了数组中的第几个元素。

9.

设置某个位置的值

先是之前的rangeCheck方法检验是否越界。之后就将新的值设置进去,但是注意了,返回的是旧的值,也就是被替换掉的oldValue。

10.


在尾部添加元素

11.


某个特定位置加入元素

将原数组复制到新的数组后,再把加入的元素放入目标位置。其实是把中间那个位置空出来,后面的元素往后移动一位。

12.


删除某个位置的元素

和添加元素类似,将特定位置之后的元素全部提前,然后把最后那个元素置空值就行了,返回的还是那个oldValue。

13.


删除某个元素

发现用到了fastRemove这个方法,那么看下这个方法。不过这只能删除第一个出现的那个元素。


fastRemove方法

这不就是那个remove方法么。。只不过没有返回值而已。

14.

clear方法

for循环进行逐个置空,并且大小置为0。

15.


添加一整个集合

16.

某个位置后加入一个集合


内部数组发生移动,空出位置给集合c。

17.


删除中间部分

18.


截取一部分List

其中的SubList又是一个内部类,比较麻烦不详细介绍了。


比较常用的就是以上这些了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,253评论 0 16
  • 我的世界比昨天又温柔了一点点 ——By Hero 太着急的心 会错过很多点滴的可爱 把着急的心情慢下来 再继续看下...
    陈马鹿阅读 213评论 0 3
  • 当感觉坚持变得很难,只愿舒适,不愿再吃一丁点苦,过得太随心,意志力开始薄弱,很薄弱,然后想到训练一下自己,...
    二古子阅读 1,055评论 5 10
  • 他们在别有用心的城市里翩翩舞蹈,你在我后半生的城市里长生不老。 二月份的时候,辞去了工作来到丽江。 算是春天的季节...
    健忘的喵小姐阅读 311评论 2 8