自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 LinkedList源码分析

LinkedListLinkedList采用双端链表的数据结构实现,且由于双端链表的特性,LinkedList也可以作为队列、双端队列来使用,不仅如此也可以作为栈使用。public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>,...

2019-12-20 10:59:29 112

原创 AtomicStampedReference源码分析

AtomicStampedReferenceAtomicStampedReference是j.u.c.atomic包下提供的一个原子类,它能通过维护一个版本号解决其它原子类无法解决的ABA问题。ABA问题我们知道CAS操作底层是依赖于Unsafe.compareAndSwap操作实现的,它通过比较源内存地址与更新时期望的内存地址是否相同来决定是否执行更新操作,但如果某线程1在读取了内存地址X...

2019-12-19 14:25:40 182

原创 AtomicInteger源码分析

主要属性 //获取Unsafe实例对象, 目的是使用Unsafe.compareAndSwapInt进行update操作 private static final Unsafe unsafe = Unsafe.getUnsafe(); //标识value字段的偏移量 private static final long valueOffset; //初始化: 通...

2019-12-19 12:50:30 147

原创 Unsafe源码分析

获取Unsafe实例@CallerSensitive public static Unsafe getUnsafe() { Class var0 = Reflection.getCallerClass(); //若当前类加载器采用的不是BootStrapClassLoader, 那么就抛出异常 if (!VM.isSystemDomainL...

2019-12-18 19:30:40 169

原创 LinkedHashMap源码分析

LinkedHashMapLinkedHashMap结合了HashMap查询时间复杂度为O(1)和LinkedList增删时间复杂度为O(1)的特性,使其相比起LinkedList的随机访问更加高效,并且相比起HashMap拥有了有序的特性,但由于每一次对元素操作之后需要同时维护HashMap和LinkedList中的存储,性能上相较于HashMap稍慢。LinkedHashMap也可以用来实...

2019-12-14 15:32:26 487

原创 HashMap源码分析

HashMapHashMap采用key-value的存储结构,每个唯一key对应一个唯一的value,通常情况下HashMap的查询和修改时间复杂度为O(1),因为是散列存储,HashMap不能保证元素存储的顺序,且线程不安全。public class HashMap<K,V> extends AbstractMap<K,V> implements Map&lt...

2019-12-11 17:45:31 71

原创 ArrayList源码分析

在分析动态数组ArrayList的源码之前先对其底层数据结构——数组进行分析数组数组是一种最基本的数据结构,采用了一组连续的内存空间按顺序存储对象或基本数据类型。其访问的时间复杂度为O(1),插入以及删除由于涉及到元素的移动时间复杂度为O(n),在Java中声明一个数组需要事先指定数组的大小,那么就可能会造成空间浪费以及扩容问题,为了解决这些问题,动态数组ArrayList就诞生了。Arra...

2019-12-10 17:35:06 90

原创 Queue、PriorityQueue源码分析

源码分析一、Queue接口public interface Queue<E> extends Collection<E> { //队列头添加元素,若队列已满则抛出异常 boolean add(E e); //队列头添加元素,若队列满时不会抛出异常而是做一些相应的处理 boolean offer(E e); //队列头删除...

2019-10-19 13:48:57 101

原创 Stack源码分析

如下图所示,为Stack的一些特性源码分析一、构造器 //Stack的构造器默认调用了Vector的默认构造器 初始化一个长度为10的数组 public Stack() { //super(); } //指定初始化容量、增长因子 //若不指定增长因子 则默认扩容为原来的2倍 //这也是Vector和Array...

2019-10-19 11:05:56 73

原创 LRU缓存

一、什么是LRU算法LRU,Least Recently Used算法,即一种缓存淘汰策略。计算机的缓存容量有限,若缓存满了则需要删除一些内容,给新的缓存腾出空间,但问题是要删除哪些内容呢?当然是把用的少的缓存删掉,把最有用的数据继续保留以便于继续使用。那么如何判定哪些数据是有用的呢?缓存淘汰的策略有很多,而LRU则是一种较为简单常用的算法,LRU判定最近使用过的数据为有用的,很久都没...

2019-10-16 17:40:33 2892

原创 ArrayList源码分析

在分析ArrayList前我们需要了解它的底层数据结构——数组数组数组是一种最基本的数据结构,它采用一组连续的内存空间按顺序存储对象或基本数据类型。数组中每个元素都对应一个独一无二的下标,因此数组的随机访问时间复杂度为O(1),但是对于增/删操作需要移动后续元素,这也导致数组的增删时间复杂度为O(n)。在Java程序中,一般通过int [ ] = new int[ size ] 声明一个i...

2019-10-14 17:54:51 65

原创 Java内存区域划分

一次Java程序的运行过程首先需要将源代码编译为字节码,然后字节码通过类加载器被加载到内存,然后解析器解析字节码指令转换为操作系统可执行的机器码,融合原生库,提交给操作系统运行。其中将字节码加载到内存,这个内存就是该篇重点。通过上述我们可以得知:Java程序运行于JVM内存之上的,JVM会将这个内存划分为不同区域以方便管理,但是不同版本的JDK内存模型也不同,本篇以JDK1.8为准。我们可...

2019-10-13 10:37:18 96

原创 类加载机制

在开篇我们先回忆一下Java程序的运行过程,首先将Java源代码编译为字节码,然后类加载器将字节码加载到内存,然后解释器解析字节码并转换为机器码,融合原生库,提交给操作系统执行。上述过程中,"类加载器将字节码加载到内存"可以称之为类加载阶段,我们之所以能够反射调用JVM内存中的Class对象,依靠的便是类加载机制。类加载的流程主要分为三个步骤:加载、链接、初始化。下面是每个步骤的详细描述......

2019-10-08 18:44:03 126

原创 谈谈你对Java平台的理解

提到这个问题,我们首先能够想到的是Java平台的一次编译,到处运行。其次GC,异常处理,泛型等也是很显著的特性,本篇主要着重于跨平台。相信只要接触过Java的同学,都对JDK、JRE有一定的了解。JRE包含了JVM、Java类库以及一些模块等,JDK则包含了JRE、编译器、各种诊断工具等。这里先抛出一个问题Java是属于编译执行还是解释执行?正常情况下,我们开发的Java源代...

2019-10-07 21:17:54 95

原创 synchronized

Synchronized由于多线程环境下,多条线程可以共同操作一些共享数据,那么就有可能导致线程安全问题。synchronized关键字可以保证被它修饰的方法或代码块在任意时刻只能有一个线程被执行,从而解决了线程安全的问题。下面是本文涉及到关于synchronized的一些概括。synchronized的使用方式要注意的是synchronized锁的是对象而不是代码。即便sy...

2019-10-06 16:37:35 108

原创 Java多线程基础

在入坑Java多线程之前,先大概了解一下进程和线程的区别。进程与线程的区别CPU一次只能运行一个进程,该进程运行期间其他的进程都属于非运行状态。而一个进程又包括了多个线程,该进程的内存也由这些线程共享。虽然是内存共享,但是在并发场景下,为了防止多个线程同时读写某一块内存,某个线程也可以通过互斥锁mutex让其占用内存,其他线程若要使用这块内存,则必须等待持有锁的线程执行结束后才能使用。...

2019-10-04 14:06:11 141

原创 HashMap

HashMapHashMap是应用广泛的哈希表实现,通常HashMap进行put或者get操作,可以达到常数时间的性能,因此它是绝大部分利用key-value进行存取场景的首选,例如实现一个用户的ID和用户信息的运行时存储结构。下面是HashMap的一些特性:①HashMap不是同步的②支持null键和值由于HashMap的key值不重复的特性,只能允许存在一个null键。若出现k...

2019-10-04 10:15:54 122

原创 数据结构:B树&B+树

在学习B树之前,建议先了解二叉查找树,平衡二叉树,红黑树。它们的查找算法的时间复杂度为O(log2n),为了避免二叉查找树退化为线性链表,引入了平衡二叉树和红黑树的数据结构。确实二叉查找树在内存中的查找效率非常高,但是在大型的数据库存储中,实现索引查找如果采用二叉查找树查找的话,由于查找树中每个节点的存储数据是有限的,且因为查找树的结构特征,很可能导致遍历树的深度过大从而造成磁盘的IO操作过于...

2019-09-25 13:57:22 424

原创 Java异常机制

世界上不可能存在不会出错的程序,对于一门优秀的语言,它必定具备容灾机制的特性,这样才能保证程序的可靠性。Java在设计之初就提供了相对完善的异常处理机制,该机制大大降低了编写和维护可靠程序的门槛,或许这也是Java如今这么火爆的原因之一。在此,先抛出两个面试中常问到的问题——Exception和Error的区别,RuntimeException和CheckedException的区别...

2019-09-24 19:42:09 194

原创 数据结构:平衡二叉树

在学习平衡二叉树之前,我们需要先对二叉查找树进行一定的了解,其特征是:查找的性能取决于树的形状。因此在某些极端情况下,二叉查找树会退化为一个线性链表,查找效率的时间复杂度从O(log2n)降到了O(n)。为了规避这个缺点,引入了平衡二叉树。可以理解为平衡二叉树是基于二叉查找树的优化。平衡二叉树在二叉查找树的基础之上增加了一个新的特性:每一个节点的左子树与右子树高度相差最多为1,这个高度的...

2019-09-24 15:12:32 1726

原创 数据结构:二叉查找树

定义二叉查找树是以二叉树组织的,可以采用一个链表数据结构表示,其每一个节点为一个对象,包含left指针指向左孩子,right指针指向右孩子,parent指针指向父节点。在二叉搜索树中:若任意节点的左子树不为空,则左子树上所有节点的值均小于根节点。 若任意节点的右子树不为空,则右子树上所有节点的值均大于根节点。 任意节点的左,右子树也分别为二查搜索树。 没有键值相等的节点代...

2019-09-22 17:55:57 562

原创 HTTP和HTTPS的区别

HTTP部分的传送门:https://mp.csdn.net/mdeditor/100921051#在介绍HTTP和HTTPS的区别之前我们先观察以下两张图:这是我用google访问校园网时,url地址栏旁边会有不安全的提示。下面的是百度的主页(湖人球迷(●'◡'●))自2017年1月,Chrome把收集密码或信用卡数据的HTTP页面标记为不安全,自2017年10月,Chrom...

2019-09-21 17:31:19 147 1

原创 MYSQL日志系统:一条SQL查询语句是如何执行的?

下面是一个表的创建语句,该表有一个主键ID和一个整形字段cmysql>create table T(ID int primary key,c int);如果要将ID=2这一行的值+1:mysql>update T set c=c+1 where ID=2;分析之前再回顾以下mysql的逻辑架构图:执行语句前先通过连接器连接数据库。缓存略过。接下来分析器通过词汇和语法...

2019-09-21 16:32:19 99

原创 Java八大排序算法

目录交换排序:冒泡排序 快速排序插入排序:直接插入排序 希尔排序选择排序:简单选择排序 堆排序其他排序:归并排序 ...

2019-09-21 14:25:20 162

原创 数据结构:堆

堆是采用数组实现的二叉树,会根据堆属性进行排序,堆属性决定了树中节点的位置。堆的常用方法:构建优先队列 支持堆排序 快速找出一个集合中的最大值或最小值 装逼堆属性堆分为两种:最大堆和最小堆,其差别在于节点的排序方式最大堆:父节点大于任何一个子节点最小堆:父节点小于任何一个子节点这就是所谓的堆属性,且对于堆中任何一个节点都成立。如图中的最大堆:父节点10大于7...

2019-09-20 11:57:36 90

原创 Cookie & Session

在介绍Cookie和Session之前我们先想象一下没有Cookie和Session的场景:一般我们打开一个网站,仅需进行一次登陆后网站便会保持我们的登陆状态。因为Http是无状态的,若没有Cookie&Session,每当我们进行一次需要用户信息的操作时,都需要再次进行登陆。由此可见Cookie&Session的重要性。Cookie它时由服务器发送给客户端的特殊信息,以文本...

2019-09-18 20:29:16 85

原创 MYSQL基础架构:一条SQL查询语句是如何执行的?

参考自:https://time.geekbang.org/column/article/115537对于下面这个mysql查询语句相信任何接触过mysql的coder都不会陌生mysql>select * from T where ID=10;通过这个指定我们能够从数据表中获得一个结果,那么这个语句在MySQL内部执行的过程是什么样的呢?首先给出MySQL的基本架构图,其中概况了...

2019-09-18 20:09:41 83

原创 HTTP协议

什么是HTTP协议对于HTTP协议我想任何接触过计算机的都不会陌生,它是我们通过浏览器访问各个网页的基础。HTTP,全名超文本传输协议,是一个位于应用层的协议,其特点如下:①无状态:HTTP对于事务处理没有记忆功能。假设一个web网站没有session机制,我们点击登陆提交数据后,在下一个页面中HTTP是无法得知我们之前是否进行过登陆的。但是对于web网站是需要维持这种登陆状态的,于是引入了...

2019-09-18 16:25:27 64

原创 剑指Offer数据结构:对于数组部分个人的理解

数组是一种最基本的数据结构,它采用一组连续的内存空间按顺序存储对象或基本数据类型。那么我们在Java程序中,声明一个数组会要求先指明其容量大小,那么这个机制就带来了一些问题。问题1,数组的扩容问题例如我们创建了一个容量为10的数组,后期需要将其扩容为容量12的数组,这样我们又必须手动去修改它的容量。若只需要修改一两次还好,如果需要修改1000次,10000次呢?为了解决这个问题,就诞生了Co...

2019-09-16 15:41:23 57

原创 TCP滑动窗口

TCP是一个面向连接的可靠传输协议,既然要求可靠则必须得对数据进行确认,而TCP的数据确认以及流量控制的机制就是靠滑动窗口的机制完成的。TCP的两端都可以进行数据发送以及接收,因此两端都可以互相提供数据流的相关信息,包括报文段序列号,ACK,window size。接收端计算window作为接收端时可以通过计算AdvertisedWindow(剩余可发送的数据大小)用于告知发送方动态调整w...

2019-09-16 09:39:03 193

原创 UDP的特点以及跟TCP的区别

从数据报文的结构可以看到:UDP相比起TCP,其结构要简单许多,由源,目的端口,校验和,数据长度组成。这样简单的结构也就说明了UDP是不能够支持像TCP那样,支持错误重传,滑动窗口等精细控制。UDP的主要特点:①无连接(传输数据时,源端和终端不建立连接)②尽最大努力交付(所以不保证可靠交付,也不需要维持复杂的链接状态表)③面向报文(不对应用程序提交的报文信息进行拆分或合并,仅仅添加报头...

2019-09-15 13:15:25 243

原创 SpringIOC容器源码分析(二)启动过程分析——准备工作

参考自:https://javadoop.com/post/spring-ioc接下来就步入正题,正式进入源码跟着代码调试走食用效果更佳第一步,也就是从ClassPathXmlApplicationContext说起:public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext { ...

2019-09-15 12:08:12 92

原创 SpringIOC容器源码分析(一)ApplicationContext概述

原文参考:https://javadoop.com/post/spring-ioc首先是一个最基本的启动Spring容器的例子:public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationfil...

2019-09-15 10:22:27 119

原创 TCP的四次挥手

数据传输完毕后,双方都可释放连接,最开始时,客户端和服务器都处于ESTABLISHED状态,这里假设由客户端主动关闭,服务器被动关闭第一次挥手:客户端进程发出释放连接报文(FIN=1,序列号seq=u,u=之前传送过来的数据最后一个字节的序号+1),并且停止发送数据。此时,客户端进入FIN-WAIT-1状态。第二次挥手:服务端收到来自客户端的释放连接报文后,向客户端发送确认响应报文(AC...

2019-09-14 13:43:52 120

原创 TCP三次握手目的及流程

三次握手的目的是为了建立可靠的通信连接,而通信简单来说就是数据的发送与接收,三次握手最根本的目的就是确认双方的发送与接收能力是否正常。第一次握手:客户端发送给服务端报文信息。客户端发送同步序号SYN=1,随机产生sql number=x的数据包到服务端,服务端由SYN=1知道客户端要求建立联机。第二次握手:服务器发送给客户端报文信息。服务端收到请求后要求确认联机信息,向客户端发送SYN=...

2019-09-13 12:01:59 2483

原创 JVM核心之类加载器

类加载器的作用将class字节码加载到内存,并将这些静态数据转换成方法区中的运行时数据结构,同时在堆中生成一个该类的java.lang.Class对象,用于访问方法区中的运行时数据结构。类缓存一旦某个类被加载到类加载器,它将维持加载一段时间,这也就是类缓存。若没有缓存机制,同一个类每次主动引用时都需要重新加载,太消耗时间和资源。*JVM垃圾回收器可以回收这些Class对象。类加载器层次结...

2019-09-11 17:49:47 125

原创 JVM核心之类加载机制

类加载全过程JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以直接执行的二进制机器码:①加载:其本质是将.class字节码加载到内存,其字节码的来源可以是各种形式,例如:本地的字节码,通过网络获取的字节码(例如通过leetCode在线编译获取字节码),jar包等。加载后再将这些二进制静态字节码数据转换为方法区中的运行时数据结构,同时在堆中生成一个代表这个类的jav...

2019-09-11 11:48:38 106

原创 Java动态性之反射机制

动态语言:程序运行时,可以改变程序的结构或变量的类型Java不是动态语言,但是可以利用反射机制,字节码操作获得类似动态语言的特性。Java反射机制 reflection:程序在运行时依然可以加载,探知,使用编译期完全未知的类。程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用其任意一个方法和属性。Clas...

2019-09-10 21:21:51 163

原创 JavaGuide集合汇总

一 ,List Set Map三者的区别List(注重有序):List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象。Set(注重独一无二):不允许重复的集合,不会有多个元素引用相同的对象。Map(注重key-value):使用键值对进行存储。Map会维护与Key有关联的value,两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何...

2019-09-06 16:27:22 4454

原创 Java Guide 基础面试题

1. 面向对象和面向过程的区别面向过程:面向过程的性能比面向对象是要高的,虽然面向过程也需要分配内存,计算内存偏移量,但是面向对象类调用时的实例化开销更大,更消耗资源。面向对象:因为面向对象存在封装,继承,多态的特性,所以面向对象易扩展,易维护,易复用,但是性能相较于面向过程要低一些。而Java性能差的根本原因是java是半编译语言,最终的执行代码不是可以直接被cpu运行的二进制机械码,而大...

2019-09-04 14:49:23 1563

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除