在多线程编程中,相信很多小伙伴都遇到过并发修改异常ConcurrentModificationException,本篇文章我们就来讲解并发修改异常的现象以及分析一下它是如何产生的。
前两期我们讲解了HashMap的基本原理,以及高并发场景下存在的问题。没看过的小伙伴可以点击下面链接:
很明显,他是在第36行报错的,也就是在遍历完数值为3的数据报错的。让我们往前顺顺,为什么遍历完第二个元素就报错了,因为他遍历完数值为3的数据后,往list里面增加了一个数值为12的数据。
这是 LeetCode 上的「1737. 满足三条件之一需改变的最少字符数」,难度为「中等」。
在ArrayList,LinkedList,HashMap等等的内部实现增,删,改中我们总能看到modCount的身影
java.util.List 接口继承于 Collection 接口,与Map最大的不同之处,在于它属于单列集合,相当于一个列表,有以下这些特点:
随机访问使用list.get(i)方法,从源码中我们可以得知,每次list.get(i)都遍历找到该元素位置再返回,当我们需要遍历一次list,其实list.get(i)会遍历很多次,做了重复性工作。
LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。
在zookeeper shell中使用get命令查看指定路径节点的data、stat信息:
进入 Linux 内核官网 https://www.kernel.org/ 下载 Linux 内核 , 点击右侧 黄色的 " Latest Release "
基于java10.1 零、前言 如果想读读源码测试功力,或读读源码修养身心,或读读源码满足自虐倾向,我建议第一个类是:ArrayList 第一、常用----所以用法比较熟悉,看完源码你也会更明白如何去用 第二、相对简单----1595行代码,刨去注释的一大堆也没有太多,还是hold的住的 第三、还没想好 这篇并不是讲ArrayList,而是Iterator,它是容器以及映射中非常重要的一环 一、迭代器模式 提起设计模式,总是有种只知其形,难达其意的感觉,用三个字说就是高大上 迭代器模
Queue队列通常是先进先出(FIFO),但也有特殊的非FIFO,如本文也分析的PriorityQueue。
这个过程称为Round trip time(简称RTT, 往返时间),mget mset有效节约了RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,这个时候需要pipeline来解决这个问题。
上篇文章 走进 JDK 之 ArrayList(一) 简单分析了 ArrayList 的源码,文末留下了一个问题,modCount 是干啥用的?下面我们通过一个小例子来引出今天的内容。
要想学习分布式应用,ZooKeeper是一个绕不过去的基础系统。它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
AbstractList是实现List接口的一个抽象类,它的地位之与List类似于AbstractCollection之与Collection,同事,AbstractList继承了AbstractCollection,并针对List接口给出了一些默认的实现。而且它是针对随机访问储存数据的方式的,如果需要使用顺序访问储存数据方式,还有一个AbstractSequentialList是AbstractList的子类,顺序访问时应该优先使用它。
在遍历HashMap与LinkedHashMap时,我们通常都会使用到迭代器,而HashMap的迭代器与LinkedHashMap迭代器是如何工作的呢?下面我们来一起分析分析。
LinkedList支持的查询除了通过下标获取外,还支持getLast和getFirst
ArrayList的实现原理就是大学数据结构书本中的动态数组原理,初始化一个Object数组,然后对Object数组进行插入,扩容,查找,删除等操作。所以可以看出java引用类型所占内存大小是一样的,Object数组类似于c语言中的void*指针数组,每个指针在64位机器上都占8字节, 在hotspot jvm中java引用类型也是占8字节。所以ArrayList无法存放基本类型,只能存放引用类型。以下分析ArrayList最基础,最常用的操作。
然后会发现抛出java.util.ConcurrentModificationException异常,这是一个并发异常。那么这个到底是什么情况?首先需要介绍一下增强for循环
每次在wordpress网站修改文章的时候都会产生一个修订版本,wp_posts会产生一个post_type为“REVISIONS”的记录,修改次数一多的话,那修订版本就有几万条记录了
LinkedList是基于双向链表数据结构实现的Java集合(jdk1.8以前基于双向链表),在阅读源码之前,有必要简单了解一下链表。
一个for循环遍历,如果item > 2就执行remove,看上去似乎没有问题的样子,也不会出现报错,但是不符合题目的要求
进入ZooKeeper安装目录下的bin目录,输入如下命令进入ZooKeeper的客户端
注意:这里有两个空数组,第一个空数组是容量为0的时候的数组,第二个空数组是使用空参构造器的时候的数组
迭代可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类。Iterator 模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型集合类中抽象出来,从而避免向客户端暴露集合内部结构。
《Redis设计与实现》读书笔记(十四) ——Redis RDB文件创建、载入与自动保存原理 (原创内容,转载请注明来源,谢谢) 一、概述 redis是一个键值对服务器,服务器中包含
题目链接 题目大意: n个人参加比赛,每个人都有一个分数a[i],现在需要给这些人发奖牌(每个人最多发一个),要求:
PriorityQueue是优先队列,可以按照指定的优先级进行排序,比如某个元素优先级最高,当它插入队列时会被插到队列头。jdk优先队列是通过二叉堆实现的,类似堆排序,根节点始终是优先级最高的元素(其中优先级需要自定义,PriorityQueue的实现是小顶堆,也就是经过compareTo方法比较较小的元素的在顶部,所以我们可以定义数越小优先级越高),父结点的优先级要高于左右孩子结点,优先队列的调整时间复杂度是O(logn)。包括从上往下调整和从下往上调整,以满足二叉堆的性质。
1)czxid-创建节点的事务zxid 每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。 事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。 2)ctime - znode被创建的毫秒数(从1970年开始) 3)mzxid - znode最后更新的事务zxid 4)mtime - znode最后修改的毫秒数(从1970年开始) 5)pZxid-znode最后更新的子节点zxid 6)cversion - znode子节点变化号,znode子节点修改次数 7)dataversion - znode数据变化号 8)aclVersion - znode访问控制列表的变化号 9)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。 10)dataLength- znode的数据长度 11)numChildren - znode子节点数量
集合类分为两个分支,Collection与Map,其中Collection接口继承了Iterator接口,继承Iterator接口的类可以使用迭代器遍历元素(即Collection接口的类都可以使用),今天我们从相同点、不同点、以及JDK源码等各个方面来深入解析下,底层使用数组实现的两个集合类:ArrayList与Vector的区别与联系
ArrayList是最最常用的集合类了,真的没有之一。下面的分析是基于1.8.0_261源码进行分析的。
iterator接口,也是集合大家庭中的一员。和其他的Map和Collection接口不同,iterator 主要是为了方便遍历集合中的所有元素,用于迭代访问集合中的元素,相当于定义了遍历元素的规范,而另外的Map和Collection接口主要是定义了存储元素的规范。
iterator接口,也是集合大家庭中的一员。和其他的Map和Collection接口不同,iterator 主要是为了方便遍历集合中的所有元素,用于迭代访问集合中的元素,相当于定义了遍历元素的规范,而另外的Map和Collection接口主要是定义了存储元素的规范。 还记得么?之前说的iterable接口,有一个方法就是叫iterator(),也是返回iterator对象。
墨墨购买了一套 NNN 支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:
如果一个由 '0' 和 '1' 组成的字符串,是以一些 '0'(可能没有 '0')后面跟着一些 '1'(也可能没有 '1')的形式组成的,那么该字符串是单调递增的。
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
在文件最底部也就是</xml>标签上面加上 <Context path=”/项目名” docBase=”项目名” reloadable=”true” />
ArrayList是我们日常中最长用的集合之一,在使用列表时,除非特殊情况,我们一般都会选择使用ArrayList,本文就ArrayList的几个主要方法主要介绍,并结合几个图片来介绍几个重要操作。
在 ArrayList 的循环中删除元素,会不会出现问题?我开始觉得应该会有什么问题吧,但是不知道问题会在哪里。在经历了一番测试和查阅之后,发现这个“小”问题并不简单!
各位小伙伴大家好~本周我们来介绍两道字符串相关的题目,主要是使用动态规划来进行匹配解题。
注释:levenshtein() 函数比 similar_text() 函数更快。不过,similar_text() 函数通过更少的必需修改次数提供更精确的结果。
原文地址: http://blog.csdn.net/nsrainbow/article/details/42836479 最新课程请关注原作者博客,获得更好的显示体验
查看节点列表有 ls path 和 ls2 path 两个命令,后者是前者的增强,不仅可以查看指定路径下的所有节点,还可以查看当前节点的信息。
levenshtein()函数返回两个字符串之间的 Levenshtein 距离。
Vector和前面说的ArrayList很是类似,这里说的也是1.8版本,它是一个队列,但是本质上底层也是数组实现的。同样继承AbstractList,实现了List,RandomAcess,Cloneable, java.io.Serializable接口。具有以下特点:
Redis之所以快,一个最重要的原因在于它是直接将数据存储在内存,并直接从内存中读取数据的,因此一个绝对不容忽视的问题便是,一旦Redis服务器宕机,内存中的数据将会完全丢失。
领取专属 10元无门槛券
手把手带您无忧上云