A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

mayingzhi09

初级黑马

  • 黑马币:19

  • 帖子:6

  • 精华:0

本帖最后由 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方法
键重复的话
        新的值会覆盖旧的值,返回旧的值




2 个回复

倒序浏览
值得推荐,666,
赞赞赞
回复 使用道具 举报
值得拥有
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马