Java虚拟机笔记-java虚拟机类加载2
继续学习jvm类的加载 类的加载 类一定是由类加载器加载但是 类的加载的最终产品是位于内存中的class对象 class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口 类加载器并不需要等到某个类被“首次主动使用”时再加载它 预加载 jvm规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误) 如果这个类一直没有被程序主动使用,那么类加载器就不会报告这个错误 类的加载器类加载器用来把类加载到java虚拟机中。从jdk1.2版本开始,类的加载过程采用父亲委托机制,这种机制能更好保证java平台的安全。在此委托机制中,除了java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父加载器。当java程序要求加载loader1加载Sample类时,loader1首先委托自己的父加载器去加载Sample类,若加载器能加载,则由父加载器完成加载任务,否则才由加载器loader1本身记载Samp...
Java虚拟机笔记-类加载器双亲委托派制
jvm类加载器双亲委派机制 并不是所有的jvm虚拟机都使用这个机制,只是大部分,比如还有使用osgi的。 双亲委任模型不是一个强制性的约束模型,而是一个建议型的类加载器实现方式。在Java的世界中大部分的类加载器都遵循者模型 类加载器的双亲委派机制在双亲委派机制中,各个加载器按照父子关系形成了树形结构(逻辑意义),除了根类加载器之外,其余的类加载器都有且有一个父加载器 根类加载器和扩展类加载器只能加载指定路径的里面的类,而系统类加载器一般可以加载我们工程中所定义的类 根类加载器:由c++实现,不是ClassLoader子类 扩展类加载器:由sun.misc.Launcher$ExtClassLoader实现 (代表ExtClassLoader是sun.misc.Launcher的一个内部类) 系统类加载器:由sun.misc.Launcher$AppClassLoader实现 过程实例 Loder1与Loader2是用户自定义的类加载器,两者之间又形成了父子关系 Loder1想要加载我们编写的Sample类,根据类加载器的双亲委派机制,并不是由Loader1直接...
单调栈
单调栈及poj2559 单调栈什么是单调栈?顾名思义,单调栈首先是一个栈,并且栈内的元素的大小按照他们所在栈内的位置,满足一定的单调性。 比如有一数组{1,3,232,23,24,3324,-1},维护其单调递减栈,数组左边为栈顶 首先,栈为空,入栈[1] 到下一个元素3,因为3>1,所以入栈,此时栈[3,1] 接着下一个元素232,因为232>3,所以入栈,此时栈[232,3,1] 接着下一个元素23,因为232<23,所以232出栈,此时栈[3,1],因为3<23,所以入栈,此时栈[23,3,1] 接着下一个元素3324,因为3324>23,所以入栈,此时栈[3324,23,3,1] 接着下一个元素-1,因为3324>-1,所以出栈,此时栈[23,3,1],因为23>-1,所以出栈,此时栈[3,1],因为3>-1,出栈,此时栈[1],因为1>-1,出栈,此时栈为空,将-1入栈,此时栈[-1] 模板题—poj2559 解析参考:https://www.zybuluo.com/Chilling/note/633014 题意:...
单调队列
单调队列及其优化dp 单调队列poj2823—Sliding Window 大意:给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,你的任务是找出窗体每个时刻中的最大值与最小值 优先队列优先队列能够进行排序,窗口往右一位,就把一个元素放到队列里面,然后每次取队首元素,如果队首元素的id在这个框的范围内的话,那么就取队首,如果不是的话那么就出队,找下一个队首元素,时间复杂度为O(nlogn) 对优先队列改良—单调队列O(n)基本思想:同样维护队首元素作为答案,去掉多余的元素(维护单调性) 因为是求最大值,所以维护一个单调递减队列,其队首就是最大值,就是我们想要的答案 L L+1 …… R-1 R 编号 A[L] A[L+1] …… A[R-1] A[R] 值 B[L] B[L+1] …… B[R-1] B[R+1] 上面单调递减队列满足: A[i+1]>A[i]>A[i-1] && B[i-1]>B[i]>B[i+1](R>i>L) 单调...
Java虚拟机笔记-接口初始化规则
接口初始化规则 接口初始化规则当java虚拟机初始化一个类时,要求它的所有父类都已经初始化,但是这条规则不适用于接口 在初始化一个类时,并不会先初始化它所实现的接口 在初始化一个接口时,并不会先初始化它的父接口 因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化 样例1123456789101112131415161718192021public class Main{ public static void main(String[] args) { new C(); new C(); }}class C{ { System.out.println("CC"); //每次创建对象时都会输出 } public C(){ System.out.println("c()"); }...
RMQ之ST表实现
区间最值查询 参考:https://blog.csdn.net/qq_41311604/article/details/79900893 RMQRMQ(Range Minimum/Maximum Query),即区间最值查询,这是一种在线算法,所谓在线算法,是指用户每次输入一个查询,便马上处理一个查询。RMQ算法一般用较长时间做预处理,时间复杂度为O(nlogn),然后可以在O(1)的时间内处理每次查询。 求dp现假设有一数组arr={1,3,6,7,4,2,5}; 设dp[i][j]表示从第i位开始连续2^j个数中的最小值。 例如dp[2][1]表示从第二位开始连续两个数的最小值(也就是从第二位数到第三位数的最小值),即3,6中的最小值,所以dp[2][1] = 3; 那么怎么求dp[2][1]呢? 当i=2,j=3时,求dp[2][3] 因为2^3=8,代表从2开始有8个数,所以范围为[2,9]然后我们可以将其按照类似二分的思想将其拆分为两部分所以中间mid=(2+9)/2=5 左区间[2,5]:有4个数,其对应dp[2][2] 右区间[6,9]:有4个数,其对应...
Java虚拟机笔记-编译期常量与运行期常量的区别及数组创建本质分析
编译期常量与运行期常量的区别及数组创建本质分析 样例11234567891011121314151617181920import java.util.UUID;public class Main{ public static void main(String[] args){ System.out.println(MyParent3.str); }}class MyParent3{ public static final String str = UUID.randomUUID().toString(); static{ System.out.println("MyParent3 code block"); }}/*output:MyParent3 code block0e7ed916-96de-4805-865d-1b2e703482ec*/ 当一个常量的值并非编译期间可以确定的,那么其值就不会被...
线段树入门
线段树入门 数据结构—线段树(segment tree)引入给定一个数组,数组长度可能非常大。现在我们需要对数组里面的数据反反复复进行两个操作 求出某一个区间里面所有元素之和,(query操作) 修改某个元素的值,(update操作) 暴力解决和前缀和对区间[L,R](长度为n)取和,并且更新一个元素i的值,采用暴力解决方法 可得 query(L,R)时间复杂度为O(n) update(i)时间复杂度为O(1) 如果区间范围很大,再加上多次操作,暴力取和明显会超时,可以采用前缀和方式优化查询sum_arr[0]=arr[0]sum_arr[1]=arr[0]+arr[1]sum_arr[2]=arr[0]+arr[1]+arr[2]这样,假如我们想得到区间[2,4]的和,我们可以用sum_arr[4]-sum_arr[1]计算到 query(L,R)时间复杂度减小为O(1) 因为改变一个值后,要同时更新后面的sum_arr数组,所以update(i)时间复杂度增大为O(n) 如果用线段树的话,我们可以将查询和更新的的时间复杂度都变为O(logn) 方法 qu...
Java虚拟机笔记-常量的本质含义以及反编译出现的部分助记符
常量的本质含义以及反编译出现的部分助记符 样例112345678910111213141516171819public class Main{ public static void main(String[] args){ System.out.println(Mychild1.str); }}class MyParent1{ public static String str = "hello world"; static{ out.println("Myparent1 static block"); }}class Mychild1 extends MyParent1{ public static String str2 = "welcome"; static{ System.out.println("Mychild1 sta...
2019中山大学程序设计竞赛-重现赛-补两道水题
HDU6512 —Triangle && HDU6518—Clumsy Keke HDU6518—Clumsy Keke 解析题目大意: 给出一个三维图形的x,y,z轴的长度,然后分别给出正视图,侧视图,俯视图,视图的表示方法是在一个大方格里面,用0代表空白,用1代表阴影,这样就可以表示一个图形了,然后求出这个三维图形是由多少小正方体组成的。 我们可以运用逆向思维,首先构建一个完整的图形,然后减去没有出现的,最终剩下来的就是拥有的,然后再统计下有几个就是我们要求的答案了。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162/*2019-04-20 00:21:25 46MS 2184K*/#include <cstdio>#include <cstring>using namespace std;const int MAXN = 1e2;bool Map[MA...