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. sql语句中变量的写法

        $sql = "update cat set num=num+1 where cat_id=$art[cat_id]";    $sql = "update ca ...

  2. [转] open-falcon编写的整个脑洞历程

    [From] https://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=400225178&idx=1&sn=c98609a9 ...

  3. Notepad++ 代码格式化插件

    UniversalIndentGUI 是一个代码格式化工具合集,基于很多开源的代码格式化项目.有NPP的插件版也有独立的程序,支持常见代码格式. 支持的代码格式: C, C++, C#, Cobol, ...

  4. 2.5 References & Borrowing

    Here is how you would define and use a calculate_length function that has a reference to an object a ...

  5. oracle 单实例DG(配置篇二)

    一,DG搭建实例--主库配置 one : 归档配置 01,查看归档  1 select log_mode,force_logging from v$database; 02,开启归档 关闭数据库重新启 ...

  6. 段错误:使用opencv打开视频流

    段错误:使用opencv打开视频流时报这个错误 1 使用命令dmesg 发现是libavutil.so模块发生了错误. 如果是java端报错,可能如下: libavutil.so  ... av_di ...

  7. SQLAlchemy安装和使用

    1.SQLAlchemy安装 SQLAlchemy依赖mysql-python驱动,mysql-python目前只有支持py2的版本和mysql5.5的版本 点我:mysql-python链接 版本: ...

  8. 守护客户数据价值:企业级NewSQL HTAP分布式云TBase架构详解

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:jasonys,隶属于腾讯技术工程事业群数据平台部,负责TBase数据的技术研发和架构设计,有超过10年的数据库内核开发设计经验,完成 ...

  9. Oracle新手常遇到的问题

    1.问题描述:尝试加载 Oracle 客户端库时引发 BadImageFormatException.如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题. 解决方 ...

  10. Spring mvc框架下使用kaptcha生成验证码

    1.下载jar包并导入. kaptcha-2.3.2.jar 2.spring 配置文件 applicationContext.xml. <bean id="captchaProduc ...