列表
AarrayList
变长的数组(增删改查)
执行实例化 new ArrayList,定义了一个空数组
添加数据
********Add方法(增)
初始容量为10,把空数组扩容,扩容到10个元素,
Arrays.copyOf
把其中的一个元素添加到数组中
面向对象编程: 一切皆对象,对象所有类的父类 Object
Class My extends Object{
}
Int型不属于,java把int写成类Integer,int简单类型,Integer的简单类型的包装类
获取元素的方法
*********get(索引值)---查
索引值从0开始计算索引
本来扩容了10个元素的数组,只有一部分有值,没有值就是null,官方源码中有一个rangCheck(),方法不允许访问数组中的空元素.
返回异常
return new Exception("Exception in thread \"main\" java.lang.IndexOutOfBoundsException");
列表:
打印列表的变量名称时,输出列表中所有的元素。因为ArrayList---àAbastractArrayList--àAbstractColection(重写toString())
打印数组中元素是需要Arrays.toString();
**********remove del(删)
remove按照索引进行删除
[null,null,null,null,.....]
[1,2,3,4,5,6,7,8,null,null]
把索引为2的 3元素去掉, 后面元素不会自动往前走
数组长度不变,把4,5,6,7,8往前走一个索引。后面多余的元素还是null
官方没有循环,使用
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
因为数组是定长,这里删除应该新的数组,这里只把元素做移动,官方做移动的原理还是数组的拷贝,移动前后的数组本来是两个数组,如果名称一致是一个数组,前面数组参数index+1,删除索引的后面元素, 后面元素相当于往前提一个位置,后面数组参数index,也就是前面数组元素的index+1覆盖后面数组元素index
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
总结:
数组扩容: Arrays.copyOf
数组的删除:System.arraycopy
*******修改
数组本身具体数据的修改
修改使用set
列表中其它方法
列表长度使用
Size( )底层记录列表的长度就是size
isEmpty()判断当前列表是否为空
indexOf判断当前列表中是否有某个元素
lastIndexOf底层是倒序遍历
clone()克隆:底层就是执行Arrays.copyOf又产生一个数组
在Arrays.copyOf中的底层还是调用System.copyOf
toArray() 把当前的列表转成数组,底层还是用的Arrays.copy
clear()把列表清空
for循环,把所有的列表元素置null,size置0
removeAll 移除所有的元素
listIterator 把所有的迭代器显示
iterator() 获取列表的迭代器
subList,从某一个索引到某一个索引取子列表
forEach进行遍历
replace替换方法,替换所有的元素
replaceAll
sort排序调用的Arrays.sort 排序方法.
仿造官方ArrayList写一个自己的ArrayList.
在AbstractArrayList
Get方法没实现:
abstract public E get(int index);
试验一下
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
indexOf在AbstractArrayList中实现
直接在Abstract实现.记住(官方在Abstract中的做的迭代器,官方在ArrayList作的是循环)
Abstract里面调用方法
public void clear() {
removeRange(0, size());
}
在abstract里面重写equals,双重for循环比较
hashCode都重写的,列表的算法与String算法相同
在clear方法中调用了
protected void removeRange(int fromIndex, int toIndex) {
ListIterator<E> it = listIterator(fromIndex);
for (int i=0, n=toIndex-fromIndex; i<n; i++) {
it.next();
it.remove();
}
}
上层是abstractCollection
重写contains
toArray
remove方法在abstractCollection也实现了
containsAll包含所有元素
removeAll把所有元素清除
Collection接口方法
int size();
boolean isEmpty();
boolean contains(Object o);
Object[] toArray();
boolean add(E e);
boolean remove(Object o);
boolean removeAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
List接口
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean removeAll(Collection<?> c);
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
boolean equals(Object o);
int hashCode();
E get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
void clear();