- 博客(37)
- 收藏
- 关注
原创 Java中的Cglib代理
写在前面: 首先我们知道动态代理模式是实现AOP编程的核心,而动态代理这种设计模式又分为JDK代理和Cglib代理,在上一篇博客中,已经总结了JDK代理的实现过程(https://blog.csdn.net/may_3/article/details/79595432)。这篇博客,我们将总结Cglib代理,以及,这两种代理方式的区别,特点。 Cglib代理采用了asm框架的字节码技术。...
2018-03-23 19:04:15 419
原创 笔试题-(2)小朋友分糖果
写在前面: 题目比较简单,就是高中时候的排列组合挡板法,过了这么多年,忘得一干二净啊。题目:把60个糖果分给5个小朋友,每个小朋友至少分到10个糖果,请问有几种分法? 首先每个小朋友分10个,余下10个糖果。5个小朋友,每人可以有,也可以没有,所以,就在10个糖果内插入4个挡板,完成糖果分配=C(4)(14)。...
2018-03-22 16:44:40 3568
原创 笔试题-(1)1024的阶层结果末尾有多少个0
由于末尾0的个数取决于乘法中因子2和因子5的个数。显然,乘法中因子2的个数>因子5的个数,所以我们只需要考虑因子5的个数。 是5的倍数有1024/5=204个。 是25的倍数有1024/25=40个。 是125的倍数有1024/125=8个。 是625的倍数有1024/625=1个。 所以1024!总共有204+40+8+1=253个因子5。 ...
2018-03-22 16:15:05 806
原创 深入理解Java虚拟机---(6)触发Full GC的条件
写在前面: 前面两篇博客中介绍了GC的收集算法,和7种收集器的特点,而在这篇博客,我们会讨论什么情况下回触发一次Full GC。分代收集补充: 在了解什么情况触发一次Full GC之前,我们先看一下JVM对象在内存区域中的年代划分。首先,我们知道GC收集器会根据回收对象的年龄,进行分代收集,如:Minor GC、Major GC。 Minor GC: 新生代GC,指发生在新...
2018-03-22 14:39:33 6517 1
原创 深入理解Java虚拟机---(5)HotSpot算法实现+GC的收集器
写在前面: 在上一篇博客中,为大家总结了GC的相关回收算法,以及怎么判断对象是否已经"死亡",在这篇博客中,将会以HotSpot虚拟机为例,讲解GC的收集器。HotSpot的算法实现: (1)GC停顿 因为GC Roots的节点主要是全局性的引用(例如常量或类静态属性),如果逐个检查引用,会消耗大量的时间。GC分析工作会让所有的线程停顿在某个时间点上。 但时间上,HotSp...
2018-03-19 10:22:21 350
原创 Java中的正则表达式
写在前面: 你可能不知道正则表达式的含义,但你在实际开发的过程中,一定或多或少的使用过和正则表达式类似的应用场景。举一个例子,我们需要查找出某个文件夹下所有以 .mp3为后缀的文件,我们可能就是使用*.mp3。*是通配符,会匹配任意字符,这样不管前面如何,后缀为.mp3为后缀的文件就被找出来。那么正则表达式又是什么呢?正则表达式(Regular Expression): 即对字符串操作...
2018-03-18 18:33:21 442
原创 Java的JDK代理
写在前面: Spring框架AOP的核心就是动态代理,动态代理又分为JDK代理和Cglib代理,这篇博客先来总结JDK代理的方法。JDK代理的核心是反射。所以要想手动实现动态代理,必须要实现InvocationHandler接口,并且有Proxy类动态创建一个代理对象。InvocationHandler: InvocationHandler接口中只有一个方法:invoke方法。invo...
2018-03-17 22:12:15 325
原创 排序算法---(4)快速排序---Java实现
写在前面: 快速排序是冒泡排序的升级,他的排序思想为:对于给定的一组记录,选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到序列中的所有记录均有序为止。例如:数组int [] arr = {4,3,5,6,1,2},选取基准点为...
2018-03-17 19:07:25 225
原创 String、StringBuilder、StringBuffer的总结
写在前面: String、StringBuilder、StringBuffer都是Java用于定义一个字符串,三者看着相似,但在效率,线程安全方面有着区别。这篇博客就进行一些总结。 String: String大概是我们学习Java SE最先接触到的一个关键字了,String是字符串常量,String对象一旦创建之后,不会改变。package string;public cl...
2018-03-15 12:09:16 197
原创 Java并发编程基础---(15)Java死锁总结
写在前面: 死锁是进程死锁的简称,死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的是指多个进程循环等待他方占有的资源而无限的僵持下去的局面。很显然,没有外力作用,那么死锁涉及到的各个进程都将永远处于封锁状态。死锁的产生: 计算机系统产生死锁的根本原因就是资源有限且操作不当。 (1)一种原因是系统提供的资源太少了,远...
2018-03-14 15:29:07 249
原创 JDK8下的HashMap源码分析
写在前面: Java为了更方便的使用数据结构中的映射机制,提供了Java.util.Map接口,Map接口有4个常用的实现类:HashMap、LinkedHashMap、HashTable、TreeMap。在这篇博客中,我们将分实现原理。。。来对JDK8下的HashMap源码分析。 Java集合框架关系图: Map的4个实现类对比:(1)HashMap:HashMap保存了一个键...
2018-03-13 19:47:41 278 1
原创 HTTP与HTTPS的区别
写在前面: HTTP协议是OSI7层模型中的应用层协议,用于客户端与服务器之间传输超文本信息的协议,但不提供加密服务,如果攻击者截取了传输报文,那么如用户名,密码等就会被直接获取。因为HTTPS协议也就应运而生,HTTPS协议安全超文本传输协议,保证了数据传输的安全。 HTTPS协议: HTTPS其实是安全的HTTP协议,由于HTTP协议的不安全性,由NetScape公司研发的S...
2018-03-13 11:58:29 287
原创 Java并发编程基础---(14)实现多线程的3种方式
写在前面: Java 实现多线程共有3种方式,第一种是继承Thread类,第二种是实现Runnable接口,而在Java5之后,又增加了第三种方式,实现Callable接口。继承Thread类:package createthread;public class Demo1 { public static void main(String[] args) { ThreadDemo th...
2018-03-12 22:33:35 195
原创 finally块的执行情况分析与总结
写在前面: 我们在学习异常这一块内容时,老师一把把都会说,为了保证资源的释放,我们加入finally块,因为finally块中的代码一定会执行。但事实?却不然,这篇博客中将带来finally块的执行情况分析与总结。(1)finally块内容被执行 finally块的代码是在try代码块的return执行语句执行之后,方法返回之前,执行。说着比较绕口,我们来看一个Demo:package...
2018-03-12 19:26:47 389
原创 TCP协议的三次握手和四次挥手
写在前面: 在TCP/IP协议栈中,尽管TCP协议和UDP协议都是用网络层,但是他们向应用层却提供了不同的服务。TCP提供了一种面向连接的可靠地字节流传输,而UDP协议提供的是面向无连接的,简单不可靠的信息传输。 面向连接也就意味着客户端和服务器,在交换彼此数据之前,需要先建立一个TCP连接,这篇博客就将会介绍如何建立和释放一个TCP连接,也就是我们说的三次握手和四次挥手。TCP报文格...
2018-03-11 21:51:17 240
原创 深入理解Java虚拟机---(4)对象是否“死亡”的判断和GC的相关收集算法
写在前面: 在总结GC之前,首先要说,Java语言的一大好处就是讲程序员从繁杂的垃圾回收,释放对象内存空间中解放出来,相比之下,C++语言,还需要通过程序员手动的去管理,释放内存空间,省去了程序员的一大部分工作。在这一篇博客中,将会总结对象的“死亡”判断和GC的相关收集算法等。GC的研究范围: 首先在前一篇博客中,我们知道了JVM的内存区域划分,很多区域是线程独享的,比如:程序计数器、...
2018-03-11 18:06:59 398
原创 深入理解Java虚拟机---(3)内存溢出与内存泄漏
写在前面: 内存溢出和内存泄漏都是程序中,我们要极力避免出现的异常,二者在字面上看上去相似,但实际上是不一样的异常情况,在这篇博客中,我们会总结内存溢出与内存泄漏的区别。内存溢出和内存泄漏的定义: 内存溢出:Out Of Memory,指程序在申请内存时,没有足够的内存空间供其使用。 内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间。 用通俗一点的话来解释,内存溢出...
2018-03-11 18:00:52 306
原创 数据库-乐观锁和悲观锁
写在前面: 锁根据其使用的方式可以划分为:乐观锁和悲观锁。乐观锁即乐观并发控制,悲观锁即悲观并发控制,他们是处理并发控制时主要采用的技术手段。其中,悲观锁正是数据库本身提供的锁机制实现的。 悲观锁: 悲观锁(Pessimistic Concurrency Control)缩写为PCC。从字面意义上理解,就是每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别...
2018-03-08 23:00:15 2545
原创 排序算法---(3)简单插入排序---Java实现
写在前面: 简单插入排序法其实比较好理解,他的算法过程类似于打扑克抓牌的过程。在我们抓到第一张牌之后,以后抓的每一张牌都会与之前手中的牌对比,对比之后,插入到合适的位置上,直到抓完最后一张牌。那么在算法实现中,也是同理,我们假设数组索引为0的元素有序,从数组索引为1的元素开始,将arr[1]与arr[0]对比,如果大于arr[1]>arr[0],则插入到arr[0]的后面,如果arr[...
2018-03-08 20:45:19 206
原创 排序算法---(2)选择排序---Java实现
写在前面: 在这篇博客中,将会总结选择排序算法的Java实现,分析选择排序算法的时间复杂度,空间复杂度等。选择排序算法的排序思想是,首先第一轮找到数组中最小的数字,并与数组索引为0的元素交换,第二轮从索引为1的位置开始寻找,同样是找到数组中剩余元素最小的元素,然后再与索引为1的元素交换,依次类推。。。。。核心思想即:每一轮找到数组中最小的元素,插在前面,最后完成排序。例如:数组int [] ...
2018-03-08 19:13:35 243
原创 Java并发编程基础---(13)wait和sleep的区别
写在前面: 在并发编程中,wait和sleep是常用的方法,相似却有着很大的区别,今天在博客中进行总结。我也是根据平常的并发编程经验和相关的博客总结了wait和sleep的区别,以及各自特点,肯定会有未想到的,希望大家帮忙留言补充,谢谢大家。wait是Object类的final方法,不可以被重写,而sleep方法时Thread类中静态、native修饰的本地方法。wait方法调用后,线程会释...
2018-03-07 19:42:16 284
原创 Java并发编程基础---(12)线程的中断
写在前面: 之前在一篇博客中介绍了线程中断的相关内容(http://blog.csdn.net/may_3/article/details/79393281),在Java锁的实现中也有使用中断的地方,所以想用一篇博客再好好总结一下线程的中断。 中断:概念: 中断是线程的一个标识位属性,表示运行中的线程是否对其他线程进行了中断操作。其他线程是通过interrupt方法来中断线程。应...
2018-03-07 19:36:07 186
原创 Java并发编程基础---(11)读写锁---ReadWriteLock
写在前面: Mutex(互斥锁)、ReentrantLock(重入锁)本质上都是一种排他锁,在同一时刻只允许一个线程进行访问,而读写锁允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程都会被阻塞。 ReadWriteLock:引入: 在JDK5之前,读写锁的实现,是利用了等待通知机制+synchronized关键字。等待通知机制可以让所有晚于写操作的读操作进入等待状...
2018-03-07 16:35:53 355
原创 Java并发编程基础---(10)重入锁---ReentrantLock
写在前面: 在之前的博客中,我们总结了队列同步器的方法,在这篇博客中,将会总结Lock的实现类ReentrantLock,在ReentrantLock类的内部,就有一个内部类,继承了我们之前讨论过的队列同步器,我们也一起来看看队列同步器的实际应用。 公平锁和非公平锁: 在讲解ReentrantLock类之前,我们先引入一个概念--公平锁和非公平锁。 我们可以想象一个场景,比...
2018-03-06 23:00:37 283
原创 Java并发编程基础---(9)Java中的锁---队列同步器
写在前面: 在这一篇博客中,将会介绍Java中的锁等相关内容,篇幅较长,会循序渐进的总结从队列同步器再到Lock接口的相关实现类。队列同步器: 队列同步器 (AbstractQueuedSynchronizer) ,是用来构建锁和其他同步组件的基础,从Java API中,我们可以看出,在AbstractQueuedSynchronizer类中,定义了一个int 类型的变量-...
2018-03-06 19:34:12 326
原创 Java并发编程基础---(8)控制并发编程数量的Semaphore总结
写在前面: 在前面两篇博客中,介绍了CountDownLatch、CyclicBarrier类的使用,这篇博客中,将会总结Semaphore类的使用,完善Java并发包中的3个工具类的使用总结。Semaphore Semaphore是用来控制程序中并发访问一个特定资源的线程数量,Semaphore通过协调各个线程,从而保证了资源的调度。Semaphore的构造器 我们来看一下JD...
2018-03-06 16:39:33 226
原创 Java并发编程基础---(7)CyclicBarrier同步屏障总结
写在前面: CyclicBarrier从字面上来看是指一道屏障,CyclicBarrier的作用是在一组线程到达屏障时,会被阻塞,直到最后一个线程到达屏障时,屏障才会开门,这时,被屏障拦截的线程才会继续运行。 CyclicBarrier构造器 public CyclicBarrier(int parties) { this(parties, null); }...
2018-03-06 13:31:05 215
原创 深入理解Java虚拟机---(2)JDK、JRE、JVM的联系与区别
写在前面: 程序员在自己的计算机上安装好JDK后,可以开发自己的Java程序,可能就不是那么关心JDK、JRE、JVM之间的联系,今天通过这篇博客来进行一些总结。1. JDK: JDK是指 Java Development Kit ---Java开放工具包,包括了Java运行环境JRE、Java工具和Java核心类库,在安装好JDK后,会有几个文件夹。 bin:存放Java的操作...
2018-03-06 09:56:58 985
原创 Java并发编程基础---(3)CountDownLatch类总结
写在前面: CountDownLatch类在java.util.Concurrent包下在Java API中,是一个同步工具类,对CountDownLatch类的描述是允许一个或者多个线程等待,直到其他线程执行完后再执行。 CountDownLatch类可以使其他线程完成各自的工作后,再执行。比如:在应用程序中,main线程希望在所有框架服务的线程已经启动完所有框架服务之后...
2018-03-05 23:00:02 187
原创 Java并发编程基础---(6)Java多线程的Join方法详解
写在前面: 在并发编程时,我们很容易会遇到输出一个数字的时候,可能得不到我们理想中的结果,那这是为什么呢?先让我们看一个最简单的例子。示例1:package test2;/** * * @ClassName Test1 * @Description:测试线程输出结果 * @author McGRADY * @date 2018年3月5日 */public class Te...
2018-03-05 22:48:03 276
原创 深入理解Java虚拟机---(1)JVM五大内存区域划分
Java运行时数据区: 我们可以看到Java虚拟机在执行Java程序的时候,将Java的内存可以分为若干个区域方法区(Method Area) 、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack) 、堆(Heap) 、程序计数器(Program Counter Register)。1. 程序计数器 程序计数器是当前线程所执行的字节码的行号指示器,...
2018-03-05 20:09:52 816
原创 数据库-事务的ACID和隔离级别
写在前面: 数据库是面试的一大重点,在上一篇博客中,我们已经总结了数据库的三大范式,在这篇博客中,将会总结另一个总会被问到的问题--事务的ACID和事务隔离级别。 事务(Transaction): 在计算机语言中,一般指访问并更新数据库中的一个程序执行单元。 事务具有的四个特点,称为ACID。在数据库的并发访问中,为了保证数据的读取正确性,设置的事务的隔离级别。 事务的AC...
2018-03-05 17:22:31 1175
原创 数据库三大范式
写在前面: 为了建立冗余较小,数据结构合理的数据库,设计数据库时,必须遵循一定的准则,这种规则就成为范式(Normal Form)。设计范式共有6种--第一范式(1NF ),第二范式(2NF ),第三范式(3NF ),巴斯-科德范式(BCNF ),第四范式(4NF ),第五范式(5NF完美范式)。在实际开发中,常用的范式有3种。(1)第一范式(1NF): 数据库表中的所有字段值是不可分...
2018-03-05 14:05:39 216
原创 OSI 7层模型与TCP/IP协议栈4层模型
写在前面: OSI 7层模型是指开放系统互连参考模型(Open System InterConnect),是为了实现开放系统互连所建立的通信功能模型。OSI 7层模型第7层:应用层(Application Layer)---提供为应用程序而设的界面,来与另一个应用程序之间进行通信。是网络向用户提供应用服务的唯一窗口,因为提供的用户要求不同,也就产生了不同的协议,如:HTTP、HTTPS、F...
2018-03-05 11:12:10 512
原创 Java并发编程基础---(5)线程池ThreadPoolExecutor的实现原理及使用
写在前面: Executor框架最核心的类是ThreadPoolExecutor,是线程池的实现类。 ThreadPoolExecutor继承了AbstractExecutorService接口。ThreadPoolExecutor ThreadPoolExecutor提供了4个构造方法。(1) public ThreadPoolExecutor(int corePoolSize...
2018-03-04 19:24:57 353
原创 排序算法---(1)冒泡法---Java实现
写在前面: 冒泡法的排序思路是比较相邻的元素,从数组中arr[0]和arr[1]开始,如果左边的元素大于右边元素,那么交换两个元素的位置,依次比较相邻元素,在第一趟排序之后,数组中最大的元素会被交换到数组最后的位置。下一轮,再重新从数组的第一个元素开始,继续交换,直到不需要再交换为止。 例如:数组int [] arr = new int [] {2,5,3,1,6,8,4,7}(1)第...
2018-03-04 13:29:31 203
原创 Java设计模式---(1)单例模式
写在前面: 首先,设计模式就是一套可以被复用的代码的总结,也可以是一个普遍问题的解决方案。Java中有23种设计模式,从今天开始为大家总结设计模式的用处,代码实现等。 单例设计模式:(1)懒汉式 在调用getInstance方法时,才会创建实例。代码实现:package singleton;/** * * @ClassName SingletonDemo2 * @De...
2018-03-04 10:10:37 744
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人