一.自定义list接口
package com.xhz.arraylist;
/**
* 自定义list接口
* @author xhz
*
* @param <E>
*/
public interface ExtList<E> {
public void add(E object);
public void add(int index,E object);
public E remove(int index);
public boolean remove(E object);
public int size();
public E get(int index);
}
二.自定义ArrayList集合
package com.xhz.arraylist;
import java.util.Arrays;
/**
* 自定义ArrayList集合
*
* @author xhz
*
*/
public class ExtArrayList<E> implements ExtList<E> {
// ArrayList底层采用数组存放
private Object[] elementData;
// 默认数组容量
private static final int DEFAULT_CAPACITY = 10;
// ArrayList实际存储的数据数量
private int size;
// ArrayList 指定数组初始的容量
public ExtArrayList(int initialCapacity) {
if (initialCapacity < 0) {
throw new IllegalArgumentException("初始容量不能小于0");
}
elementData = new Object[initialCapacity];
}
// 默认初始化容量为10
public ExtArrayList() {
this(DEFAULT_CAPACITY);
}
// 线程安全问题 ArrayList底层每次扩容是以1.5倍
public void add(E object) {
// 1.判断实际存放数据容量是否大于elementData
ensureExplicitCapacity(size + 1);
// 2.使用下标进行赋值
elementData[size++] = object;
}
//通过指定位置添加元素
public void add(int index,E object) {
// 1.判断实际存放数据容量是否大于elementData
ensureExplicitCapacity(size + 1);
System.arraycopy(elementData, index, elementData, index + 1,size-index);
elementData[index]=object;
size++;
}
// int minCapacity 最小扩容容量size+1
private void ensureExplicitCapacity(int minCapacity) {
if (size == elementData.length) {
// 原來本身elementData容量大小
int oldCapacity = elementData.length;
// 新数据容量大小(oldCapacity>>1)=oldCapacity/2
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果初始容量为1的时候,那么它扩容的大小为多少呢?
//最小扩容容量
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;// 最少保证容量和minCapacity一样
// 將老数组的值复制到新数组里
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
//移除指定位置的元素
public E remove(int index) {
//1.使用下标查询该值是否存在
E object=get(index);
//计算删除元素后面的长度
int numMoved=size-index-1;
//2.刪除原理分析 使用arraycopy往前移动数据,将最后一个变为空
if(numMoved>0)
System.arraycopy(elementData, index+1, elementData, index,numMoved);
elementData[--size]=null;//將最后一个元素变为空
return object;
}
//删除对象(删除相同元素时只删除第一个)
public boolean remove(E object) {
for (int i = 0; i < elementData.length; i++) {
Object value=elementData[i];
if(value.equals(object)) {
remove(i);
return true;
}
}
return false;
}
// 检查数组是否在界线内
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("越界啦");
}
// 返回ArrayList实际存储的元素数量
public int size() {
return size;
}
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
// 使用下标获取数组元素
public E get(int index) {
rangeCheck(index);// 检查是否越界
return elementData(index);
}
}
三.测试
package com.xhz.test;
import java.util.ArrayList;
import java.util.Arrays;
import com.xhz.arraylist.ExtArrayList;
public class Test {
public static void main(String[] args) {
ArraysCopyOf();
SystemArrayCopy();
ArrayList();
ExtArrayList();
GenericType();
}
//底层采用数组方式
//怎么保存集合存放无限大小 ---数组扩容技术
public static void ArraysCopyOf() {
System.out.println("ArraysCopyOf()开始#############################################");
Object[] objects= {1,2};
System.out.println("objects:"+objects.length);
for (Object object : objects) {
System.out.println("循环:"+object.toString());
}
System.out.println("#############################################");
//返回新的数组,将原来长度为2的数组现在扩容为10,原来本身的数据不变
Object[] copyNesObjects = Arrays.copyOf(objects, 10);
System.out.println("copyNesObjects:"+copyNesObjects.length);
System.out.println("ArraysCopyOf()结束#############################################\n");
}
public static void SystemArrayCopy() {
System.out.println("SystemArrayCopy()开始#############################################");
//参数src原数组 srcPos起始位置 dest目标数组 destPos目标数组起始位置 length复制长度
//System.arraycopy(src, srcPos, dest, destPos, length);
int[] fun= {0,1,2,3,4,5,6};
System.arraycopy(fun, 3, fun, 0, 4);
for (int i : fun) {
System.out.println("i:"+i);
}
System.out.println("SystemArrayCopy()结束#############################################\n");
}
public static void ArrayList() {
System.out.println("ArrayList()开始#############################################");
// 1.jdk1.7之后数组默认数据大小代码放在add方法
// 2.arraylist底层采用数组实现 数组名称elementData
// 3.arraylist底层采用数组实现 默认初始化最小容量为10
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("张三");
System.out.println(arrayList.get(0));
System.out.println("ArrayList()结束#############################################\n");
}
public static void ExtArrayList() {
System.out.println("ExtArrayList()开始#############################################");
ExtArrayList extArrayList = new ExtArrayList(1);
extArrayList.add("张三");
extArrayList.add("李四");
extArrayList.add("王五");
extArrayList.add("赵六");
extArrayList.add("小盒子");
extArrayList.add(0,"麻子");
for (int i = 0; i < extArrayList.size(); i++) {
System.out.println(extArrayList.get(i));
}
System.out.println("#############################");
extArrayList.remove(0);
for (int i = 0; i < extArrayList.size(); i++) {
System.out.println(extArrayList.get(i));
}
System.out.println("ExtArrayList()结束#############################################\n");
}
public static void GenericType() {
System.out.println("GenericType()开始#############################################");
//反射机制不能够获取泛型类型,可通过字节码方式获取
ExtArrayList<String> extArrayList=new ExtArrayList<String>();
extArrayList.add("张三");
extArrayList.add("李四");
extArrayList.add("王五");
extArrayList.add("赵六");
extArrayList.add("小盒子");
extArrayList.add(0,"麻子");
for (int i = 0; i < extArrayList.size(); i++) {
System.out.println(extArrayList.get(i));
}
System.out.println("#############################");
extArrayList.remove(0);
for (int i = 0; i < extArrayList.size(); i++) {
System.out.println(extArrayList.get(i));
}
System.out.println("GenericType()结束#############################################\n");
}
}