模拟ArrayList
package com.helloidea;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ArrayListTest {
transient Object[] elementDate;
private static final int DEFAULT_CAPACITY = 10;
//如果自定义容量为0,则用它来初始化ArrayList,或者用于空数组替换
private static final Object[] EMPTY_ELEMENTDATE = {};
//如果没有自定义容量,则用它拉初始化ArrayList,或者用于空数组对比
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATE = {};
private int size;
public ArrayListTest(){
this.elementDate = DEFAULTCAPACITY_EMPTY_ELEMENTDATE;
}
public ArrayListTest(int ini){
if(ini == 0){
this.elementDate = EMPTY_ELEMENTDATE;
}else if (ini>0){
this.elementDate = new Object[ini];
}else {
System.out.println("初始容量不能小于0");
}
}
public void add(Object o){
ensureExplicitCapacity(size+1);
elementDate[size++] = o;
}
//刚开始数组为空,长度为0.size = 0 minCapacity = 1
private void ensureExplicitCapacity(int minCapacity){
//容量不足,扩容
if(minCapacity>elementDate.length){
int oldCapacity = elementDate.length;
int newCapacity = oldCapacity + (oldCapacity>>1);//这时候0扩容还是0,1扩容还是1
if(newCapacity<minCapacity)
newCapacity = minCapacity;
Object []objects = new Object[newCapacity];
//将数据复制给新数组
System.arraycopy(elementDate,0,objects,0,elementDate.length);
elementDate = objects;
}
}
public Object get(int index){
rangeCheck(index);
return elementDate[index];
}
private void rangeCheck(int index){
if(index>=size){
System.out.println("下标越界");
}
}
public Object remove(int index){
rangeCheck(index);
Object oldValue = elementDate[index];
int numMoved = size - index - 1;
if(numMoved>0){
//从index+1开始,将值覆盖
System.arraycopy(elementDate,index+1,elementDate,index,numMoved);
}
elementDate[--size] = null;
return oldValue;
}
public boolean remove(Object o){
for(int index = 0;index<size;index++)
if(o.equals(elementDate[index])){
remove(index);
return true;
}
return false;
}
public int size(){
return size;
}
}
class test{
public static void main(String[] args) {
ArrayListTest list = new ArrayListTest();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
for (int i = 0;i<list.size();i++)
System.out.print(list.get(i)+" ");
}
}
模拟ArrayList的更多相关文章
- JAVA容器-模拟ArrayList的底层实现
概述 ArrayList实质上就是可变数组的实现,着重理解:add.get.set.remove.iterator的实现,我们将关注一下问题. 1.创建ArrayList的时候,默认给数组的长度设置为 ...
- 模拟ArrayList底层实现
package chengbaoDemo; import java.util.ArrayList; import java.util.Arrays; import comman.Human; /** ...
- java数据结构--array与ArrayList的区别
ArrayList 内部是由一个array 实现的. 如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 ...
- 模仿.NET框架ArrayList写一个自己的动态数组类MyArrayList,揭示foreach实现原理
通过.NET反编译工具可以查看到ArrayList内部的代码,发现ArrayList并非由链表实现,而是由一个不断扩容的数组对象组成. 下面模仿ArrayList写一个自己的MyArrayList. ...
- [工作中的设计模式]迭代子模式Iterator
一.模式解析 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 1.迭代子模式一般用于对集合框架的访问,常用的集合框架为lis ...
- java学习容器
自己模拟ArrayList: private Object[] elementData; private int size; // 可以指定集合大小,默认10 public MyArrayList(i ...
- 第 2章 数组和 ArrayLists
数组是最通用的数据结构,它出现在几乎所有的编程语言里.在 C#语言中使用数组包括创建 System.Array 类型的数组对象,以及创建针对所有数组的抽象的基类型.Array 类提供了一套方法,这些方 ...
- 实现简单的List功能
简单的实现javaArrayList(可扩容)功能,实现新增,删除,取数据. package algorithm.data_structure; /** * 模拟ArrayList类的功能 * @au ...
- java学习笔记之基础篇
java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...
随机推荐
- Nginx负载均衡详解
upstream mysvr { server 192.168.10.121:3333; server 192.168.10.122:3333; } server { .... location ...
- C++_IO与文件3-用cin进行输入
接下来讨论的是如何给程序提供数据? cin对象将标准输入表示为字节流. 通常情况下是通过键盘来生成这种字节流 cin对象根据接收值得变量类型,使用其方法将字符序列转换为所需的类型. cin>&g ...
- springboot(六)-使用shiro
前提 写之前纠结了一番,这一节放在shiro里面还是springboot里面.后来想了下,还是放springboot里吧,因为这里没有shiro的新东西,只有springboot添加了新东西的使用. ...
- python数据类型,格式话输出
一.程序交互 name = input(“你的名字是:”) #用户输入,输入的任何东西都存储成str(字符串类型)的形式 二.注释的重要性 以后动辄几千行代码的时候,回过头再去看的时候,发现自己都看不 ...
- C++ GUI Qt4编程(05)-2.2GoToCell
1. 使用Qt设计师创建GoToCell对话框. 2. gotocelldialog.cpp #include <QRegExp> #include "gotocelldialo ...
- python-OS.path.join()路径拼接
os.path.join()函数: 第一个以”/”开头的参数开始拼接,之前的参数全部丢弃. 以上一种情况为先.在上一种情况确保情况下,若出现”./”开头的参数,会从”./”开头的参数的上一个参数开始拼 ...
- 怎么理解impala(impala工作原理是什么)
下面给大家介绍怎么理解impala,impala工作原理是什么. Impala是hadoop上交互式MPP SQL引擎, 也是目前性能最好的开源SQL-on-hadoop方案. 如下图所示, impa ...
- innosetup卸载软件后,删除定时任务schedule task
代码如下: //innosetup自带的方法,当卸载软件时,根据卸载的状态改变时而触发 procedure CurUninstallStepChanged(CurUninstallStep: TUni ...
- php二维数组排序方法(array_multisort usort)
一维数组排序可以使用asort.ksort等一些方法进程排序,相对来说比较简单.二维数组的排序怎么实现呢?使用array_multisort和usort可以实现 例如像下面的数组: $users = ...
- MVC5 下拉框绑定(单选)
1.Model [Display(Name = "学历")] public ICollection<System.Web.Mvc.SelectListItem> asd ...