- 博客(43)
- 收藏
- 关注
原创 深入理解java虚拟机——线程安全与锁优化
1. 线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象时线程安全的。线程安全的“安全程度”由强到弱来排序,我们可以将 Java 语言中各种操作共享的数据分为以下 5 类:1.不可变:不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的
2018-01-19 12:59:46 557
原创 深入理解java虚拟机——内存模型与线程
1. Java 内存模型Java 虚拟机规范中试图定义一种 Java 内存模型来屏蔽各种硬件和操作系统的内存访问差异。Java内存模型的主要目标是定义程序中各个变量的访问规则。Java 内存模型规定了所有的变量都存储在主内存中。每条线程有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝。线程不能读写主内存中的变量,不同的线程之间也无法直接访问对方工作内存中的变量,线程
2018-01-18 20:54:24 186
原创 深入理解java虚拟机——语法糖
语法糖可以看做是编译器实现的一些“小把戏”,这些“小把戏”可能会使得效率“大提升”。1. 泛型与类型擦除本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类,接口和方法的创建中,分别称为泛型类,泛型接口和泛型方法。泛型其实是 javac 提供给我们的一颗语法糖,因为它在编译阶段采用类型擦除,将泛型还原为原生类型(裸类型),并且在相应的地方插入了强制转
2018-01-17 20:35:03 217
原创 深入理解java虚拟机——虚拟机字节码执行引擎
执行引擎是 Java 虚拟机最核心的组成部分之一。所有的 Java 虚拟机的执行引擎都是一致的:输入字节码文件,执行字节码解析的等效过程,输出结果。1. 运行时栈帧结构栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。编译程序代码时,栈帧需要分配的内存已经确定,不会受到程
2018-01-17 19:32:02 224
原创 深入理解java虚拟机——类加载器
把类加载器阶段中的 “通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为 “类加载器”。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在 Java 虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。 比较两个类是否“相等”,只有在这两个类是由同一个类加
2018-01-17 11:23:30 179
原创 深入理解java虚拟机——虚拟机类加载机制
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。在 Java 语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的。1. 类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载。验证、准备、
2018-01-16 19:51:36 215
原创 深入理解java虚拟机——垃圾收集器与内存分配策略
程序计数器、虚拟栈、本地方法栈 3个部分随线程而生,随线程而灭。所以这3个区域就不需要过多的考虑垃圾回收的问题。当方法结束或线程结束时,内存自然就回收了。1.判断对象存活1.1 引用计数器法给对象添加一个引用计数器,每当有一个地方引用它,计数器值加1;当引用失效,计数器值减1;任何时刻计数器为0的对象就是不可能再被使用的。缺点:当对象之间相互循环引用时。假设对象objA和o
2018-01-14 17:16:21 210
原创 深入理解java虚拟机——OutOfMemoryError异常
1. Java堆溢出解决方案:通过内存映像分析工具(如 Eclipse Memory Analyzer)对堆转储快照进行分析,确定时内存泄漏还是内存溢出。如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。于是就能找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收它们。掌握了泄露对象的类型信息及GC Roots引用链信息,就可以比较准确地定
2018-01-13 16:10:50 291
原创 深入理解java虚拟机——HotSpot虚拟机对象
1. 对象的创建1.1 类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。如果没有,就先执行相应的类加载过程。1.2 分配内存从Java堆中划分出一块确定大小的内存分配给新生对象。垃圾收集器是否带有压缩整理功能决定Java堆是否规整。而Java堆是否规整决定了
2018-01-13 15:25:11 202
原创 深入理解java虚拟机——运行时数据区
Java虚拟机管理的内存包括几个运行时数据内存:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。其中方法区和堆是由所有线程共享的数据区,其它几个都是线程隔离的数据区。1. 程序计数器解释:可以看作当前线程所执行的字节码的行号指示器。字节码解释器通过改变计数器的值来选取下一条需要执行的字节码指令(分支、循环、跳转、异常处理、线程恢复等基本基本功能)。线程私有:为实现多线
2018-01-13 12:23:09 281
原创 Collection 和 Collections 比较
区别Collection是一个接口,Set接口和List接口的父类(注意:Map接口不是)。Collections是一个包装类,操作Collection类的工具类,类中方法都是静态的。
2017-04-28 16:41:08 307
原创 java输入输出
public static void main(String[] args) { //主方法 CharTest(); //调用System.in方法 ReadTest(); //调用ReadTest方法 ScannerTest(); //调用ScannerTest方法 }
2017-04-27 12:36:36 294
原创 POJ 2311 Cutting Game
Cutting GameTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 3200 Accepted: 1179DescriptionUrej loves to play various types of dull games. He usually ask
2015-02-28 15:05:19 458
转载 HUD1053 Entropy(Huffman)
EntropyTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3648 Accepted Submission(s): 1451Problem Description An entropy encoder is a data enco
2015-02-25 23:11:09 330
转载 字典树小结
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是
2015-02-03 17:52:10 372
原创 状态压缩dp题目
Corn Fields题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(一头牛都不放也是一种方案)#include#includeint map[15];int st[1<<13];int dp[15][1<<13];int j
2015-01-28 16:12:22 454
原创 状态压缩dp小结
我们知道,用DP解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态。但是有这样的一些题目,它们具有DP问题的特性,但是状态中所包含的信息过多,如果要用数组来保存状态的话需要四维以上的数组。于是,我们就需要通过状态压缩来保存状态,而使用状态压缩来保存状态的DP就叫做状态压缩DP。和普通dp一样要注意初始化和状态转移方程,唯一的不同是状态压缩dp的状态可以是地图里的一行,可以是走过的路径,等等.....
2015-01-28 16:08:42 505 1
原创 dp小结
给dp[i][j]一个定义(i和j可能会有一定的关系,例如i再对具体某个dp[i][j]进行观察(可以借助于表格等),找出它可以由哪些已知的dp[][]经过一定的处理得到,并对这些解进行比较,得出最优解。列出状态转移方程。
2015-01-24 11:16:40 311
转载 hdu1025 Constructing Roads In JGShining's Kingdom(DP+二分)
这题是求最长上升最长子序列,不过直接做会超时,所以要改变做法,并加上二分下面是具体的做法的解析(解析部分转自 http://blog.csdn.net/ice_crazy/article/details/7536332)假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5。下面一步一步试着找出它。我们定义一个序列B,然后令
2015-01-23 08:54:32 283
原创 Subpalindromes
SubpalindromesTime Limit: 500msMemory Limit: 65536KBThis problem will be judged on Ural. Original ID: 198964-bit integer IO format: %lld Java class name: (Any)Prev Submit Stat
2014-08-12 16:18:10 405
原创 6657 GCD XOR
6657 GCD XORGiven an integer N, find how many pairs (A; B)are there such that: gcd(A, B) = A xor B where 1Here gcd(A; B) means the greatest common divisorof the numbers A and B. And A xor B is the
2014-08-08 09:53:04 645
原创 6656 Watching the Kangaroo
6656 Watching the KangarooDay by day number of Kangaroos is decreasing justlike tiger, whale or lions. So I decided to make them a sanctuary where theywill live peacefully. I do not let visitors go
2014-08-08 09:16:43 424
原创 DP 46道
Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋)
2014-07-31 15:56:22 478
转载 扩展欧几里德算法
欧几里德与扩展欧几里德算法欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r
2014-07-29 14:45:57 434
转载 pku 1061 青蛙约会
pku 10pku 1061 青蛙约会青蛙的约会Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 48324 Accepted: 6971Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现
2014-07-29 13:43:43 428
转载 母函数入门+模板
在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和
2014-07-29 08:25:21 293
原创 POJ 3343 Against Mammoths
Against MammothsTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 1676 Accepted: 542DescriptionBack to year 3024, humans finally developed a new technol
2014-07-28 14:33:02 487
原创 ZOJ 1654 Place the Robots
Place the RobotsTime Limit: 5 Seconds Memory Limit: 32768 KB Robert is a famous engineer. One day he was given a task by his boss. The background of the task was the following:Giv
2014-07-28 14:11:35 277
原创 HDU 1507 Uncle Tom's Inherited Land*
Uncle Tom's Inherited Land*Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1853 Accepted Submission(s): 769Special JudgeProbl
2014-07-28 13:55:21 389
原创 最短路
一.Dijkstra#include #include #include #include #include using namespace std ;const int MAXN = 105 ;const int INF = 0xfffff ;struct node{ int p ; int value ; friend bool operator < (node
2014-07-28 09:39:18 338
原创 最小生成树
最小生成树就是在一个联通网络中找到一棵包括所有点且权值最大(小)的树。其实现有一般有两种方法,prim()和kruskal();一.kruskal()按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。是否形成回路就可以用并查集判断。a 首先预处理,把边的信息存储在由结构体构成的数组中。struct node{ int u,
2014-07-27 15:59:27 347
原创 静态邻接表
#include#includeint pre[10010]; //记录第i个点最后指向哪个点;int n,m; //点和边数;struct node{ int to; //终点; int w; //权值; int next; //同为第i个点出发的下一个点在edge中的位置}edge[105]; void init(){ int i,x,y,z; memse
2014-07-21 16:19:18 401
转载 3635 HDU Dragon Balls
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3635题目类型: 并查集题目:Five hundred years later, the number of dragon balls will increase unexpectedly, so it's too difficult
2014-07-21 12:37:51 377
原创 3938 HDU Portal(离线型并查集)
/*离线并查集,边按小到大排序,询问也按小到大排序;对于询问x,答案就是询问x-1的值加上询问x-1的L1和询问x的L2之间的边合并带来的值对于一条属于L1和L2之间的边,如果端点u,v在一个集合中,忽略,否则新开的路是u所在集合的大小乘上v所在集合的大小*/#include#includeusing namespace std;int n,m,q,ans[10010];int
2014-07-21 11:33:08 315
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人