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. GCD(最大公约数)和LCM(最小公倍数)的求法

    GCD(最大公约数) (1)辗转相除法(欧几里得算法)(常用) 将两个数a, b相除,如果余数c不等于0,就把b的值给a,c的值给b,直到c等于0,此时最大公约数就是b (2)更相减损术 将两个书中较 ...

  2. Codeforces - 600E 树上启发式合并

    题意:求每一个子树存在最多颜色的颜色代号和(可重复) 本题是离线统计操作,因此可以直接合并重儿子已达到\(O(nlogn)\)的复杂度 PS.不知道什么是启发式合并的可以这样感受一下:进行树链剖分,分 ...

  3. HDU - 6186 前缀和位运算

    异或操作蒙蔽了我的双眼 以至于没有第一时间想到前缀和与后缀和 水题做的不够多 #include<bits/stdc++.h> #define rep(i,j,k) for(register ...

  4. 深入理解promise

    如今promise大行其道,关于异步方面的几乎都有它的影子,新的fetch api返回的是promise对象,generator中的yield后面一般也会跟promise对象,async的await后 ...

  5. java单元测试之Mock静态方法

    1 public final class AmountUtil { public static String CustomFormatWith2Digits(int amount) { return ...

  6. scrapy模块之分页处理,post请求,cookies处理,请求传参

    一.scrapy分页处理 1.分页处理 如上篇博客,初步使用了scrapy框架了,但是只能爬取一页,或者手动的把要爬取的网址手动添加到start_url中,太麻烦接下来介绍该如何去处理分页,手动发起分 ...

  7. 2019.3.28 JDBC相关

    JDBC(Java Data Base Connectivity) JDBC是一组用Java编写的类和接口 使用JDBC的好处: 1.Java的开发人员完全不需要关心数据库的连接方式和实现手段 2.提 ...

  8. 小程序wxml文件引用方式

    import<!--header.wxml --> <template name="item"> <text>{{text}}</text ...

  9. oracle 错误实例分析(ORA-01126)

    问题描述 SQL> shutdown immediate ORA-01109: database not open Database dismounted. ORACLE instance sh ...

  10. XLua 网络加载(基础操作)

    LoadGameMethod  网上资源加载更新:加载场景中另建协程用来加载; public void LoadGameMethod() { StartCoroutine(start());      ...