ArrayLIst实现原理
一:ArrayLIst原理:
ArraList的特点:a)可以存放任意的类型的数据 2)长度可以动态变化。
解决这两种特定的策略是:1)使用泛型,解决存放任意类型的问题。2)底层使用数组,当插入数据超过数组的范围的时候,在新建一个两倍长度加一长度的新数组。在把旧数据复制到数组里即可。
例如:当前集合的容量是3,当插入前三个元素的时候,当前下表没有超过容量时候直接插入;当插入第四个元素的时候,超过当前容量,扩展一个2*3+1长度的新数组。
把旧数据移植到新数组里。同时把第四个元素存放到第四个位置。其它,依次类推
二:实现类及测试类
package com.lyg;
import java.util.Arrays;
/**
* @author lyg
* @param <T>
* @function : 模拟可扩展集合的使用
*/
public class LygArrayList<T> {
* @author lyg
* @param <T>
* @function : 模拟可扩展集合的使用
*/
public class LygArrayList<T> {
/** 初始化容量 */
private int capacity = 10;
private int capacity = 10;
private T[] data;
private int length;
private int length;
public LygArrayList() {
data = (T[]) new Object[capacity];
length = 0;
}
data = (T[]) new Object[capacity];
length = 0;
}
/**
* 添加元素
* @param t : 元素
*/
public void add(T t) {
int size = size();
if (size < capacity) {
data[length] = t;
} else {
// 扩容,复制数据
capacity = capacity * 2 + 1;
T[] newData = (T[]) new Object[capacity];
System.arraycopy(data, 0, newData, 0, size);
newData[length] = t;
data = newData;
}
length++;
}
* 添加元素
* @param t : 元素
*/
public void add(T t) {
int size = size();
if (size < capacity) {
data[length] = t;
} else {
// 扩容,复制数据
capacity = capacity * 2 + 1;
T[] newData = (T[]) new Object[capacity];
System.arraycopy(data, 0, newData, 0, size);
newData[length] = t;
data = newData;
}
length++;
}
public void remove(int index) throws Exception {
if (index < 0 || index > size()) {
throw new Exception("index is error");
}
for (int i = index; i < length-1; i++) {
data[i]=data[i+1];
}
length--;
}
if (index < 0 || index > size()) {
throw new Exception("index is error");
}
for (int i = index; i < length-1; i++) {
data[i]=data[i+1];
}
length--;
}
public void removeAll() {
data = null;
length = 0;
}
data = null;
length = 0;
}
public T get(int index) {
if (index < 0 || index > size()) {
return null;
}
return data[index];
}
if (index < 0 || index > size()) {
return null;
}
return data[index];
}
public int size() {
return length;
}
}
return length;
}
}
//测试类
package com.lyg;
public class Test {
public static void main(String[] args) {
LygArrayList<String> list = new LygArrayList<String>();
for (int i = 0; i < 15; i++) {
list.add(i+"");
}
display(list);
}
public static void display(LygArrayList<String> list){
for (int i = 0; i <list.size(); i++) {
System.out.print(list.get(i)+" ");
}
}
}
LygArrayList<String> list = new LygArrayList<String>();
for (int i = 0; i < 15; i++) {
list.add(i+"");
}
display(list);
}
public static void display(LygArrayList<String> list){
for (int i = 0; i <list.size(); i++) {
System.out.print(list.get(i)+" ");
}
}
}
//效果