本帖最后由 mayingzhi09 于 2018-4-7 14:12 编辑
1.并发修改异常
产生的原因:
迭代器依赖于集合存在,在判断成功后,集合添加了新元素,而迭代器不知道,所以报错
其实就是迭代器遍历集合的时候不要用集合对象来修改(增加或删除)集合
解决办法:
迭代器遍历的时候通过迭代器修改集合中的元素
新元素是跟在刚才迭代的元素的后面
集合遍历的时候可以通过集合对象来修改
新元素跟在原集合的最后面
2.增强for
用来替代迭代器
如果产生并发修改异常则没有办法解决
3.数据结构
3.1栈:(进口和出口在同一端)
先进后出
3.2.队列:(进口和出口在不同的两端)
先进先出
3.3.数组:
查询快,增删慢
3.4.链表:(由一个链子把多个结点连接起来的数据)
结点:由数据和地址组成
前一个结点包括此结点的数据和后面结点的地址
最后一个结点包括此节点的数据和null;
查询慢,增删快
4.ArrayList与LinkedList的数据结构的特点:
ArrayList:
数组:查询快,增删慢
LinkedList:
链表:查询慢,增删快
5.Set集合中add方法源码和注释
public V put(K key, V value) {
//hash方法内部调用了hashCode()方法
//native 代表该方法调用了c/c++的方法
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table; e != null; e = e.next) {
Object k;
//比较hash值 比较集合内元素的key与传入的元素key的地址值||key的内容
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
//如果进入到这里就不会添加
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
//下面两行代码才会把代码添加到集合中
modCount++;
addEntry(hash, key, value, i);
return null;
}
// if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
// e.hash == hash 比较hash值
// ((k = e.key) == key || key.equals(k))
// k = e.key) == key 判断地址值是否相等
// key.equals(k) 判断结果是否相等
//重复的条件:
// 1.比较hash值是否相等
// 2.判断地址值是否相等或者判断结果是否相等
// 两者都满足,代表元素相等
6.Map集合put方法
键重复的话
新的值会覆盖旧的值,返回旧的值
|
|