模仿源码自定义ArrayList
来源:互联网 发布:vb.net 用户控件 编辑:程序博客网 时间:2024/05/01 14:51
最近看了下ArrayList的源码,抽空根据ArrayList的底层结构写了一个功能简单无泛型的自定义ArrayLsit,帮助自己更好理解ArrayList:,其实现的底层数据结构为数Object组,代码如下:
/** * 自己实现一个ArrayList * */public class MyArrayList {private Object[] elementData;private int size;public int size(){return size;}public boolean isEmpty(){return size==0;}//默认容量为10public MyArrayList(){this(10);}/** * 自定义容量 * @param initialCapacity */public MyArrayList(int initialCapacity){if(initialCapacity<0){try {throw new Exception();} catch (Exception e) {e.printStackTrace();}}elementData = new Object[initialCapacity];}/** * 添加一个元素 * @param obj */public void add(Object obj){//数组扩容和数据的拷贝,重新new一个数组if(size==elementData.length){Object[] newArray = new Object[size*2+1];System.arraycopy(elementData, 0, newArray, 0, elementData.length);elementData = newArray;}elementData[size++]=obj;//size++;}/** * 通过索引获取元素 * @param index * @return */public Object get(int index){rangeCheck(index);return elementData[index];}/** * 通过索引删除元素 * @param index */public void remove(int index){rangeCheck(index);int numMoved = size - index - 1;if (numMoved > 0){System.arraycopy(elementData, index+1, elementData, index,numMoved);}elementData[--size] = null; // Let gc do its work}/** * 删除对应的元素(利用equal判断元素是否一致) * @param obj */public void remove(Object obj){for(int i=0;i<size;i++){if(get(i).equals(obj)){ //注意:底层调用的equals方法而不是==.remove(i);}}}/** * 设置索引对应的元素 * @param index * @param obj * @return */public Object set(int index,Object obj){rangeCheck(index);Object oldValue = elementData[index];elementData[index] = obj;return oldValue;}/** * 将元素插入对应的位置 * @param index * @param obj */public void add(int index,Object obj){rangeCheck(index);ensureCapacity(); //数组扩容System.arraycopy(elementData, index, elementData, index + 1, size - index);elementData[index] = obj;size++;}/** * 数组扩容 */private void ensureCapacity(){//数组扩容和数据的拷贝if(size==elementData.length){Object[] newArray = new Object[size*2+1];System.arraycopy(elementData, 0, newArray, 0, elementData.length);//for(int i=0;i<elementData.length;i++){//newArray[i] = elementData[i];//}elementData = newArray;}}/** * 数组下标检查 * @param index */private void rangeCheck(int index){if(index<0||index>=size){try {throw new Exception();} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {MyArrayList list = new MyArrayList(3);list.add("333");list.add("444");list.add("5");list.add("344433");list.add("333");list.add("333");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i)); }System.out.println("------------------------------"); list.remove("444");list.add(2, "a");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i)); }}}
测试结果:
333
444
5
344433
333
333
------------------------------
333
5
a
344433
333
333
0 0
- 模仿源码自定义ArrayList
- 模仿源码自定义HashMap
- ArrayList源码解析及简单自定义ArrayList
- 黑马程序员 模仿ArrayList去实现一个自定义的集合
- 自定义arraylist
- 自定义ArrayList
- 自定义ArrayList
- 自定义ArrayList
- ArrayList源码
- ArrayList源码
- ArrayList源码
- ArrayList源码
- ArrayList源码
- ArrayList源码
- ArrayList源码
- ArrayList源码
- ArrayList源码
- (日常打卡)自定义的一个模仿ArrayList的类, 你需要实现其中的add, get, remove , 等方法
- AndroidStudio配置指南总结-包括护眼模式
- YY3-带人的技术(前言、第一章)笔记-__XwD__-V1.xmind
- CountDownTimer ---实现计数器
- setjmp.h
- PAT-JAVA-5-28 猴子选大王 (20分)
- 模仿源码自定义ArrayList
- 基于embedded jetty server的websocket开发
- DatePickerDialog的使用和套用
- 用Java去掉换行,输出一行
- Android属性动画
- 微信编辑自定义菜单
- UML之用例图分析(关联、泛化、包含、扩展)
- opengl漫游模型示例
- MySQL学习8:操作数据表(二)