刨死你系列——手撕ArrayList
不多BB,直接上代码:
public class MyArrayList {
//创建数组对象
private Object[] elements;
//已使用数组长度
private int size = 0;
//初始化数组长度
private final static int INIT_LENGTH = 10;
//数组最大长度
private int static int MAX_LENGTH = Integer.MAX_VALUE;
//无参构造方法
public MyArrayList() {
this(INIT_LENGTH);
}
//有参构造方法
public MyArrayList(int capacity) {
if (capacity < 0) {
System.out.println("创建集合失败");
}
elements = new Object[capacity];
}
//获取已使用数组长度
public int size() {
return size;
}
//判断数组是否为空
public boolean isEmpty() {
return size == 0;
}
//添加数组元素
public void add(E e) {
checkCapacity(size);
elements[size++] = e;
}
//指定位置添加元素
public void add(int index, E e) {
checkRange(index);
checkCapacity(size);
System.arraycopy(elements, index, elements, index + 1, size - index);
elements[index] = e;
size++;
}
//查找指定元素
public E get(int index) {
checkRange(index);
return elements[index];
}
//删除指定元素
public E remove(int index) {
checkRange(index);
int moveSize = size - index - 1;
E value = get(index);
//判断是否为数组最后一个元素
if (moveSize > 0) {
System.arraycopy(elements, index + 1, elements, index, moveSize);
}
elements[size--] = null;
return value;
}
//检查数组下标是否越界
public void checkRange(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("数组下标越界");
}
}
//检查是否需要扩容
public void checkCapacity(int size){
if(size == elements.length){
int newLength = size<<1 < MAX_LENGTH ? size<<1 : MAX_LENGTH;
elements = Arrays.copyOf(elements, newLength);
}
}
}
刨死你系列——手撕ArrayList的更多相关文章
- 竟然还有人说ArrayList是2倍扩容,今天带你手撕ArrayList源码
ArrayList是我们开发中最常用到的集合,但是很多人对它的源码并不了解,导致面试时,面试官问的稍微深入的问题,就无法作答,今天我们一起来探究一下ArrayList源码. 1. 简介 ArrayLi ...
- 刨死你系列——HashMap(jdk1.8)
本文的源码是基于JDK1.8版本,在学习HashMap之前,先了解数组和链表的知识. 数组:数组具有遍历快,增删慢的特点.数组在堆中是一块连续的存储空间,遍历时数组的首地址是知道的(首地址=首地址+元 ...
- 刨死你系列——LinkedHashMap剖析(基于jdk1.8)
一.概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linked ...
- 疯狂创客圈 JAVA死磕系列 总目录
无编程不创客,无案例不学习.疯狂创客圈,一大波高手正在交流.学习中! 疯狂创客圈 Java 死磕系列: [博客园 总入口] QQ群:104131248 [Java 聊天室] 实战从0开始,打造100 ...
- NN入门,手把手教你用Numpy手撕NN(三)
NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...
- 优雅手撕bind函数(面试官常问)
优雅手撕bind函数 前言: 为什么面试官总爱让实现一个bind函数? 他想从bind中知道些什么? 一个小小的bind里面内有玄机? 今天来刨析一下实现一个bind要懂多少相关知识点,也方便我们将零 ...
- 用C/C++手撕CPlus语言的集成开发环境(1)—— 语言规范 + 词法分析器
序言 之所以叫做CPlus语言,是因为原本是想起名为CMinus的,结果发现GitHub和Gitee上一堆的CMinus的编译器(想必都是开过编译原理课程并且写了个玩具级的语言编译器的大佬们吧).但是 ...
- MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...
- 面试中的MySQL主从复制|手撕MySQL|对线面试官
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第三篇文章,今天讲解使用bin log实现主从复制的功能.主从复制也是MySQL集群实现高可用.数据 ...
随机推荐
- Socket实现简单聊天
服务端: package main.java.com.socket_dome; import java.io.IOException; import java.io.InputStream; impo ...
- Linux关机指令详解
Linux关机指令 在linux领域内大多用在服务器上,很少遇到关机的操作.毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机. 正确的关机流程为:sync > shutdown ...
- go语言-csp模型-并发通道
[前言]go语言的并发机制以及它所使用的CSP并发模型 一.CSP并发模型 CSP模型是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型. C ...
- react入个门
起步 react 特点 不使用模板 不是一个mvc框架 响应式 轻量级的js库 原理 虚拟dom 将dom抽象成js对象 diff算法 搭建开发环境 react.js 核心文件 react-dom.j ...
- 初探JavaScript原型链污染
18年p师傅在知识星球出了一些代码审计题目,其中就有一道难度为hard的js题目(Thejs)为原型链污染攻击,而当时我因为太忙了(其实是太菜了,流下了没技术的泪水)并没有认真看过,后续在p师傅写出w ...
- 记录 Allsec 解题过程
开局打开URL:http://119.3.191.245:65532/#/allsecPlayGame,前去做游戏 游戏URL:http://119.3.191.245:8877/Login.php ...
- 锐捷RG-UAC统一上网行为管理审计系统账号密码泄露漏洞 CNVD-2021-14536
一:产品介绍: 锐捷 RG-UAC 统一上网行为管理审计系统 锐捷统一上网行为管理与审计RG-UAC系列是星网锐捷网络有限公司自主研发的上网行为管理与审计产品,以路由.透明.旁路或混合模式部署在网络的 ...
- python文件操作以及循环小结
Python中的文件使用建议使用 with open(filename, "r") as f: 的形式进行文件操作,如果忘记关闭文件指针的话,他会帮你自己关闭文件, 如果使用原来的 ...
- drozer使用总结
adb forward tcp:31415 tcp:31415 drozer console connect run app.package.list -f baidu 查看包名 run a ...
- 建立高速缓存机制-java版
前言 一台计算机的核心是CPU,它是计算机系统的运算和控制核心.由于它处理运算速度快,所以基本都会给CPU配置一级缓存,当CPU要读取一个数据时,首先从缓存中查询,如果没有在从内存或者磁盘块中找. ...