package class02_DynamicArray;
import java.util.ArrayList;
/**
* 自身实现 ArrayList 与源码比较
*
* @Author: ajie
* @Date: 2023/1/8
*/
public class MyArrayList<E> {
ArrayList<Integer> list = new ArrayList<>();
/**
* 元素的数量
*/
private int size;
/**
* 元素的存储位置
*/
private E[] elements;
/**
* 默认存储容量
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 元素不存在返回值
*/
private static final int ELEMENT_NOT_FOUND = -1;
public MyArrayList(int initialCapacity) {
initialCapacity = (initialCapacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : initialCapacity;
elements = (E[]) new Object[initialCapacity];
}
public MyArrayList() {
this(DEFAULT_CAPACITY);
}
private void outOfBounds(int index) {
throw new IndexOutOfBoundsException("Index: " + index + ", size: " + size);
}
/**
* index 是否越界
*
* @param index
*/
private void rangeCheck(int index) {
if (index < 0 || index >= size) {
outOfBounds(index);
}
}
/**
* 添加操作时的 index 是否越界
*
* @param index
*/
private void rangeCheckForAdd(int index) {
if (index < 0 || index > size) {
outOfBounds(index);
}
}
/**
* 元素的数量
*
* @return
*/
public int size() {
return size;
}
/**
* 数组元素是否为空
*
* @return
*/
public boolean isEmpty() {
return size == 0;
}
/**
* 是否包含某个元素
*
* @param element
* @return
*/
public boolean contains(E element) {
//判断数组元素下标是否存在
return indexOf(element) >= 0;
}
/**
* 根据元素的值获取元素下标
*
* @param element
* @return
*/
public int indexOf(E element) {
if (element == null) {
// 如果查找的元素值为 null,返回第一个为 null 的数组元素
for (int i = 0; i < size; i++) {
if (elements[i] == null) {
return i;
}
}
} else {
// 如果查找的元素值不为 null,返回数组元素下标
for (int i = 0; i < size; i++) {
if (element.equals(elements[i])) {
return i; // n
}
}
}
//元素不存在时的返回
return ELEMENT_NOT_FOUND;
}
/**
* 获取index位置的元素
*
* @param index
* @return
*/
public E get(int index) {
rangeCheck(index);
return elements[index];
}
/**
* 设置index位置的元素
*
* @param index
* @param element
* @return
*/
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elements[index];
elements[index] = element;
return oldValue;
}
/**
* 添加元素到尾部
*
* @param element
*/
public void add(E element) {
add(size, element);
}
/**
* 在index位置插入一个元素
*
* @param index
* @param element
*/
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacity(size + 1);
// System.arraycopy(elements, index, elements, index + 1,
// size - index);
// 将 index 后的元素全部向后移动 1
for (int i = size; i > index; i--) {
elements[i] = elements[i - 1];
}
// 将需要添加的元素赋值给 elements[index]
elements[index] = element;
size++;
}
/**
* 删除index位置的元素
*
* @param index
* @return
*/
public E remove(int index) {
rangeCheck(index);
E oldValue = elements[index];
// 将 index 后的元素全部向前移动 1
for (int i = index + 1; i < size; i++) {
elements[i - 1] = elements[i];
}
elements[--size] = null;
return oldValue;
}
/**
* 清除所有元素
*/
public void clear() {
//将元素置空后交给 GC 回收
for (int i = 0; i < size; i++) {
elements[i] = null;
}
size = 0;
}
/**
* 保证容量大小符合要求
*
* @param capacity
*/
private void ensureCapacity(int capacity) {
int oldCapacity = elements.length;
if (oldCapacity >= capacity) {
return;
}
//旧容量的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
E[] newElements = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
System.out.println(oldCapacity + "扩容为" + newCapacity);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("size= ").append(size).append(", [");
for (int i = 0; i < size; i++) {
if (i != 0) {
sb.append(", ");
}
sb.append(elements[i]);
}
sb.append("]");
return sb.toString();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA职业规划、技术提升的可与我联系,交个朋友~ 本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA职业规划、技术提升的可与我联系,交个朋友~ 本人十余年JAVA从业经验,精通JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA职业规划、技术提升的可与我联系,交个朋友~
资源推荐
资源详情
资源评论
收起资源包目录
《JAVA课程设计》--Java 体系课程学习,Java基础,设计模式,JUC,算法等.zip (227个子文件)
dictionaries 162B
DesignMode.iml 446B
Daily-Exercise.iml 423B
Class-Geek2.iml 423B
JavaSE.iml 423B
DataStructure.iml 423B
Algorithm.iml 422B
quarter01-first.iml 422B
Ajie_Study.iml 300B
MyArrayList.java 5KB
CartService.java 4KB
Demo03.java 3KB
Stream_02.java 3KB
ReadWriteLockDemo.java 3KB
Stream_03.java 3KB
Stream_01.java 3KB
SingletonLazy.java 3KB
Demo01.java 2KB
Demo02.java 2KB
_有效括号.java 2KB
code03_翻转二叉树.java 2KB
CartServiceTest.java 2KB
code01_中缀表达式转后缀表达式.java 2KB
ThreadPoolDemo02.java 2KB
MethodReferenceTest.java 2KB
Person.java 2KB
Sku.java 2KB
StreamDemo.java 2KB
Stream_04_Constructor.java 2KB
code09_K个一组翻转链表.java 2KB
SynchronousQueueDemo.java 2KB
code02_盛水最多的容器.java 2KB
code02_轮转数组.java 2KB
Stream_05_Collector.java 2KB
Day02_.java 1KB
CompletableFutureDemo.java 1KB
BlockingDemo.java 1KB
code04_三数之和.java 1KB
Demo02.java 1KB
_逆波兰表达式求值.java 1KB
UnSafeList.java 1KB
Computer.java 1KB
Demo01.java 1KB
LockDemo05.java 1KB
Day03_.java 1KB
LockDemo04.java 1KB
RoleOriginator.java 1KB
code07_环形链表.java 1KB
LockDemo06.java 1KB
LockDemo08.java 1KB
LockDemo03.java 1KB
_基本计算器.java 1KB
LockDemo07.java 1KB
LockDemo02.java 1KB
LockDemo01.java 1KB
ThreadPoolDemo01.java 1KB
Client.java 1KB
AbstractManagement.java 1KB
code01_用栈实现队列.java 1KB
Demo03.java 1011B
Floder.java 1006B
Main.java 995B
UnsafeMap.java 980B
Main.java 927B
Main.java 908B
FileService.java 897B
Main.java 895B
AppInvoker.java 891B
code02_括号生成.java 862B
SecondRiskControllerManager.java 840B
Day01_.java 838B
code08_环形链表2.java 835B
ProductionOrder.java 828B
UnSafeSet.java 827B
ThirdRiskControllerManager.java 820B
Main.java 820B
Main.java 803B
code06_两两交换链表中的节点.java 798B
FirstRiskControllerManager.java 790B
code01_验证回文串.java 783B
Subject.java 775B
WebSiteFactory.java 767B
HighComputerBuilder.java 742B
code01_移动零.java 741B
LowComputerBuilder.java 741B
code01_二叉树的中序遍历.java 727B
ConcreteMyIterator.java 714B
DigitalSellProxy.java 690B
Day04_.java 689B
Demo01.java 684B
Main.java 671B
FileServiceTest.java 667B
SkuCategoryEnum.java 649B
FactoryProducer.java 637B
RiskControllerManager.java 632B
_括号的分数.java 627B
Demo02.java 618B
code03_爬楼梯.java 615B
code03_.java 599B
PayFactory.java 599B
共 227 条
- 1
- 2
- 3
资源评论
季风泯灭的季节
- 粉丝: 696
- 资源: 2920
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 目标检测-零售食品LOGO检测数据集-5000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 目标检测-零售食品LOGO检测数据集-1000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- Delphi 12 控件之LMD.VCL.Full.Version.zip
- 计算机科学选修课:人工智能导论 第二节 PPT
- 计算机科学选修课:人工智能导论 第一章 PPT
- 忘记navicat密码时,此工具可以帮您查看密码
- 电子商务-电子商务平台-水果销售-在线购物-果库小程序.zip
- 基于React的后台开发框架(javascript)
- 用户界面设计-滑动选项卡-交互组件-用户体验-滑动选项卡小程序.zip
- 371系列智能型电动执行机构说明书
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功