- 博客(65)
- 资源 (14)
- 收藏
- 关注

原创 JRE,JDK和JVM之间的关系
JRE,JDK,JVM之间的关系JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持J...
2019-05-23 10:38:02
5278

原创 深入理解String、StringBuffer、StringBuilder区别和源码实现
区别1、String是常量,而StringBuilder,StringBuffer是变量,2、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,3、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。4、在单线程程序下,St...
2019-04-17 11:10:48
1036

原创 java垃圾回收的三种算法
java垃圾回收的三种算法为什么需要垃圾回收: 在程序执行的过程中,会产生一系列的对象(占用内存的代表),这些都会存储在内存中。一部分对象在生命周期结束后,依然会占用一部分内存。这些占用内存却没有再次使用的对象,我们称之为“垃圾”,而对“垃圾”占用的内存的回收,就是垃圾回收。在没有垃圾回收机制的语言里,垃圾回收操作需要程序猿来完成,这常常会导致错误。内存泄漏:忘记释放一部分内存,导致...
2018-08-17 15:11:52
4566
1

原创 java HashMap按值进行排序
java HasnMap 按值进行排序方法实现代码如下:import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.Iterator;impor
2017-07-10 21:12:30
2097

原创 Tomcat服务器状态管理之Session
状态管理-Session2017-07-05 09:10 27640人阅读 评论(0)收藏举报版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+]状态管理-Session1 Session11 什么是Session12 Session工作原理13 如何获得Session14 如何使用Session绑
2017-07-05 22:54:40
1312

