自定义实现一个ArrayList,体会底层原理
初始结构,代码如下:
public class JtArrayList01 {
Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
public JtArrayList01(){
elementData = new Object[DEFALT_CAPACITY];
}
public JtArrayList01(int capacity){
elementData = new Object[capacity];
}
public void add(Object object){
elementData[size++] = object;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
//[a,b,c]
stringBuilder.append("[");
for (int i = 0;i < size;i++){
stringBuilder.append(elementData[i]+",");
}
stringBuilder.setCharAt(stringBuilder.length()-1, ']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtArrayList01 jtArrayList01 = new JtArrayList01(20);
jtArrayList01.add("aa");
jtArrayList01.add("bb");
System.out.println(jtArrayList01);
}
}
给ArrayList增加泛型,代码如下:
public class JtArrayList02 <E>{
Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
public JtArrayList02(){
elementData = new Object[DEFALT_CAPACITY];
}
public JtArrayList02(int capacity){
elementData = new Object[capacity];
}
public void add(E element){
elementData[size++] = element;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
//[a,b,c]
stringBuilder.append("[");
for (int i = 0;i < size;i++){
stringBuilder.append(elementData[i]+",");
}
stringBuilder.setCharAt(stringBuilder.length()-1, ']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtArrayList01 jtArrayList01 = new JtArrayList01(20);
jtArrayList01.add("aa");
jtArrayList01.add("bb");
System.out.println(jtArrayList01);
}
}
增加数组扩容,代码如下:
public class JtArrayList03<E>{
Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
public JtArrayList03(){
elementData = new Object[DEFALT_CAPACITY];
}
public JtArrayList03(int capacity){
elementData = new Object[capacity];
}
public void add(E element){
//什么时候扩容
if(size == elementData.length){
//扩容操作
Object[] newArray = new Object[elementData.length+(elementData.length>>1)];//10-->10+10/2
System.arraycopy(elementData,0,newArray,0,elementData.length);
elementData = newArray;
}
elementData[size++] = element;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
//[a,b,c]
stringBuilder.append("[");
for (int i = 0;i < size;i++){
stringBuilder.append(elementData[i]+",");
}
stringBuilder.setCharAt(stringBuilder.length()-1, ']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtArrayList03 jtArrayList03 = new JtArrayList03();
for (int i = 0;i<40;i++){
jtArrayList03.add("金"+i);
}
System.out.println(jtArrayList03);
}
}
增加set和get方法以及数组边界的检查,代码如下:
public class JtArrayList04<E> {
Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
public JtArrayList04() {
elementData = new Object[DEFALT_CAPACITY];
}
public JtArrayList04(int capacity) {
if (capacity < 0) {
throw new RuntimeException("容器的容量不能为负数");
} else if (capacity == 0) {
elementData = new Object[DEFALT_CAPACITY];
} else {
elementData = new Object[capacity];
}
}
public void add(E element) {
//什么时候扩容
if (size == elementData.length) {
//扩容操作
Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];//10-->10+10/2
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = element;
}
public E get(int index) {
checkRange(index);
return (E) elementData[index];
}
public void set(E element, int index) {
checkRange(index);
elementData[index] = element;
}
public void checkRange(int index) {
//索引合法判断[0,size) 10 0-9
if (index < 0 || index > size - 1) {
//不合法
throw new RuntimeException("索引不合法:" + index);
}
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
//[a,b,c]
stringBuilder.append("[");
for (int i = 0; i < size; i++) {
stringBuilder.append(elementData[i] + ",");
}
stringBuilder.setCharAt(stringBuilder.length() - 1, ']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtArrayList04 jtArrayList04 = new JtArrayList04();
for (int i = 0; i < 40; i++) {
jtArrayList04.add("金" + i);
}
jtArrayList04.set("小花", 4);
System.out.println(jtArrayList04);
System.out.println(jtArrayList04.get(39));
}
}
增加remove方法,代码如下:
public class JtArrayList05<E> {
Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
public JtArrayList05() {
elementData = new Object[DEFALT_CAPACITY];
}
public JtArrayList05(int capacity) {
if (capacity < 0) {
throw new RuntimeException("容器的容量不能为负数");
} else if (capacity == 0) {
elementData = new Object[DEFALT_CAPACITY];
} else {
elementData = new Object[capacity];
}
}
public void add(E element) {
//什么时候扩容
if (size == elementData.length) {
//扩容操作
Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];//10-->10+10/2
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = element;
}
public E get(int index) {
checkRange(index);
return (E) elementData[index];
}
public void set(E element, int index) {
checkRange(index);
elementData[index] = element;
}
public void checkRange(int index) {
//索引合法判断[0,size) 10 0-9
if (index < 0 || index > size - 1) {
//不合法
throw new RuntimeException("索引不合法:" + index);
}
}
public void remove(E element) {
//element和所有元素挨个比较,获得第一个比较为true的,返回
for (int i = 0; i < size; i++) {
if (element.equals(get(i))) { //容器中所有的比较操作。都是用的equals而不是==
//将该元素从此处移除?
remove(i);
}
}
}
public void remove(int index) {
//a,b,c,d,e,f,g,h
int numMoved = elementData.length - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;
}
public int size(){
return size;
}
public boolean isEmpty(){
return size==0?true:false;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
//[a,b,c]
stringBuilder.append("[");
for (int i = 0; i < size; i++) {
stringBuilder.append(elementData[i] + ",");
}
stringBuilder.setCharAt(stringBuilder.length() - 1, ']');
return stringBuilder.toString();
}
public static void main(String[] args) {
JtArrayList05 jtArrayList05 = new JtArrayList05();
for (int i = 0; i < 40; i++) {
jtArrayList05.add("金" + i);
}
jtArrayList05.set("小花", 4);
System.out.println(jtArrayList05);
System.out.println(jtArrayList05.get(39));
jtArrayList05.remove(3);
jtArrayList05.remove("金11");
System.out.println(jtArrayList05);
System.out.println(jtArrayList05.size);
System.out.println(jtArrayList05.isEmpty());
}
}