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);