转载 java虚拟机工作原理解析
Java虚拟机工作原理解析标签: classloaderClassLoaderjvmJVM2012-12-21 15:03 117010人阅读 评论(38)收藏举报版权声明:本文为博主原创文章,未经博主允许不得转载。一、类加载器首先来看一下Java程序的执行过程。 从
2017-07-04 18:42:45
400
原创 我为 Redis 找到了一个新家——Redis 之父当年的困兽之斗
今天翻了一下 Antirez 早年的博客,发现了这样一篇介绍 redis 进展的好文章,写于 2010 年,居然长期以来都没有被翻译成中文,所以我就不客气了。大约 1 年前,Redis 还只是内部项目,没有任何开源的计划。它不过是用来解决 web 应用程序扩容时遇到的一系列让人棘手的问题而已(应该是用户会话缓存)。但是开源对我来说实在太有吸引力了,我根本无法抗拒这样的诱惑。我可是已经在开源界活...
2019-07-26 09:00:00
510
1
原创 HashMap1.8和HasMap1.6的区别
(1)1.6在put(null,value);的时候讲这个键值对放在哈希桶的第一个(直接判断),1.8是计算null的hash值(0)还是放在第一个(2)1.6中的put使用链表的头插法,而1.8中使用的是尾插法。(3)hash值计算不同:1.6: h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>>...
2019-05-31 09:48:20
522
原创 InnoDB存储引擎之Master Thread的工作方式
InnoDB 1.0.X版本之前的Master Thread:Master Thread拥有最高的线程优先级:后台有多个循环(主循环,后台循环,刷新循环,暂停循环)。在主循环中有两大部分的操作,分别是每秒执行的操作,每十秒执行的操作:每秒执行的操作:(1)redo log刷新到磁盘,即使这个事务没有提交(总是),这也很好的解释了为什么再大的事务提交时间总是很短。(2)合并插入缓冲:当前I...
2019-05-26 19:07:16
309
原创 HotSpot中的安全点详解
枚举根节点:目前主流的虚拟机都是采用准确式GC,当系统停顿下来时并不需要寻找每一个GC Roots。(stop the world:由于可达性分析对执行时间的敏感,只有在系统处于一个能确保一致性的快照中进行时才能有效,这时整个系统看上去好像被冻结了一样,不可以出现在分析过程中对象的引用关系还在发生变化的情况)实现方式是使用一组被称为oopMap的数据结构来达到这个目的。在类加载完成时,虚拟机就把...
2019-05-23 16:12:40
1353
原创 从虚拟机角度看对象的创建
(1)当JVM遇到一个new指令的时候,他会去检查这个指令的参数能否在运行时常量池定位到一个类的符号引用,并且检查这个符号代表的类是否已经被加载,解析和初始化过了,如果没有,那么必须先执行相应的类加载过程。(2)在类的加载检查通过之后,接下来JVM需要为新生对象分配内存,对象所需的内存大小是在类加载完成之后便完全确定的。如果Java堆是规整的,那么直接采用指针碰撞算法分配内存(记录上一次对象分配...
2019-05-23 11:18:27
187
原创 WeakHashMap浅析
在Java集合框架系列文章的最后,笔者打算介绍一个特殊的成员:WeakHashMap,从名字可以看出它是某种 Map。它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove()或者clear()方法。更直观的说,当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:(1)调用两次size()方法返回不同的...
2019-05-22 15:06:58
244
原创 JVM内存空间快速分配技术
通常情况下,如果系统中存在大量的连续内存可以用来分配对象,这种情况下若采用指针碰撞算法来进行对象分配的话,效率是很可观的。指针碰撞算法:记录上一次对象分配的位置,当有新对象需要分配时,若检查剩余的空间可以满足容纳这个对象,则只需要一次移动指针的操作便可完成内存的的分配。对于多线程的应用:内存分配需要保证线程安全,如果通过全局锁的方式来保证线程安全的话,内存分配将会成为性能瓶颈。所以HotSpo...
2019-05-22 11:06:42
310
原创 JVM中类加载器的双亲委派模型
双亲委派模型过程某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。使用双亲委派模型的好处在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存在在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于...
2019-05-16 15:57:11
264
原创 自定义类加载器
在某些场合需要从网络或者非ClassPath路径下加载类,这个时候就需要自己定义一个类加载器了。在自己定义类加载器的时候需要重写ClassLoader类的findClass方法,loadClass方法不需要重写(loadClass方法最终会调用findClass方法),代码如下:import java.io.*;/** * Created by DanLongChen on 2019/5/...
2019-05-16 15:54:48
390
原创 MySQL高性能索引策略
高性能索引策略:索引主要是用于WHERE过滤(1)使用独立的列:如果不使用独立的列,MySQL将无法使用索引,独立的列是指:索引列不能是表达式的一部分,也不能是函数的参数。如select name from test where id+1=5;id+1=5就不是独立的索引列,而是表达式的一部分。(2)前缀索引和索引选择性:有时候需要索引很大的字符串列,这会让索引变大且慢。这个时候可以只索引...
2019-05-15 10:06:46
201
转载 mysql中update和select结合使用
在遇到需要update设置的参数来自从其他表select出的结果时,需要把update和select结合使用,不同数据库支持的形式不一样,在mysql中如下:update A inner join(select id,name from B) c on A.id = c.id set A.name = c.name;根据AB两个表的id相同为条件,把A表的name修改为B的sql语句就如上所...
2019-05-14 10:42:01
1150
原创 MySQL中的事务日志
事务日志可以提高事务的效率。使用事务的存储引擎在修改表的数据的时候,只需要修改其内存拷贝,再把该修改行为记录到持久化在磁盘中的事务日志中,而不是每次都将修改的数据本身持久化到磁盘中。事务日志采用追加的方式,因此写日志的操作是磁盘一小块区域的顺序IO,而不像随机IO那样需要在磁盘多个地方移动磁头,所以采用事务的方式相对来说快一点。事务日志持久化之后,被修改的数据就可以在后台被慢慢刷回到磁盘。若...
2019-05-12 14:21:16
392
转载 List,Map,Set三个接口,存取元素的时候,各有什么特点?
List与Set都是单列元素的集合,它们有一个功共同的父接口Collection。Set里面不允许有重复的元素,存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。取元素:没法说取第几个,只能以Iterator接口取得所有的元素...
2019-05-06 20:14:07
467
转载 数组是协变的
数组是协变的,如果Apple是Fruit的子类型,那么数组类型Apple[]就是Fruit[]的子类型,所以这就使得此向上转型是成立的。Fruit[] apples=new Apple[size];数组在编译时表示法可能是抽象的,而在运行时表示法往往一定是具体的,包含更多的信息。Object[] objects=new Fruit[size]; Fruit[] apples=new A...
2019-05-05 10:04:09
750
原创 java内存泄露剖析
虽然Java自带垃圾回收机制(GC),程序员不需要手动进行内存管理,但是仍然会出现内存泄漏的情况。尽管如此,Java的自动内存管理,比起C/C++,内存泄漏的情况大大减少了。下面总结下什么情况下会发生Java内存泄漏。静态集合类在使用Set、Vector、HashMap等集合类的时候需要特别注意,有可能会发生内存泄漏。当这些集合被定义成静态的时候,由于它们的生命周期跟应用程序一样长,这时候,就...
2019-04-30 20:55:45
193
原创 加快ALTER TABLE操作的速度
MYSQL执行大多数修改表的方法是使用新的结构创建一张空表,从旧表中查询出所有的数据插入新表,然后再删除旧表。这样的操作需要花费很长的时间,尤其是内存不足而表又大,还有很多索引的情况下尤其严重。大部分的ALTER TABLE操作会导致MYSQL服务中断;可以使用的方法有两种:(1)在一台不提供服务的机器上执行ALTER TABLE,然后再进行主库切换。(2)使用影子拷贝。建立一张和源表无关...
2019-04-29 18:20:43
916
原创 hashmap和hashtable区别
1、继承不同。public class Hashtable extends Dictionary implements Mappublic class HashMap extends AbstractMap implements Map2 产生时间不同Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。虽然Hashtable比HashMa...
2019-04-28 20:22:38
686
1
原创 Java的快速失败和安全失败
一:快速失败(fail—fast)在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/n...
2019-04-28 20:07:11
177
原创 Java集合类中的Iterator和ListIterator的区别
最近看到集合类,知道凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合;(Iterator接口定义了3个方法分别是hasNext(),next(),remove();)我们在使用List,Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍历的过程,只需要每...
2019-04-28 19:50:54
265
原创 CND缓存原理
cdn动态加速原理是什么?cdn全称是Content Delivery Network,即内容分发网络。目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。cdn从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度。CDN网络是在用...
2019-04-28 16:34:14
687
原创 负载均衡
目前主流的负载均衡一般分为三类(1)链路负载均衡:通过DNS负载均衡器解析成不同的IP,然后用户根据这个IP来访问不同的目标服务器。优点:用户直接访问目标服务器而不需要经过其他代理服务器,通常访问速度会更加快。缺点:由于DNS会在用户本地和Local DNS Server都有缓存,一旦某台Web Server挂掉,就很难及时更新用户的域名结构。用户的域名没有及时更新,那么用户将无法访问这个...
2019-04-28 16:22:04
310
原创 MySQL性能优化之数据类型
MySQL支持非常多的数据类型,选择正确的类型对于获得高性能至关重要。以下几个原则有助于做出更好的选择:(1)更小的通常更好:尽量使用可以正确存储数据的最小的数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘,CPU和内存,并且处理时需要的CPU周期也更加少。但是这里需要注意选择的最小类型要包含业务的最大范围。(2)简单就好:简单数据类型的操作通常需要更少的CPU周期。例如:整型比字符...
2019-04-27 15:02:25
184
转载 为什么集合类没有实现Cloneable和Serializable接口
转自:https://blog.youkuaiyun.com/qq_18433441/article/details/78222335为什么集合类没有实现Cloneable和Serializable接口?答:克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实现类来决定如何被克隆或者序列化一些解释:(1)什么是克隆?克隆是把一个对象...
2019-04-24 21:11:33
210
原创 HashMap中的桶长度为啥要定为2^n
HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法; 这个算法实际就是取模,hash%length,计算机中直接求余效率不如位移运算,源码中做了优化hash&(length-1), hash%length==hash&(length-1)的前提是length是2的n次方; 为什么这样能均匀分布减少碰撞呢...
2019-04-24 20:42:11
623
原创 Java中“==”、equals()、hashcode()的区别与联系
在Java中判断两个对象是否相等的方法有许多,这里记录一下我所理解的三个方法之间的区别与联系首先我们最长用到的应该是==,毕竟很多人是从C语言入门编程的,所以更多的时候我们会习惯使用==来判断两个对象是否相等,==是Java语言为我们预留的关键字,用于比较两个对象是否相等。刚刚接触Java的时候有人告诉我Java中是不存在指针的(根据个人理解而异),但是我的理解是,C语言中指针的含义是存储数据的...
2019-04-24 14:05:05
202
转载 Query的list()和iterate()方法的区别
1.Query接口的list与iterate方法:iterate()方法:Return the query results as an Iterator. Ifthe query contains multiple results pre row, the results are returned in aninstance ofObject[].Entities returned as r...
2019-04-24 10:56:46
1486
原创 java反射机制
什么是反射?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供的功能?在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;...
2019-04-23 21:47:48
157
原创 LeetCode98 Validate Binary Search Tree(验证二叉搜索树)
Given a binary tree, determine if it is a valid binary search tree (BST).Assume a BST is defined as follows:The left subtree of a node contains only nodes with keys less than the node’s key.The rig...
2019-04-23 21:27:08
182
原创 LeetCode91:解码方式(动态规划)
问题描述:A message containing letters from A-Z is being encoded to numbers using the following mapping:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26Given a non-empty string containing only digits, determine t...
2019-04-18 10:59:49
1107
转载 面试题:Overload和Override的区别。Overload的方法是否可以改变返回值的类型?
Overload和Override的区别。Overload的方法是否可以改变返回值的类型?Overload:重载Override:重写重载: 同一个类中,方法名相同,参数列表不同。与返回值类型无关。重写: 存在于子父类,或者子父接口中,方法声明相同。Overload的方法可以改变返回值的类型,因为它与返回值类型无关。...
2019-04-17 16:46:26
1012
原创 finally一定会被执行么?
finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。(×)(这句话其实存在一定的问题)很多人都认为finally语句块一定会执行,但真的是这样么?答案是否定的,例如下面这个例子: 当我们去掉注释的三行语句,执行结果为:为什么在以上两种情况下都没有执行finally语句...
2019-04-17 16:41:50
5021
2
原创 编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别
编译型语言和解释型语言1、编译型语言需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独...
2019-04-12 15:20:17
220
原创 JAVA中跳出多重嵌套循环的几种方法
一、标签方式类似于C语言的goto,用法是在最外层循环的上边放置一个标签,然后在里层的循环代码中使用break+标签的方式,就可以跳到最外层循环public static void main(String[] args) { outer: for(int i=0;i<3;i++){ for(int j=0;j<2;j++){ ...
2019-04-12 14:39:08
1042
转载 &和&&的区别及!和~区别
原文:https://blog.youkuaiyun.com/weilexuexi12/article/details/70141982&、|、都是位操作符,而&&、|、|都是逻辑操作!。下面我们就分成三组对问题进行分析:分别是&和&&,|和||及~和!。1.&是按位与操作,参加运算的两个数据按照二进制位进行“与”运算,如果两个相应的二进制位都为1...
2019-04-12 11:26:11
758
使用Java实现的秒杀系统,内容涉及SpringBoot,MyBatis,Redis,RabbitMQ等
2019-07-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人