next

集合List之ConcurrentModificationException异常分析

强颜欢笑 提交于 2020-12-25 03:20:22
一、前言     Java中,集合类ArrayList不管是在开发工作中,还是在面试中,都应该是个比较高频出现的知识点。在使用过程中,可能会遇到迭代删除的需求场景,此时如果代码书写不当,极有可能会抛出 java.util.ConcurrentModificationException 异常信息。下面对这个异常做点分析,为什么会出现异常,怎样去正确的迭代删除。 二、异常原因分析   测试代码如下: package com.cfang.prebo.oTest; import java.util.Iterator; import java.util.List; import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; public class TestListException { public static void main(String[] args) { List<Integer> list = Lists.newArrayList(); list.add(1); Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()) { Integer val = iterator.next(); if(val ==

集合遍历remove时ConcurrentModificationException异常

大憨熊 提交于 2020-12-25 02:42:34
1.集合遍历时候,有时候需要remove或add操作,这时候 遍历方式 可能会影响程序运行   例如: @Test public void test1() { List <Integer> intList = new ArrayList<> (); for ( int i = 0; i < 20; i++ ) { intList.add(Integer.valueOf(i)); } // 迭代器遍历, 异常 Iterator<Integer> iterator_int = intList.iterator(); while (iterator_int.hasNext()) { Integer integer = iterator_int.next(); // ConcurrentModificationException if (integer.intValue() == 5) { // 这里选择集合靠中间的数据操作 // intList.remove(integer); //这里使用集合的remove方法 intList.add(55 ); } } // foreach遍历, 异常 for (Integer value : intList) { // ConcurrentModificationException if (value.intValue() == 5 ) {

JS抽象语法树AST基础学习

心不动则不痛 提交于 2020-12-24 22:14:21
点击上方“ 咸鱼学Python ”,选择“ 加为星标 ” 第一时间关注Python技术干货! 原文地址:http://www.goyth.com/2018/12/23/AST/ 相关内容推荐 JS 逆向高阶 | JS 逆向的噩梦 - AST 抽象语法树 为什么要了解AST 如果你想了解 js 编译执行的原理,那么你就得了解 AST,目前前端常用的一些插件或者工具,比如说javascript转译、代码压缩、css预处理器、elint、pretiier等功能的实现,都是建立在 AST 的基础之上。 JavaScript 编译执行流程 js执行的第一步是读取 js 文件中的字符流,然后通过词法分析生成token,之后再通过语法分析生成 AST(Abstract Syntax Tree),最后生成机器码执行。 词法分析 词法分析,也称之为扫描(scanner),简单来说就是调用 next() 方法,一个一个字母的来读取字符,然后与定义好的 JavaScript 关键字符做比较,生成对应的Token。Token 是一个不可分割的最小单元,例如 var 这三个字符,它只能作为一个整体,语义上不能再被分解,因此它是一个 Token。词法分析器里,每个关键字是一个 Token ,每个标识符是一个 Token,每个操作符是一个 Token,每个标点符号也都是一个 Token。除此之外

环路检测

别等时光非礼了梦想. 提交于 2020-12-24 21:18:30
题目描述 解题思路 图中紫色节点为相遇节点,若快慢指针相遇,必定满足如下关系: 我们使用两个指针,它们起始都位于链表的头部。随后慢指针每次向后移动一个位置,而快指针向后移动两个位置。如果链表中存在环,则快 指针最终将再次与 慢指针在环中相遇。 当慢指针进入环以后,慢指针还没走完一个环的时候,快指针必定与之相遇,此时快指针可能已经走了n次环了。因此走过的距离为:s=a+n*(b+c)+b 任意时刻,快指针走过的距离都是慢指针的两倍 所以 2*(a+b)=a+n*(b+c)+b 所以得出 a=nb+nc-b 即是 a=(n-1) b+nc 即是 a=c+(n-1) (b+c) 从3可知,慢指针走完a表示着快指针走完c加n-1圈周长,因此他们会在入口节点相遇。 解题代码如下 /** * @description: * @author: lilang * @version: * @modified By:1170370113@qq.com */ public class ListSolution { public ListNode detectCycle(ListNode head) { if (head == null) { return null; } ListNode goFast, goSlow; goFast = goSlow = head; boolean isCycle =

一次线上内存溢出的排查

女生的网名这么多〃 提交于 2020-12-24 19:33:31
点击上方“ 程序员小灰 ”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 本文转载自公众号 你假笨 或许大家曾经都碰到过HashMap因为其非线程安全的多线程并发操作导致cpu飙高的问题,不过这个问题在JDK8里已经解决掉了,其根本原因网上也早已遍地开花,所以我这篇文章里就不再熬述了,不了解的可以去网上找找相关文章,本文和大家聊的是看到的另外一个现象——内存溢出。 现象 同事丢了一个链接过来,是内存分析的,我看到一个线程占用的内存非常高,这个问题其实已然非常明显了,展开看了下线程栈: 正在调用一个Map对象的toString方法,直到抛出 java.lang.OutOfMemoryError ,之所以这个栈顶能看到OutOfMemoryError的逻辑是因为配置了 -XX:+HeapDumpOnOutOfMemoryError 参数。 这个参数的官方说明如下: 不过这个参数只会生效一次,不会每次OOM的时候都做内存dump,大家可以想像一下,如果是代码的问题会发生连续的OOM,那连续做dump也没必要,于是JVM里控制这个参数只会在第一次发生OOM的时候做一次内存dump。 分析 其实在我看到这个OutOfMemoryError栈之后,还没等同事说多少话,我就立马要同事去看我之前那篇关于OOM的文章了,想表达的是虽然这个线程栈里看到了OOM

读源码理解Redux Middleware 中间件

被刻印的时光 ゝ 提交于 2020-12-24 15:04:31
Redux 是 React 生态中最出名的状态管理库,它的中间件(middleware)机制让 redux 更加灵活,衍生出诸如 redux-thunk , redux-promise, redux-saga 等 middleware。 Redux 的中间件机制的基本逻辑如下: 构建 redux store 时,调用 applyMiddleware 函数将 middlewares 插入整个 action 流程中 每个 middleware 都会参与到 action 的 dispatch 整个流程 每个 middleware 都需要自行判读要不要处理当前的 action ,例如 thunk 只处理 函数类型的 action, redux-promise 只处理 promise 类型的 action 如果某个 middleware 不处理当前action,就转手交给下个 middleware 最后一个 middleware 如果不处理当前action,就转手交给 redux 内置的 store.dispatch 方法,进行 redux 标准的 action 处理 这个机制不难理解,但是不少开发者在阅读相关源码时遇到不小困难。 本文将一一拆解 middleware 相关源码,尽力让读者承受最少的心智负担读懂它。 applyMiddleware.ts https:// github.com

一个由Tooltip引发的 React Ref 讨论

别说谁变了你拦得住时间么 提交于 2020-12-24 15:03:57
Tooltip 大家应该都知道,就是我们常见的 当用户移动鼠标悬浮在 按钮 时会跳出显示的小文字框,比如知乎网页编辑器上的各类图标按钮都设置了 Tooltip 最近在使用 Material-UI Tooltip 时遇到到了个小问题,牵扯出了一系列关于 React Ref 的问题和思考,在本文分享给读者们。 出问题的代码如下 <Tooltip title="hi zhihu"> <FunctionComponent/> </Tooltip> 原意是希望在一个函数组件的周围显示一个简单的Tooltip 但是不仅没有成功显示,还在 console 里报出了以下warning log Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()? 里面显示了2个信息: Function components cannot be given refs 函数组件不能使用 ref React.forwardRef() 提示使用这个方法 可是,这几行代码里并没有看到 ref 啊 在直接看 Tooltip 源码前,我先去看了文档 https:// material-ui.com/compone nts

达梦数据库 随笔

假装没事ソ 提交于 2020-12-24 14:27:09
创建表空间 文件路径:/dm7/data/PROD/tbs1_01.dbf 初始大小:128M 每次自动扩充:8M; 最大尺寸:20G create tablespace tbs1 datafile '/home/dm8/data/PROD/tbs1_01.dbf' size 128 autoextend on next 8 maxsize 20480; 创建用户 CREATE USER "YSADMIN" IDENTIFIED BY "123456789" DEFAULT TABLESPACE "MOOC" ; 给权限 GRANT create table,select table,update table,insert table TO YSADMIN; GRANT DBA TO YSADMIN; 创建表 create table YSADMIN.PERSON ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(60) NOT NULL, address VARCHAR(60), age int ) STORAGE (on MOOC); 来源: oschina 链接: https://my.oschina.net/u/3305368/blog/4837450

如何去除有序数组的重复元素

孤街浪徒 提交于 2020-12-24 07:48:40
我们知道对于数组来说,在尾部插入、删除元素是比较高效的,时间复杂度是 O(1),但是如果在中间或者开头插入、删除元素,就会涉及数据的搬移,时间复杂度为 O(N),效率较低。 所以上篇文章 O(1)时间删除/查找数组中的任意元素 就讲了一种技巧,把待删除元素交换到最后一个,然后再删除,就可以避免数据搬移。 PS: 我认真写了 100 多篇原创,手把手刷 200 道力扣题目,全部发布在 labuladong的算法小抄 ,持续更新 。建议收藏, 按照我的文章顺序刷题 ,掌握各种算法套路后投再入题海就如鱼得水了。 有序数组/链表去重 先讲讲如何对一个有序数组去重,先看下题目: 函数签名如下: int removeDuplicates(int[] nums); 显然,由于数组已经排序,所以重复的元素一定连在一起,找出它们并不难,但如果毎找到一个重复元素就立即删除它,就是在数组中间进行删除操作,整个时间复杂度是会达到 O(N^2)。 PS: 我认真写了 100 多篇原创,手把手刷 200 道力扣题目,全部发布在 labuladong的算法小抄 ,持续更新 。建议收藏, 按照我的文章顺序刷题 ,掌握各种算法套路后投再入题海就如鱼得水了。 简单解释一下什么是原地修改: 如果不是原地修改的话,我们直接 new 一个 int[] 数组,把去重之后的元素放进这个新数组中,然后返回这个新数组即可。

在ZYBO板卡上实现PL-PS交互(通过AXI的方式)

自作多情 提交于 2020-12-24 07:46:17
前情提要 :参考的是下面所说的原网页,只是原作者用的是vivado 2014.4,我用vivado 2018.2跑的,图是新的,内容大多“换汤不换药”,但是我在做的时候存在一些问题,我记录了下来并将解决方法加到了下面的文字中,因此在我的主机上是可以跑通的。不当之处多多包涵。如有侵权请联系删除。 目的 :学会vivado PL-PS协同开发流程 平台 :ZYBO开发板,zynq-7010 clg400芯片 工具 :Vivado 2018.2 功能 :实现PL-PS协同通信,PS通过AXI总线读取PL部分的GPIO状态(对应Zybo的四个开关输入),然后根据读取值,写入GPIO(对应Zybo的四个LED输出) 原网页 : http://www.digilent.com.cn/community/4.html 1. 打开vivado,点击create newproject: 2. 输入工程名、工程路径,如下图。然后点击next: 3. 在project type界面中,按如下图方式勾选,点击next: 4. 在search中输入xc7z010clg400,然后选择xc7z010clg400-1芯片(此芯片为zybo开发板采用的芯片)( *芯片一定要选对 )。如下图所示。点击next: 5. 点击finish,新建工程完成。 6. 工程界面如下图。在vivado下建立工程,有以下几种情况