这篇文章中,我将演示动态绑定、应用运行期代码变化进行绑定、介绍一些工具 API 以及 Byte Buddy 库,这个库提供了一些 API 代码改变更方便。...但 HotSwap 给我们提供了另外一种选择:在不重启应用的前提下进行小幅改动。...Attach API:使用动态附件来渗透另外一个 JVM 为了修改一个运行中的 Java 程序,我们首先需要一种可以同处在运行状态的 JVM 进行通信的方式。...有了一个 Java 代理,VM 和指定的进程 id 就可以查找到一个名为 agentmain 的方法,该方法可以由指定线程中的远程进程来执行: public class HelloWorldAgent...后续的修改,Java 代理可以定义第二参数来接收一个 Instrumentation 的实例 。稍后要实现的接口提供了向几个底层方法的访问途径,它们中的一个就能够对已经加载的代码进行修改。
这篇文章中,我将演示动态绑定、应用运行期代码变化进行绑定、介绍一些工具 API 以及 Byte Buddy 库,这个库提供了一些 API 代码改变更方便。...但 HotSwap 给我们提供了另外一种选择:在不重启应用的前提下进行小幅改动。...Attach API:使用动态附件来渗透另外一个 JVM 为了修改一个运行中的 Java 程序,我们首先需要一种可以同处在运行状态的 JVM 进行通信的方式。...有了一个 Java 代理,VM 和指定的进程 id 就可以查找到一个名为 agentmain 的方法,该方法可以由指定线程中的远程进程来执行: ?...后续的修改,Java 代理可以定义第二参数来接收一个 Instrumentation 的实例 。稍后要实现的接口提供了向几个底层方法的访问途径,它们中的一个就能够对已经加载的代码进行修改。
Java中的动态绑定 在Java中重写可以被认为是动态绑定的最佳示例,因为父类和子类具有相同的方法 - 也就是说,它不决定要调用的方法。 什么是Java中的静态绑定?...在上面的示例中,两种情况都给出了相同的结果: 子类和超类的引用是相同的,即单个对象。 因为它不能在子类中重写,即超类和编译器,所以它知道并且没有歧义。 什么是Java中的动态绑定?...静态绑定的基本要点。动态绑定 在这里,我们将讨论与Java中的静态和动态绑定相关的一些重要问题: 私有,最后和静态个体利用静态权威,而虚拟技术则限制在运行时期间根据运行时对象完成。...Java中的静态绑定使用官方类型数据,而Java限制中的动态绑定使用对象来确定绑定。 使用静态绑定来解决重载方法,同时使用动态绑定(即在运行时)重写方法。...所以,这完全是关于Java中的静态绑定与动态绑定。希望你喜欢我们的解释。
查看 java.util.Arrays$ArrayList 实现,我们可以发现底层实际使用了原始数组。 ? 知道了实际原因,修复的办法也很简单,套娃一层 ArrayList 呗!...所有外部读写动作看起来是在操作 SubList ,实际上底层动作却都发生在原始 List 中,比如 add 方法: ?...另外由于 SubList 实际上还在引用原始 List,业务开发中,如果不注意,很可能产生 OOM 问题。...OOM 的原因正是因为每个 SubList 都强引用个一个 10 万个元素的原始 List,导致 GC 无法回收。 这里修复的办法也很简单,跟上面一样,也来个套娃呗,加一层 ArrayList 。...如果没办法,使用了 Arrays.asList 和 List.subList ,返回给其他方法的时候,一定要记得再套娃一层真正的 java.util.ArrayList。
背景 面试的时候碰到的了一个java基础问题,竟然给问蒙了,回来之后感觉针对这个问题总结一下 java中 值的传递和引用传递 这边再将具体的值传递和引用传递,之前先普及一下基本知识 数据类型 Java虚拟机中...JVM的成员: 虚拟机栈 堆 程序计数器 方法区 本地方法栈 虚拟机栈 虚拟机栈是Java方法执行的内存模型,栈中存放着栈帧,每个栈帧分别对应一个被调用的方法,方法的调用过程对应栈帧在虚拟机中入栈到出栈的过程...字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成 java数据类型在JVM的位置 局部变量的存储位置...局部变量在栈表现.png 全局变量的存储位置 在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。...image.png ArrayList类中subList方法的源码:SubList也是实现了List接口 public List subList(int fromIndex, int toIndex
:结束下标(不包含) 2.2、在构造器内部: 将传入的parent赋给SubList对象的成员变量parent; fromIndex赋给SubList对象的成员变量parentOffset; offset...+fromIndex赋给SubList对象的成员变量offset,用于记录元素的偏移量; toIndex - fromIndex赋给SubList对象的成员变量size,用于记录此时会返回的数据量大小;...,你可能会有疑问,只是单纯的构造了一个SubList对象,那么是怎么进行赋值取值的;解决这个问题,来看一下SubList对象的get()方法: 在get()方法中,最终返回的是 ArrayList.this.elementData...3、高潮部分: 异常产生分析: 有了上面第二步的分析,有了一个基本认识,那就是list.subList()方法返回的集合会直接影响原始的list集合,接下来继续分析java.util.ConcurrentModificationException...的modCount)是否相同,如果不相同则抛出异常java.util.ConcurrentModificationException,写得累死我了,绕了一大圈终于写到这个异常了,在生成list1时,它在实例化一个
参考文章:【Java 数据结构】顺序表_数据结构java顺序表基本算法测试-CSDN博客 ArrayList的介绍 在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下...ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表 我们查看源码可知的确实施了这些接口。...❤️❤️接下来我们来看ArrayList的几个成员变量: 对于第一个成员变量,我们无需了解,只需要关注下后面五个成员变量。...第三个构造方法 里面涉及了泛型的进阶,我们这也不怎么好描述,就直接说特点吧: 下面是这个构造方法的一些特点: 参数c要求是实现了Collection接口的对象, 参数c中的元素类型必须与ArrayList...注意,addAll方法不会去重,如果添加的元素在当前ArrayList中已经存在,则会重复添加 subList方法 ArrayList中的subList方法用于获取原顺序表的一个子顺序表。
在前面的文章里,我们学习了很多数据结构与算法思想。在实际的业务开发中,往往不需要我们手写数据结构,而是直接使用标准库的数据结构 / 容器类。...在 Java 虚拟机垃圾回收算法中,需要计算对象的内存大小,计算结果是存储在 jint 类型变量(Java int 类型在 JNI 中的映射)中的。...在 《阿里巴巴 Java 开发手册》中,有关于 ArrayList#subList API 的规定。为什么阿里巴巴要做这样的限制呢?...Arrays 提供了数组转 List 的 API,而 Arrays#ArrayList 也提供了 List 转数组的 API(这些 API 第一个 ArrayList 中也都有…) 回过头看剩下的 2...例如:在这段代码中,ArrayList 接收一个由 String 数组转化的 List,最后在 ArrayList#toArray() 返回的 Object 数组中添加一个 Object 对象,就出现异常了
代码运行后报错 java.util.ConcurrentModificationException: 分析下 ArrayList 的源码,看看为什么会是这样: ArrayList 维护了一个 int 类型的...在初始化内部类 SubList 的时候传入了 this,这个 SubList 中的 parent 字段就是原始的 List,初始化的时候,并没有把原始 List 中的元素复制到独立的变量中保存,所以双方对元素的修改都会互相影响...而且 SubList 强引用了原始的 List,所以大量保存这样的 SubList 其实也保存了大量原始的 List,从而导致 OOM。...综上,既然 SubList 和原始 List 会相互影响,那么避免相互影响的修复方式有两种: 不直接使用 subList 方法返回的 SubList,而是重新使用 new ArrayList,在构造方法传入...SubList,来构建一个独立的 ArrayList: List subList = new ArrayList(list.subList(1, 4)); 对于 Java 8
场景二:以Guava中的Lists.partition为例 参考文章 列表分片实现 和 Java 集合细节(三):subList 的缺陷 ,可知 Lists.partition 的底层实现就是 subList...方法,而 subList 函数返回仅仅只是一个视图,因此这里的 subList 其实和前面所述的迭代器在概念上是一样的(只是新的分片 List 的计数变量不叫 expectedModCount,而是和原...因此,第二篇文章中所谓的 subList 缺陷其实不能叫做缺陷:我们在原 List 上通过 subList 获得其分片视图后,就不应该再操作原 List 了(类似于迭代器,我们获得一个 List 的迭代器后...扩展:多线程场景 注意,ArrayList并不是线程安全的,若不追求数据强一致性,可使用 CopyOnWriteArrayList 方法,可参考 聊聊并发-Java中的Copy-On-Write容器 和...JDK 5.0 中更灵活、更具可伸缩性的锁定机制 。
(0, 1)); } } 删除子 List 中的元素影响到了原始 List;尝试为原始 List 增加数字 0 之后再遍历子 List,会出现 ConcurrentModificationException...= list.subList(1, 4); System.out.println(subList); subList.remove(1); System.out.println(list); list.add...); } 既然 SubList 相当于原始 List 的视图,那么避免相互影响的修复方式有两种: 修复后代码输出如下: 一种是,不直接使用 subList 方法返回的 SubList,而是重新使用...new ArrayList,在构 造方法传入 SubList,来构建一个独立的 ArrayList; 另一种是,对于 Java 8 使用 Stream 的 skip 和 limit API 来跳过流中的元素...,以及限制 流中元素的个数,同样可以达到 SubList 切片的目的。
做个快乐的程序员。 迭代时删除元素 使用for-each迭代遍历时,删除集合中的元素,会报错。...在java8中,List增加了一个removeIf()方法用于删除。...at java.util.AbstractList.remove(AbstractList.java:161) 为什么会报这个错,看一下源代码就知道了!...(subList);//[1, 2, 3, 4, 5, 11] } 大家看一下源码就知道什么原因了。...extends E> list) { super(list); this.list = list; } 因为不可变集合的成员变量的引用是指向原集合的,所以当原集合改变时
subList方法是由AbstractList实现的,它会根据是不是可以随机存取来提供不同的SubList实现方式,RandomAccessSubList是SubList子类,SubList类中subList...原因:subList取出的列表是原列表的一个视图,原数据集(代码中的list变量)修改了,但是subList取出的子列表不会重新生成一个新列表(这点与数据库视图是不相同的),后面再对子列表操作时,就会检测到修改计数器与预期的不相同...动态代理可以使代理模式更加灵活; (Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发。...Java缔造者也发现了该问题,于是在Thread类中设置了三个优先级,建议使用优先级常量,而不是1到10随机的数字)。...在实际环境中应用注意以下三点:1、共享资源锁定;2、脏数据引起系统逻辑混乱;3、内存溢出,线程异常了,但由该线程创建的对象并不会马上回收,如果再重新启动新线程,再创建一批新对象,特别是加入了场景接管,就危险了
); return new SubList(this, 0, fromIndex, toIndex); } } Java泛型方法 泛型方法可以存在于泛型类(包括接口类)中,也可以存在于普通的类中...泛型方法的类型E和泛型类中的T可以不一样,或者说,如果泛型方法是泛型类的一个成员,泛型方法既可以继续使用类中的T,也可以自己定义新的类型E。 通配符 除了用 表示泛型外,还有 这种形式。...Scala中的泛型 对Java的泛型有了基本了解后,我们接着来了解一下Scala中的泛型。相比而言,Scala的类型系统更复杂,本文只介绍一些简单语法,帮助读者能够读懂一些源码。...Scala中,泛型放在了中括号[]中。或者我们可以简单地理解为,原来Java的泛型类,现在改为[T]即可。...我们创建一个Stack[T]的泛型类,并实现了两个简单的方法,类中各成员和方法都可以使用泛型T。我们也定义了泛型方法,形如isStackPeekEquals[T],方法中可以使用泛型T。
引言:本文的练习整理自chandoo.org。多一些练习,想想自己怎么解决问题,看看别人又是怎解决的,能够快速提高Excel公式编写水平。 本次的练习是:计算子列表在列表中出现的次数。...对于名为“List”和“Sublist”的两个列表,计算“Sublist”在“List”中出现的次数。其中,“List”和“Sublist”是可变长度的。...示例数据如下图1所示,你的列表和子列表的位置可能与图示不相同,也可以假设两个列表都在行中,子列表中的项可能会重复,但列表中需要完全匹配才能对其进行计数。...写下你的公式。...(--(COUNTIF(List,T(OFFSET(A1,SMALL(IF(FREQUENCY(MATCH(Sublist,Sublist,0),MATCH(Sublist,Sublist,0))>=1
大家好,又见面了,我是你们的朋友全栈君。 《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。...今天我们来探索一下Java集合类中的一些技术细节。...但是这个这个实例中为什么没有出错呢? 因为该实例是将int类型的数组当做其参数,而在Java中数组是一个对象,它是可以泛型化的。所以该例子是不会产生错误的。...同时我们知道modCount 在new的过程中 “继承”了原列表modCount,只有在修改该列表(子列表)时才会修改该值(先表现在原列表后作用于子列表)。...对于子列表视图,它是动态生成的,生成之后就不要操作原列表了,否则必然都导致视图的不稳定而抛出异常。
《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。...哈 文章首发于我的个人博客: www.how2playlife.com 今天我们来探索一下Java集合类中的一些技术细节。...但是这个这个实例中为什么没有出错呢? 因为该实例是将int类型的数组当做其参数,而在Java中数组是一个对象,它是可以泛型化的。所以该例子是不会产生错误的。...同时我们知道modCount 在new的过程中 "继承"了原列表modCount,只有在修改该列表(子列表)时才会修改该值(先表现在原列表后作用于子列表)。...对于子列表视图,它是动态生成的,生成之后就不要操作原列表了,否则必然都导致视图的不稳定而抛出异常。
ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。...它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。...elementData 是"Object[]类型的数组",它保存了添加到ArrayList中的元素。实际上,elementData是个动态数组。...ArryList注意点 谨慎使用ArrayList中的subList方法 ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException 异常,即...在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、 删除均会产ConcurrentModificationException 异常。
它的主要底层实现是`Object`数组,但与 Java 中的数组相比,它的**容量能动态变化**,可看作是一个动态数组结构。...在下文分析中会调用到相关的成员变量,为方便分析核心源码,故提前将其说明。...()方法的行为与规范不一致) 15年修复;java.net/browse/JDK-6260652> // 再次判断...** ## 与其他容器的联系 ### ArrayList 与 Vector **相同点** - 都实现了 `java.util.List`接口。...的set()方法,**是直接修改ArrayList**中`elementData`数组的,使用中应该注意 - SubList是没有实现`Serializable`接口的,**是不能序列化的**
领取专属 10元无门槛券
手把手带您无忧上云