Java ArrayList特點:
ArrayList底層是用數組實現的存儲。 特點:查詢效率高,增刪效率低,線程不安全。
查看ArrayList源碼:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
transient Object[] elementData; // non-private to simplify nested class access
/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;
....
分析:可以看出ArrayList底層使用Object數組來存儲元素數據,ArrayList是可以存放任意數量的對象,長度不受限制,如何實現?我們來實現一下。
Step1:構造主框架
package com.ysl.mycollection;
public class SxtArrayList<E> {
private Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
public SxtArrayList(){
elementData = new Object[DEFALT_CAPACITY];
}
public SxtArrayList(int capacity){
public void add(E element){
}
public void remove(E element){
}
public void remove(int index){
}
public E get(int index){
}
public void set(E element, int index){
}
public boolean isEmpty(){
}
//索引合法判斷
public void checkRange(int index){
}
@Override
public String toString() {
}
public static void main(String[] args) {
SxtArrayList s1= new SxtArrayList<>();
}
}
Step2:class SxtArrayList<E>下定義部分方法
public void add(E element){
if(size == elementData.length){
Object[] newArray = new Object[elementData.length+(elementData.length>>1)];
System.arraycopy(elementData,0,newArray,0,elementData.length);
elementData = newArray;
}
elementData[size++] = element;
}
public void remove(E element){
for(int i=0;i<size;i++){
if(element.equals(get(i))){
remove(i);
}
}
}
public void remove(int index){
int num = elementData.length-index-1;
if (num > 0) {
System.arraycopy(elementData,index+1,elementData,index,num);
}
elementData[size-1]=null;
size--;
}
public E get(int index){
checkRange(index);
return (E)elementData[index];
}
public void set(E element, int index){
checkRange(index);
elementData[index] = element;
}
public boolean isEmpty(){
return size==0?true:false;
}
//索引合法判斷
public void checkRange(int index){
if(index<0||index>size-1){
throw new RuntimeException("索引不合法:"+index);
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
//控制輸出格式爲[a,b,c]
sb.append("[");
for(int i=0;i<size;i++){
sb.append(elementData[i]+",");
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
Step3:main方法中實現方法
for(int i=0;i<40;i++){
s1.add("Ysl"+i);
}
s1.set("tyy",39);
s1.remove("Ysl1");
System.out.println(s1.isEmpty());
System.out.println(s1);