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的更多相关文章

  1. JAVA容器-模拟ArrayList的底层实现

    概述 ArrayList实质上就是可变数组的实现,着重理解:add.get.set.remove.iterator的实现,我们将关注一下问题. 1.创建ArrayList的时候,默认给数组的长度设置为 ...

  2. 模拟ArrayList底层实现

    package chengbaoDemo; import java.util.ArrayList; import java.util.Arrays; import comman.Human; /** ...

  3. java数据结构--array与ArrayList的区别

    ArrayList 内部是由一个array 实现的. 如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 ...

  4. 模仿.NET框架ArrayList写一个自己的动态数组类MyArrayList,揭示foreach实现原理

    通过.NET反编译工具可以查看到ArrayList内部的代码,发现ArrayList并非由链表实现,而是由一个不断扩容的数组对象组成. 下面模仿ArrayList写一个自己的MyArrayList. ...

  5. [工作中的设计模式]迭代子模式Iterator

    一.模式解析 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 1.迭代子模式一般用于对集合框架的访问,常用的集合框架为lis ...

  6. java学习容器

    自己模拟ArrayList: private Object[] elementData; private int size; // 可以指定集合大小,默认10 public MyArrayList(i ...

  7. 第 2章 数组和 ArrayLists

    数组是最通用的数据结构,它出现在几乎所有的编程语言里.在 C#语言中使用数组包括创建 System.Array 类型的数组对象,以及创建针对所有数组的抽象的基类型.Array 类提供了一套方法,这些方 ...

  8. 实现简单的List功能

    简单的实现javaArrayList(可扩容)功能,实现新增,删除,取数据. package algorithm.data_structure; /** * 模拟ArrayList类的功能 * @au ...

  9. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

随机推荐

  1. myeclipse启动后,卡在loading workbench界面

    今天在修改svn的配置文件的时候,电脑重启了几次,然后myeclipse启动的时候就一直卡在loading workbeach动不了了. 重启了几次也不行,后来查的百度,找到的解决方法如下: 找到my ...

  2. 洛谷 P2056 [ZJOI2007]捉迷藏 题解【点分治】【堆】【图论】

    动态点分治入 门 题? 题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由 \(N\) 个屋 ...

  3. 论文笔记 | Self-organized Text Detection with Minimal Post-processing via Border Learning

    论文链接:http://openaccess.thecvf.com/content_ICCV_2017/papers/Wu_Self-Organized_Text_Detection_ICCV_201 ...

  4. How to Create a Cron Job (Scheduled Task) for Your Website or Blog

    How to Create a Cron Job (Scheduled Task) for Your Website or Blog by Christopher Heng, thesitewizar ...

  5. connection reset by peer, socket write error问题排查

    2018-03-15更新:弄明白connection reset产生的原因,见重新分析connection reset by peer, socket write error错误原因 在开发文件上传功 ...

  6. centos7 中文乱码问题解决方法

    1.查看是否安装中文包 可以使用下面的命名查看系统是否安装了中文安装包. locale -a |grep "zh_CN" 没有输出,说明没有安装,输入下面的命令安装: yum gr ...

  7. 1.2 js基础

    1.onchange    99%用到select上边. 2.js是干什么的,修改css样式和属性   3.选项卡步骤   1.获取元素 2.循环给按钮加自定义属性 3.循环给按钮加事件   4.封装 ...

  8. js event鼠标事件

    1,鼠标焦点事件 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...

  9. bzoj 5340: [Ctsc2018]假面

    Description 题面 Solution 生命值范围比较小,首先维护每一个人在每个血量的概率,从而算出生存的概率,设为 \(a[i]\) 询问时,只需要考虑生存的人数,可以 \(DP\) 设 \ ...

  10. 深入理解JavaScript系列(27):设计模式之建造者模式

    介绍 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定. ...