Collection
集合类体系结构
ps:接口不能直接创建对象,要调用子类来实例化
ArrayList接口
/**
* 创建Collection集合的对象
* Collection为接口,通过子类ArrayList来实例化
*/
Collection<String> c = new ArrayList<String>();
//添加元素,boolean add(E e)
c.add("JYQ");
c.add("WST");
System.out.println(c);
//boolean remove(Object o);从集合中移除指定元素
c.remove("JYQ");
System.out.println(c);
//void clear();清空集合中的对象
c.clear();
//boolean contains(Object o);判断该元素是否存在
System.out.println(c.contains("WST"));
//boolean isEmpty();判断集合是否为空
System.out.println(c.isEmpty());
//int size();判断集合元素个数
System.out.println(c.size());
Iterator接口(迭代器)
Collection<String> c = new ArrayList<String>();
//添加元素,boolean add(E e)
c.add("JYQ");
c.add("WST");
//返回集合的迭代器
Iterator<String> it = c.iterator();
//E next();返回迭代中的下一个元素,不能越界
System.out.println(it.next());
System.out.println(it.next());
//boolean hasNext();如果迭代中具有更多元素则返回true
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
并发修改异常
List<String> list = new ArrayList<String>();
list.add("WST");
list.add("JYQ");
//void add(int index, E element);添加到指定位置
list.add(1,"WYX");
System.out.println(list);
//E remove(int index);删除指定位置元素,并返回该元素
System.out.println(list.remove(2));
System.out.println(list);
//E set(int index, E element);修改指定位置元素
System.out.println(list.set(1,"JYQ"));
System.out.println(list);
//E get(int index);返回指定索引处的元素
System.out.println(list.get(1));
Iterator<String> s =list.iterator();
System.out.println(s.next());
//遍历集合:得到每一个元素,看有没有“JYQ”这个元素,如果有,我就添加一个“WYX”元素
// while(s.hasNext()){
// String str =s.next();//ConcurrentModificationException
// if(str.equals("JYQ")){
// list.add("WYX");
// //调用add方法会执行modCount++;然后modCount与expectModCount不同
// //故会出现并发修改异常
// }
// }
for(int i = 0;i<list.size();i++){
String str = list.get(i);//get()不做modCount与expectModCount的判断
if(str.equals("JYQ")){
list.add("WYX");
}
}
}
public interface List<E>{
Iterator<E> iterator();
boolean add(E e);
}
public abstract class AbstractList<E>{
int modCount = 0;
}
public class ArrayList<E> extends AbstractList<E> implements List<E>{
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int expectedModCount = modCount;
/*
modCount:实际修改的次数
expectModCount:预期修改的次数
*/
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
ListIterator
Iterator迭代器相当于单链表,ListIterator迭代器相当于双链表
List<String> list = new ArrayList<String>();
list.add("WST");
list.add("JYQ");
ListIterator<String> lit = list.listIterator();
//从前往后遍历
while(lit.hasNext()){
String s = lit.next();
System.out.println(s);
}
//从最后向前遍历
while(lit.hasPrevious()){
String s2 = lit.previous();
System.out.println(s2);
}
while(lit.hasNext()){
String s = lit.next();
if(s.equals("JYQ")){
lit.add("WYX");//ListIterator迭代器所特有
//列表迭代器中的add方法会将modCount赋值给expectModCount
//故不会报错
}
}
System.out.println(list);