首页 > 其他 > 详细

ArrayList的简单实现

时间:2021-04-01 00:48:09      阅读:13      评论:0      收藏:0      [点我收藏+]
  1. 容器是什么?
    简单来说容器相当于一个Box,其中的List、Set、Queue和Map这些基本类型,方便在容器内进行反复存删的操作

1.1为什么需要容器?
在端与端之间的传输中,需要Java临时存储数据。

  1. ArrayList的初始化
    2.1 ArrayList和List的区别:

2.2 ArrayList就是一个简单的类,我们简单的用数组实现ArrayList,先看一段代码

技术分享图片

首先:先执行MyArrayListUser oml = new MyArrayListUser<>(); MyArrayListUser是我手动实现的ArrayList
当看到new这个关键字的时候,首先先想到在堆内存中开辟了一块存储空间

技术分享图片
注:有些方法区的位置存放于堆上,有些版本的方法区存放于堆外

既然是new出的对象,我们直接看构造函数
技术分享图片

为什么底层要用数组实现呢?
同时我们也可以看一下ArrayList的源码,他到底干了什么?

技术分享图片

是的,ArrayList和String一样底层也是数组实现的,唯一的区别是String底层是char[]数组,而这儿是Object[]数组
读到这里,小伙伴们应该有三大疑惑?
1:为什么底层要用数组,同时衍生到String字符串的底层为什么用数组
2:为什么底层要用ObjectS数组
3:为什么我给他赋值给10

1:因为没有别的实现方法
1.1:因为String不变性,数组只能存储字符,数组的长度也是不可变的,如果相变只能扩容
2:因为Object类是所有类的基类,Object类是所有类的父类
3:不知道,以后再说

而这里的Object[]数组,可以存放任何对象,执行完构造函数后

技术分享图片

继续执行:
oml.add("123");
oml.add("456");
oml.add("789");
技术分享图片

不多说,看咱们的源码MyArrayList是怎么处理add的。
技术分享图片

哪了解数组是怎么扩容的呢?扩多大呢?
技术分享图片

我这里用的是创建一个新数组,然后把内容扩两倍,把新数组内容放入老数组中
技术分享图片

为什么扩容需要扩2倍呢?

在ArrayList源码中
技术分享图片

这儿有一段代码:int newCapacity = oldCapacity + (oldCapacity >> 1),>>是移位运算符,相当于int newCapacity = oldCapacity + (oldCapacity/2),但性能会好一些。

传递的过程中就是把obj的地址赋值给arr
技术分享图片

同样的,还有其他ArrayList的方法,因为过于简单所以就不叙述了

ArrayList的简单实现

原文:https://www.cnblogs.com/wfqblogs/p/14602969.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!