package collection;
/**
* 自定义MyList接口,模仿的是List接口
* @param <E>
*/
public interface MyList<E> {//Element
int size();
boolean isEmpty();
void add(E obj);
public void add(int index,E obj);
public E set(int index, E obj);
public E get(int index);
public boolean contains(E obj);
Object[] toArray();
boolean remove(E obj);
void remove(int index);
void clear();
}
package collection;
import java.util.Arrays;
public class MyArrayList<E> implements MyList<E>{
public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<>(10);
System.out.println(list);
list.add("aa");
list.add("bb");
list.add("cc");
list.add(1,"dd");
list.set(3,"ii");
String str =list.get(3);
System.out.println(str);
System.out.println(list.contains("ee"));
list.remove(1);
System.out.println(list.remove("ii"));
// list.clear();
System.out.println(list);
}
private int size;
private Object[] elementData;
public MyArrayList() {
this(10);
}
public MyArrayList(int initialCapacity){
if (initialCapacity<0){
try {
throw new Exception("容器初始化大小不能为负数");
} catch (Exception e) {
e.printStackTrace();
}
}
elementData = new Object[initialCapacity];
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elementData[i]+"\t");
}
sb.append("]");
return sb.toString();
}
@Override
public void add(Object obj) {
ensureCapacity();
elementData[size] = obj;
size++;
}
@Override
public void add(int index, Object obj) {
// 索引是否合法判断
rangeCheck(index);
ensureCapacity();
System.arraycopy(elementData,index,elementData,index+1,size-index);
elementData[index] = obj;
size++;
}
private void ensureCapacity(){
// 如果已经放满了元素,则扩容
if (size == elementData.length){
Object[] newArray = new Object[elementData.length*2+1];//数组的扩容
System.arraycopy(elementData,0,newArray,0,elementData.length);
elementData = newArray;
}
}
// 索引是否合法
private void rangeCheck(int index){
if (index<0 || index>=size){
try {
throw new Exception("索引必须位于0到size-1之间");
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public E set(int index, Object obj) {
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return (E)oldValue;
}
@Override
public E get(int index) {
rangeCheck(index);
return (E)elementData[index];
}
@Override
public boolean contains(Object obj) {
for (int i = 0; i < size; i++) {
if (elementData[i]==obj){
return true;
}
}
return false;
}
@Override
public Object[] toArray() {
return new Object[0];
}
@Override
public void remove(int index) {
rangeCheck(index);
System.arraycopy(elementData,index+1,elementData,index,size-(index+1));
size--;
elementData[size] = null;
}
@Override
public boolean remove(E obj) {
for (int i = 0; i < size; i++) {
if (elementData[i] == obj){
remove(i);
return true;
}
}
return false;
}
@Override
public void clear() {
for (int i = 0; i < size; i++) {
elementData[i] = null;
}
size = 0;
}
}