- 博客(38)
- 收藏
- 关注
原创 JMM内存模型
Java内存模型(JMM):描述共享变量在并发场景下的访问规则(happens-before)主内存和工作内存:JMM主要是定义程序中各个变量的访问规则,变量(共享变量)包括字段,静态字段以及构成数组的元素.JMM规定所有共享变量都存储在主内存中(堆,方法区),每个线程还有自己的工作内存(虚拟机栈),线程的工作内存保存了该线程使用的变量的主内存副本,线程对变量的所有操作(读取,赋值)等都必须...
2019-12-20 18:23:17 234
原创 内部类
内部类其实就是在一个类中进行其他类结构的嵌套优点:内部类与外部类可以互相访问彼此的私有域内部类可以实现Java的单继承局限内部类可以对同一包中的其他类隐藏起来,仅供外部类使用内部类与外部类的关系:对非静态内部类而言,内部类的创建需要依赖外部类的实例化对象,在没有外部类对象之前是无法创建内部类的内部类是一个相对独立的个体,与外部类不是is-a的关系内部类可以直接访问外部类的元素...
2019-12-20 17:32:24 179
原创 线程池
线程池优点:1. 降低资源消耗:通过反复利用已创建的线程降低线程创建与销毁带来的损耗2. 提高响应速度:当任务到达时,无需等待线程创建就可以立即执行3. 提高线程的可管理型:使用线程池可以统一进行线程分配,调度与监控线程池的继承关系:ExecutorService(普通调度池核心接口)submit(Callable\Runnable):FutureScheduledExecutor...
2019-12-20 09:02:54 184
原创 类加载机制
类加载过程类是在运行期间第一次使用时动态加载的,而不是一次性加载.因为如果一次性加载,会占用很多的内存.类的生命周期包括以下7个阶段:加载验证准备解析初始化使用卸载类加载过程包含了加载,验证,准备,解析,初始化这五个阶段.1.加载加载是类加载的一个阶段,加载过程完成以下三件事:通过类的完全限定名称获取定义该类的二进制字节流将该字节流表示的静态存储结构转换为方法区的...
2019-12-19 18:19:46 153
原创 ReenrantLock源码剖析
重入锁的实现原理内建锁隐式的支持重入性,synchronized通过获取自增,释放自减的方式实现重入.重入锁的特性:线程获取锁时,如果已经获取锁的线程是当前线程直接获取.因为可以获取N次,所以只有当释放N次后才算真正释放成功.非公平锁nonfairTryAcquire():final boolean nonfairTryAcquire(int acquires) { //拿...
2019-12-18 18:38:21 185
原创 AQS独占锁源码剖析
LockJDK1.5之后增加Java.concurrent.locks提供了与内建锁完全不同的实现多线程共享机制,失去了内建锁隐式的加锁与解锁过程,增加了可中断的获取锁以及超时获取锁以及共享锁等内建锁不具备的特性.lock接口的API有以下几种:I . void lock(); / /获取锁II . void lockInterruptibly()throws InterruptedExc...
2019-12-17 21:40:05 148
原创 内存分配策略与Full GC的触发条件
一.内存分配策略1.对象优先在Eden分配.大多数情况下,对象在新生代Eden区分配,当Eden区空间不够时,发起Minor GC.2.大对象直接进入老年代大对象是指需要连续内存空间的对象,最典型的大对象是那种很长的字符串以及数组.经常出现大对象的话会提前触发垃圾收集以获取足够的连续空间分配给大对象.-XX:PretenureSizeThreshold,大于此值的对象直接在老年代分配,避...
2019-12-16 17:34:00 166
原创 垃圾回收器
垃圾收集器上篇是我们说的垃圾回收的方法,接下来我们说说垃圾回收的具体实现–垃圾回收器:上图中展示了7种作用于不同分代的收集器如果两个收集器之间存在连线,就说明他们可以搭配使用.所处区域表示它是属于新生代收集器还是老年代收集器.1.Serial收集器(新生代收集器,串行GC)特性: 这个收集器是一个单线程的收集器,在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束(Stop Th...
2019-12-16 12:10:58 99
原创 可达性分析与垃圾回收算法
在进行垃圾回收之前,需要判断对象是否已死.一共有两种方法:1.引用计数法算法思想:给每个对象附加一个引用计数器,每当有一个地方引用此对象时,计数器加一,每当有一个引用失效时,计数器减一,在任意时刻只要计数器为0,该对象就是不能再使用的,即对象已死.引用计数器实现简单并且判定效率较高,但是无法解决循环引用问题.(JVM并未采用此方法)2.可达性分析算法Java采用此算法来判断对象是否存活....
2019-12-16 12:10:22 707
原创 输入一个url后发生的事
当你在输入一个url后发生了些什么?域名解析建立连接发起请求得到响应处理响应解析正文断开连接1.域名解析首先,输入域名后,先查找自己主机对应的域名服务器.域名服务器先查找自己的数据库中的数据,如果没有,就向上级域名服务器进行查找,以此类推,最多回溯到跟域名服务器,肯定能够找到这个域名的IP地址.(当然,域名服务器自身也会进行一些缓存,把曾经访问过的域名和对应的IP地址缓存起来...
2019-12-15 12:05:39 231 1
原创 Synchronized原理及内建锁的优化
synchronized处理同步有两种模式:同步代码块:锁 类的实例对象 synchronized(this){ }锁类对象synchronized(类名.class){ }锁任何实例对象 String lock = " ";synchronized(lock){ }–全局锁同步方法:普通方法+synchronized,锁的是当前对象静态方法+synchronized,锁的是...
2019-12-13 21:25:06 132
原创 JVM内存划分
JVM,即Java虚拟机,是通过软件模拟的具有完整硬件功能,运行在完全隔离环境中的计算机系统.它通过软件模拟Java字节码指令集,JVM只保留了PC寄存器,而普遍的虚拟机有很多寄存器.Java内存划分Java内存区域一共划分为6块,如下图:其中,线程私有内存:1. 程序计数器程序计数器是比较小的内存空间,它是当前线程所执行的字节码的行号指示器.若当前线程执行的是Java方法,计数器记...
2019-12-07 21:23:20 119
原创 浅谈异常
异常继承图可以看出,所有的异常都继承自Throwable,Throwable的两个子类分为Error和Exception.Error:就是错误,无法捕捉,是程序无法处理的,如OutOfMemoryError.Exception:RuntimeException:运行时异常,发生在运行期,可以使用try catch来处理,如果不捕获,JVM会自动处理.比如:ClassCastExcepti...
2019-12-06 17:25:53 115
原创 十进制与二进制的相互转化
计算机储存数据是以二进制的方式,二进制数据是用0和1两个数码来表示的数。今天来讲讲十进制怎么转化为二进制.例如有一个十进制数字200,怎么转化成二进制呢? 128 < 200 < 256,所以把代表128的位 置为1.如下图:200 - 128 = 72. 又因为 64 < 72 < 128 ,所以把代表64的位 置为1.如下图:72-64 =...
2019-12-02 16:38:44 1841
原创 表的增删改查(二)
1.1 NULL约束创建表时,可以指定某列不为空:--重新设置学生表结构drop table if exists student;create table student(id int not null,name varchar(20),qq_mail varchar(20));1.2UNIQUE:唯一约束指定name列为唯一的,不重复的:--重新设置学生表结构drop t...
2019-12-01 21:36:36 259
原创 七大排序
1.插入排序原理: 整个区间被分为有序区间和无序区间两部分,每次选择无序区间的第一个元素,在有序区间内选择适合的位置插入//插入排序// 时间复杂度最坏情况下:为O(n^2)// 最好情况下:O(n)//空间复杂度O(1)//越有序速度越快//折半插入排序是插入排序的优化public static void insertSort(int[] array){ ...
2019-11-28 19:59:33 109
原创 优先级队列(堆)
堆的概念:逻辑上是一颗完全二叉树堆物理上是保存在数组中满足任意节点的值都大于其中子树中的值叫做大堆/大根堆/最大堆满足任意节点的值都小于其中子树中的值叫做小堆/小跟堆/最小堆堆的基本作用是快速找出集合中的最值堆的操作:1.向下调整代码实现(以大堆为例)://时间复杂度O(log(n))public class Heap { public int[] elem; ...
2019-11-27 18:18:49 174
原创 JDBC编程原理
JDBC,是Java的数据库连接,是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范.它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.JDBC的工作原理JDBC为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类.JDBC的使用共分5步骤:1 建立数据库连接2 创建操作...
2019-11-27 15:55:39 137
原创 表的增删改查(一)
新增--创建一张学生表drop table if exists student;create table student(id int,sn int comment '学号',name varchar(20) comment'姓名',qq_mail varchar(20) comment 'QQ邮箱');多行数据+指定列插入--插入两条记录,value_list数量必须和指定列...
2019-11-24 22:51:08 141
原创 数据库基础
显示当前数据库:show databases;创建数据库如果系统没有db_test2的数据库,则创建一个使用utf-8字符集的db_test数据库,如果有则不创建.create database if not exists db_test character set utf8;使用数据库use db_test;删除数据库drop database db_test;数据库删除以后...
2019-11-24 22:03:40 89
原创 变量和运算符
数据类型:java中数据类型分为基本数据类型和引用数据类型两种,基本数据类型包含byte,boolean,short,char,int,float,long,double八种,引用数据类型有数组,类,接口等等原始类型:boolean char byte short int long float double封装类型:Boolean Cha...
2019-11-17 14:35:52 91
原创 [Java]剑指offer61-66题_day13
61序列化二叉树题目描述请实现两个函数,分别用来序列化和反序列化二叉树思路:对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的节点不为空时,在转化val所得的字符之后添加一个’,‘作为分割,对于空节点则使用’#'代替对于反序列化:按照前序顺序,递归的使用字符串的字符创建一个二叉树package com.matajie;/** * 61序列化二叉树 * 题...
2019-05-10 15:09:51 189
原创 [Java]剑指offer56-60题_day12
56.删除链表中的重复节点题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路一:递归package com.matajie;/** * 56.删除链表中重复的节点 * * 题目描述 * 在一个排序的...
2019-05-08 13:46:55 186
原创 [Java]剑指offer51-55题_day11
51.构建乘积数组题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。思路:B[i]的值可以看做如图矩阵中每行的乘积,下三角用连称可以很容易求得,上三角从上向下也是连乘,所以我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律把另一部分也乘进去p...
2019-05-08 11:54:57 195
原创 [Java]剑指offer46-50题_day10
46.孩子们的游戏题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样...
2019-05-06 13:21:28 193
原创 [Java]剑指offer41-45_day9
41.和为S的连续正数序列思路一:由于要找的是和为S的连续正数序列,那么这个序列是个公差为1的等差数列,而这个序列的中间值带变了平均值的大小,假设序列的长度为n,则中间值可以通过(s/n)得到.满足条件的n分为两种情况:n为奇数时,序列中间的数正好是平均值,所以条件为(n&1) == 1&&sum%n ==0.(奇数的二进制最右的一位数字一定为1,(n&1)...
2019-05-05 16:50:05 297
原创 [Java]剑指offer36-40题_day8
36.两个链表的第一个公共节点题目描述输入两个链表,找出它们的第一个公共结点。思路:我们的做法通常是找出两个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为两个链表用公共的),可是我们真的需要知道长度吗?看看另一种浪漫的解法:走你来时走过的路,那么我们会在交叉路口突然的相遇.package com.matajie;/** * 36.两个链表的第一个公共节点 * ...
2019-05-05 13:27:36 209 1
原创 [Java]剑指offer31-35题_day7
31.整数中1出现的次数题目描述求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:设N = abcde,其中abcde分别是十...
2019-05-04 01:14:54 211
原创 [Java]剑指offer26-30题_day6
26.二叉搜索树与双向链表题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路一:非递归版核心是中序遍历的非递归算法修改当前遍历节点与前一遍历节点的指针指向package com.matajie;import java.util.Stack;/** * 26.二叉搜索树与双向链表 * 题目描述 ...
2019-05-02 21:52:05 182
原创 [Java实现]剑指offer21-25题_day5
21.栈的压入.弹出序列题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:借助一个辅助的栈,遍历压栈顺序,先将第一个放入栈中,...
2019-05-01 01:07:36 236
原创 [Java实现]剑指offer16-20_day4
16.合并两个排序链表题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路一:非递归package com.matajie;/** * 16.合并两个排序链表 * 题目描述 * 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 * * 我的程序才不会有bug! * author:...
2019-04-30 17:06:08 262 3
原创 [Java实现]剑指offer11-15题_day3
11.二进制中1的个数题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:如果一个整数不为0,那么这个整数至少有一位是1,如果把这个整数减1,那么原来处在整数最右边的1就会变成0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话).其余所有位将不会受到影响.举个栗子:一个二进制数1100,从右边起第三位是处于最右边的一个1,减去1后第三位变成0,它...
2019-04-29 17:58:56 168
原创 Java集合类之Collection接口及其子接口
Collection接口在Java的类集里面(java.util包)提供了两个最为核心的接口:Collection、Map接口。Collection是单个集合保存的最大父接口Collection接口继承树:Collection接口常用方法:1. add(E e) : 向集合中添加元素2. addAll(Collection<? extends E> c) : 向集合中添加...
2019-04-29 16:01:57 6394 2
原创 Object类源码解析
Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类。这里总结Object类中的几个方法:wait(),notify(),notifyAll(),wait(long timeout), hashCode()和equals()。1.wait()public final void wait() throws Interrup...
2019-04-28 18:09:15 159 1
原创 剑指offer复习6-10题_day2
6.题目:旋转数组的最小数字题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:这道题一共有三种思路思路一:顺序查找. 分界点前后都是非递减数...
2019-04-28 11:55:01 162 1
原创 剑指offer复习1-5题_day1
1题目:二维数组的查找在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:首先选取右上角的数字,如果该数字等于要查找的数字,结束.如果数组>X,剔除这个数字所在的列,若数组<X,剔除该行,直到找到该数或者为空.package com...
2019-04-27 15:57:47 154
原创 厄拉多塞筛法统计所有小于非负整数 n 的质数的数量
今天做了一道有意思的题,与大家分享一下.统计所有小于非负整数 n 的质数的数量。示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。package com.matajie;import java.util.Scanner;/** * 统计所有小于非负整数 n 的质数的数量。 * 示例: * 输入: 10 * 输出: 4...
2019-04-04 18:44:01 902
原创 java工厂,代理,单例设计模式及其部分改善
java基础要求掌握三种重点设计模式:工厂,代理,单例。本文将针对工厂设计模式中的简单工厂模式,代理模式和单例模式这几块儿,我今天必须给大家讲的明明白白!一.工厂设计模式.1.简单工厂模式简单工厂模式专门定义一个类用来创建其他类的实例,被创建的实例通常都具有共同的父类。概要:1.一个抽象产品类 2.具体产品类 3.一个工厂优点:简...
2019-03-22 18:17:44 318
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人