集合底层(粗写):
public class MyArrayList<E> {
private Object[] obj;
private int size;
private final int DEFAULT_CAPACITY = 10;
public MyArrayList(){
obj = new Object[DEFAULT_CAPACITY];
this.size = 0;
}
public MyArrayList(int len){
if (size>0) {
//this.size = size;
obj = new Object[len];
this.size = 0;
}else {
throw new RuntimeException("容量不能为负数");
}
}
//累加元素
public void add(E element){
upCapacity();
obj[size++] = element;
}
//特定位置增加元素
public void add(int index,E element){
upCapacity();
if(index>0||index<size){
System.arraycopy(obj,index,obj,index+1,size-index);
obj[index] = element;
size++;
}else{
throw new RuntimeException("插入索引越界");
}
}
//数组扩容
private void upCapacity(){
if(size==obj.length){
Object[] newObj = new Object[size+(size>>1)];
System.arraycopy(obj,0,newObj,0,obj.length);
obj = newObj;
}
}
//获取特定元素在集合内第一次出现的索引
public int indexOf(E element){
for (int i = 0; i < size; i++) {
if(obj[i].equals(element)){
return i;
}
}
return -1;
}
//获取特定索引的元素
public E get(int index){
if(cheakIndex(index)) {
return (E) obj[index];
}else {
return null;
}
}
//获取长度
public int size(){
return this.size;
}
//替换
public void set(int index,E elemet){
if(cheakIndex(index)){
obj[index] = elemet;
}
}
private boolean cheakIndex(int index){
if(index>size-1||index<0){
throw new RuntimeException("索引不合法");
}else {
return true;
}
}
/*
重写toString方法
System.out.println将自动调用toString方法,本类型中toString方法继承Object的方法,为空继承需重写
在此重写方法中,不采用“+”,原String为不可变字符串,用“+”会产生多个String对象,损耗内存,故采用StringBuilder
*/
public String toString() {
StringBuilder str = new StringBuilder();
str.append("[");
for (int i = 0; i < size; i++) {
str.append(obj[i]+",");
}
str.setCharAt(str.length()-1,']');
return str.toString();
}
}
测试类:
public class TextArrayList {
public static void main(String[] args) {
MyArrayList<String> arr = new MyArrayList<>();
arr.add("张三");
arr.add("李四");
arr.add("王五");
arr.add("黄六");
//arr.add("刘七");
arr.add(2,"坎八");
System.out.println(arr);
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
}
}