Java中有一神奇的东西,他能将我们直观的或是思维中的某种确定的能够区分的对象汇合在一起,比如一些字符串,一些数字,一些对象等等;这就是数组。数组的出现使我们在展现,操作方面得到了显而易见的方便。
但是,数组有一个弊端,那就是当你创建一个数组的时候,其大小是固定的,不可变的,这让我们非常的困惑。大家都知道往往在大多情况下,我们所需要的数据是可变的,因为我们的数据的数量是可变的,这样我们的数组就不能满足我们的需要,这可怎么办呢?
有人会说,将数组的大小定在足够大不就行了。这个方法好么?答案很明显,如果将数组定了足够大,那么如果数据的数量没有达到数组的大小或是有超出的大小怎么办呢?有人会说我们可以将数组的初始大小设置最小,然后让数组的大小随着数据量的变化而变化;
很不错的想法,但是如果这样的我们就会频繁的创建数组,这样的话其效率可想而知了。
好吧。我们现在将问题总结一下:
1.我们需要知道数组需要创建多大才能满足我们的需求;
2.我们需要知道何时需要扩充数组;
3.如果需要扩充的话,扩充的容量为多少?(这点很重要,因为我们如果扩充小了会影响效率,如果扩充大了就会造成浪费)
4.如果数据量已不再变化,数据个数与数组大小不相等怎么办;
根据上述总结的问题,我们得知这需要创建一个新的类,来实现这种相当于活生生的很智能的数组,那么他就要具备数组的基本操作增删查该,还要包括以上说的问题,我们现在就实现一下这个神奇的智能的动态数组。
我们先来定义一下这个类应该有什么样的方法,我们将分成8大类来定义方法
1.对结果集的操作queryoperations
2.对数组修改操作modificationoperations
3.批量修改操作bulkmodificationoperations
4.比较和hashcodeComparisonandhashing
5.对于数据存放位置的操作positionalaccessoperations
6.列表迭代ListIterators
7.搜索操作SearchOperations
8.查看View
package myList;
import java.util.Iterator;
/**
* 一个模拟List的接口
*
* @author 姜侠
*
* @param <E>
*/
public interface MyList<E> {
// 对结果集的操作query operations
/**
* 返回结果集的大小
*/
public int size();
/**
* 判断结果集中是否为空
*
* @return trun为空,false不为空
*/
public boolean isEmpty();
/**
* 判断此对象是否存在在结果集中(包含)
*
* @param obj
* 对象
* @return
*/
public boolean contains(Object obj);
/**
* 将数组转换为迭代器
*
* @return
*/
public Iterator<E> iterator();
/**
* 返回一个数组,顺序,数据都一样
*
* @return
*/
public Object[] toArray();
// 对数组修改操作modification operations
/**
* 添加操作,添加成功返回true
*/
public boolean add(E e);
/**
* 删除操作,删除成功返回true
*
* @param obj
* @return
*/
public boolean remove(Object obj);
// 批量修改操作 bulk modification operations
/**
* 判断传进来的数组是否与该数组中的元素一致(包含)
*/
public boolean containsAll(MyList<E> list);
/**
* 删除数组中指定的元素
*
* @param objs
* @return
*/
public boolean removeAll(MyList<E> list);
/**
* 添加此数组中指定的元素(并集)
*
* @param objs
* @return
*/
public boolean addAll(MyList<E> list);
/**
* 添加此数组中指定元素,添加到指定的位置上(并集)
*
* @param index
* @param objs
* @return
*/
public boolean addAll(int index, MyList<E> list);
/**
* 将此数组中的元素保留,其他元素删除(取2集合交集)
*
* @param objs
* @return
*/
public boolean retainAll(MyList<E> list);
/**
* 删除此数组中所有元素
*/
public void clear();
// 对于数据存放位置的操作 positional access operations
/**
* 返回指定元素
*/
public E get(int index);
/**
* 更改指定位置上的元素
*
* @param index
* 位置
* @param element
* 新元素
* @return
*/
public E set(int index, E element);
/**
* 在指定位置上添加一个元素
*
* @param index
* 指定位置
* @param element
* 新元素
*/
public void add(int index, E element);
/**
* 删除指定位置上的元素
*
* @param index
* @return
*/
public E remove(int index);
// 对于数据存放位置的操作 positional access operations
/**
* 从头遍历数组查找该对象,返回相应位置
*/
public int indexOf(E e);
/**
* 从末尾开始向前查找该对象,返回相应位置
*
* @param e
* @return
*/
public int lastIndexOf(E e);
//按照相应条件查看数据 veiw
/**
* 显式指定位置的数据
* @param fromIndex 开始位置
* @param toIndex 结束位置
*/
public Object[] subList(int fromIndex , int toIndex);
/**
* 记录这个数组被重构(更改)的次数
* @return
*/
public int getModCount();
}