程序员生活
2017-11-23 14:32:47
根据java数组源码写的自己的数组的简单的功能的实现
package cn.bjsxt.array; import java.util.ArrayList; /** * 根据StringBuilder类的相关源码创建属于自己的数组类 * 该类与jdk中的数组的区别在于该类中可以存储任何的对象 * jdk中的数组只能存储char * @author 刘涛 * */ public class MyArrayList { private Object[] value;//定义数组 private int size;//数组的长度` public MyArrayList(){ //无参构造器,默认初始化长度为16的数组 //value = new Object[16]; this(16);//此行代码和上面的代码含义相同, } public MyArrayList(int size){ value = new Object[size]; } public void add(Object obj){ //因为默认的size初始化值为0,所以从0开始,然后自增会继续往后加 value[size] = obj; size++; //对数组进行扩容,如果初始化数组的长度无法满足数组时便会进行自动的扩容操作 if(size >= value.length){ int newCapacity = size*2; Object[] newList = new Object[newCapacity]; for(int i = 0; i < value.length;i++){ newList[i] = value[i]; } value = newList; } } public Object get(int index){ if(index < 0 || index >= size){ try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return value[index]; } /** * 删除数组中指定位置的元素,采取方式为数组中的最后一个元素替换将要删除的元素的 * @param index 要删除的元素的位置 */ public void deleteCharAt(int index){ if (index < 0 || index > size) { try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { //将数组中的最后一个元素替换删除元素的即可 value[index] = value[size - 1]; //删除后数组的长度减1 size --; //创建一个新的数组数组的长度为原来数组的长度减1,并将原来的数组中的元素复制到新数组中 Object[] newList = new Object[size]; for(int i = 0; i < size; i++){ newList[i] = value[i]; } //System.arraycopy(value, 0, newList, 0, size);//将原始数组中的数据复制到新数组中的另一种方法 value = newList; } } /** * 删除数组中指定位置的元素,删除方式为删除指定位置的元素后,后面的元素向前移动 * @param index */ public void removeCharAt(int index){ //判断删除元素的位置是否在数组的长度范围内,若不在范围内则抛出异常 if (index < 0 || index > size) { try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { for(int i = 0; i < size; i ++){ value[i + index] = value[i + index + 1]; } size --; Object[] newList = new Object[size]; for(int i = 0; i < size; i ++){ newList[i] = value[i]; } //System.arraycopy(value, 0, newList, 0, size);//将原始数组中的数据复制到新数组中的另一种方法 value = newList; } } public void insertCharAt(int index,Object obj){ if (index < 0 || index > size ) { try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { value[size] = obj; size++; Object[] newList = new Object[size]; System.arraycopy(value, 0, newList, 0, size); value = newList; } } /*** * * @param index * @param obj */ public void insert(int index,Object obj){ if (index < 0 || index > size ) { try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.arraycopy(value, index, value, index + 1, size - index); value[index] = value; size++; } } /** * 删除数组中指定区间的元素 * @param start 区间起始位置 * @param end 区间结束位置 */ public void remove(int start,int end){ if(start < 0 || end > size || end < 0 || start > size){ try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ for(int i = 0; i < size; i ++){ if(i+end > size){ value[i + start] = null; }else{ value[i + start] = value[i + end]; } } size -= end - start; Object[] newList = new Object[size]; for(int i = 0 ; i < size; i ++){ newList[i] = value[i]; } //System.arraycopy(value, 0, newList, 0, size);//将原始数组中的数据复制到新数组中的另一种方法 value = newList; } } public static void main(String[] args) { MyArrayList my = new MyArrayList(2); my.add("aaa"); my.add("bbb"); my.add("ccc"); my.add(new Human("孙悟空",500,true)); // Human h = (Human) my.get(3); // System.out.println(h.getName()); // System.out.println(h.isGender()); // System.out.println(h.getAge()); // System.out.println(my.get(2)); System.out.println(my.size); // my.insertCharAt(3, "eee"); // my.insert(4, "fff"); System.out.println(); // my.deleteChar(1); // my.removeCharAt(1); // my.remove(1, 3); my.insert(3, "fff"); for(int i = 0; i < my.size; i ++){ System.out.println(my.get(i)); } System.out.println(my.size); /*System.out.println(my.size); Human h1 = (Human) my.get(1); System.out.println(h1.getAge());*/ } }
猜你喜欢
请下载代码后再发表评论
相关代码
最近下载
最近浏览
gyuguigiu LV1
2023年6月27日
Linglingyu LV2
2022年11月24日
林间听风 LV10
2022年4月24日
Zovy*
2021年12月24日
暂无贡献等级
asd1051941416 LV1
2021年6月18日
蔡 LV10
2021年6月12日
酒后少年 LV6
2021年5月3日
ykqwe123 LV1
2020年11月23日
忘久久 LV3
2020年10月23日
wisted LV2
2020年8月19日