ArrayListt (数组,满了后扩大空间,x1.5)以下用Array:一次性追加数据,一次性读取。线程不安全
LinkedList(双向链表)随机增删查用Link.线程不安全
Vector(满了空间x2)线程安全。
关注深拷贝,浅拷贝。
迭代器遍历一个List时候抛出异常的原因:有一个modcount值,在把list放入迭代器的时候这个值就赋给迭代器中的一个值,因为list是线程不安全的,如果此时有人修改了这个list,这个modcout就会++,这个迭代器遍历中比较二者发现modcount改变了,所以抛出异常。
想在迭代器里遍历可以先定一个迭代器
Iterator<String> it = strList.iterator();
这样在迭代的过程中可以删除元素,debug时候可以查看到源码中迭代器的上面说的那个值是同步更新的
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;//就是这个
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
1.结合散列函数,说明散列表快速索引的原理,说明如何解决冲突。
2.不重写hascode equals,就会调用object的,无法对key值为对象(某个类的实例化对象)进行有效比较。因为比较的是存储地址。基本数据类型和实例化对象存储位置不一样,不同的对象有不同的地址。
3.如何重写。最好根据类的主键进行判断。