自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 类加载机制

概念当程序需要用到某一个类时,如果这个类没有加载到内存中,那么JVM会通过加载、链接、初始化这三个步骤来实现类的初始化。过程加载加载是指通过类的全限定名找到类的class文件,然后将该文件的二进制字节流读入内存,生成java.lang.Class实例对象。类被加载到内存中,会生成两部分,一部分是class文件的内容,一部分是class类的对象,这个对象指向这些内容。链接链接包括三部分,验证、准备、解析。验证验证阶段主要是验证被加载进来的类的内部结构是否符合规范,主要包括文件格式验证,元

2021-02-06 11:12:07 130

原创 并发之锁的优化

锁优化1、减少锁的持有时间public synchronized void test(){ needLock(); dontNeedLock();}改成public void test(){ synchronized needLock(); dnotNeedLock();}2、降低锁的粒度将大对象拆分成小对象,对小对象进行加锁,降低锁的粒度,使得偏向锁和轻量级锁使用率提高。比如对于hashmap的锁,使用concurrenthashmap的锁的粒度就比Collections.sy

2021-02-06 11:11:29 176 1

原创 阻塞队列

阻塞队列1、概念阻塞队列就是一个队列,它有两种形式,一种是先进先出的形式,一种是后进先出的形式,即处理最近发生的事情。2、作用在多线程中,队列可以实现数据共享,它类似消费者生产者模式。一般情况下,会有多个线程用于生产数据,线程将这些数据存放到队列中,由多个线程来消费这些数据。在阻塞队列出现之前,由于生产者的生产速度大于消费者的话,生产者线程就会挂起阻塞,等待消费者去消费这些数据,反之亦然,这个要是由程序员来控制的话是十分麻烦的,所以concurrent包出现解决了这个问题。当队列被塞满时,生产者线

2021-02-03 17:34:16 146 1

原创 多路复用IO之select、poll、epoll

select在多路复用IO中,select函数负责轮训的检查是否有就绪的socket,然后将socket中的数据写入缓冲区,并通知用户线程进行读写操作。select的缺点就是:1、单个进程可以监视的fd(文件描述符)是有限的,FD_SETSIZE:32位系统中默认是1024,64位系统中默认是2048。2、采用轮训的方式对socket进行扫描,当socket较多时,它不知道哪个是就绪的,它就会去扫描所有的socket,这样子效率是很低的。pollpoll和select差不多,它将用户传入的数组复

2021-02-03 16:59:21 223

原创 JAVA对象探索

对象的创建第一步当JAVA虚拟机遇到一条new字节码指令时,首先去检查这个指令的参数是否能在常量池中找到它的符号引用,并检查这个符号引用的类是否已经被加载、解析和初始化过,如果没有,则先执行类的加载过程,再创建对象。第二步在类加载检查通过后,虚拟机就给新生的对象分配内存。对象所需的内存大小,在类加载的过程中就已经完全确定了。对象的内存空间分配实际上就是将一小块内存从堆内存划分出来。分配方式1、指针碰撞假设JAVA堆的内存是绝对规整的,就是说被使用的内存划分到一边,空闲的内存划分到另一边,然后

2021-02-02 20:09:16 119 2

原创 Node.JS学习总结

模块定义模块/*定义模块暴露模块*/// 第一种function getValue(value){ return value;}exports.getValue=getValue;// 第二种exports.getValue=function(value){ return value;}// 第三种var func={ get:function(){ return "获取数据"; } post:function(val){ return "提交了数据"+va

2020-11-29 14:44:03 509

原创 BIO、NIO、多路复用IO、AIO

BIO阻塞IO,当用户发送一个请求时,系统还没有准备好数据的话,就会处于一个阻塞状态,一直等待数据准备好返回给用户之后,才能再发送下一个请求。图解如下NIO非阻塞IO,当用户发送一个请求时,系统还没有准备好数据的话,立马返回数据还没准备好的消息,然后用户继续发送同一请求,直到接收到准备好的数据为止。图解如下多路复用IO异步阻塞IO,redis就是使用这种IO模型,当用于发送一个请求时,系统还没有准备好数据的话,系统会对用户的这个请求进行标记,用户会对这个请求进行监听。用户可以发送多个其他

2020-10-21 11:14:45 152

原创 强、软、弱、虚引用

强引用代码public static void main(String[] args){ Demo d=new Demo(); d=null; System.gc();}解析这里的d就是一个强引用,new Demo()在内存中分配了一块内存,d指向这个内存。当d变为null时,就被系统回收。软引用代码public static void main(String[] args){ // 创建一个SoftReference对象,一个10m的字节数组。 // sr对于SoftRefer

2020-10-20 18:00:09 81

原创 Cookie和Session

定义与区别Cookiecookie是客户端用于存储相关数据的文本文档,它保存在客户端浏览器上,由于cookie在浏览器可以看到,所以比较不安全,而且能存储的数据量较小,它常用于存储一些安全性要求不高的信息。Sessionsession中的数据都保存在服务器上,所以相对来说比较安全,而且存储数据量也比较多,但是当session请求过多时,对系统的压力也是很大的,session用于存储一些安全性要求较高的信息。session的唯一识别是sessionID,它存储于cookie中。Tomcat中,ses

2020-10-20 17:30:43 86

原创 HTTP协议

概念http协议是基于TCP/IP协议的一个应用层协议。它是无状态且无连接的。无状态: http不保存客户端的任何行为,也不保存客户端的任何数据,每一新的请求,它都会有新的响应,减少服务器的消耗。无连接: http每次连接只处理一个请求,请求处理完就断开连接,而不是持续连接持续处理请求。http请求报文: 请求行(请求方法+url)、请求头、请求体。http响应报文: 响应行(http版本号+http状态码)、响应头、响应体。方法1、post:请求的参数不会在地址栏显示,比较安全且传输的数据

2020-10-20 15:53:45 163

原创 JAVA基础

JAVA三大特性:多态、继承、封装。构造方法是方法名必须和类名一致,且构造方法不被void修饰,没有返回值和返回类型,一个类可以有多个构造方法,若没声明构造方法,则JAVA编译器会提供一个默认的构造方法。创建对象的四种方式:采用new关键字创建、采用反射机制创建、采用反序列化机制创建、采用clone()方式创建。源文件一个源文件只能有一个public类但是可以有多个非public类;源文件名称必须跟public类的名字一致;如果源文件在某个包中,那么package语句必须在最前..

2020-10-09 18:02:27 140

原创 拥塞控制与滑动窗口机制

拥塞控制拥塞拥塞是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时可能会产生死锁。拥塞控制就是用来防止过多数据注入到网络中,防止网络性能下降。拥塞控制的方法1)慢开始+拥塞避免一开始拥塞窗口的值设置是1,代表传送一个TCP报文段。这时候使用的是慢开始算法,接收方回送一个TCP报文段,拥塞窗口值置为2。这时发送方就可以发送2个TCP报文段,当接收方回送两个TCP报文段时,拥塞窗口置为4,发送方就可以发送4个TCP报文段。。。

2020-10-06 00:03:10 739

原创 TCP与UDP

TCPTCP协议是一种可靠的、一对一的、面向连接的通信协议,面向字节流进行传输。在使用TCP协议进行数据传输时,往往需要服务器和客户端直接建立一对一的“通道”,这个通道只允许被该服务器和客户端使用。TCP中的标志ACK:用于通知对方自己已经接收到消息。当ACK等于1时,确认号字段有效。FIN:用于请求断开连接。SYN:用于建立连接时同步序号。当SYN=1,ACK=0时,表示请求连接报文,当SYN=1,ACK=1时,表示同意连接报文。URG:当URG=1时,表示这个报文是紧急报文,应尽快传送,不

2020-10-05 22:46:22 82

原创 TCP三次握手、四次挥手

三次握手过程1、客户端发送SYN包到服务器请求建立连接;2、服务器接收到这个请求,如果有足够的资源,就允许连接,并发一个SYN+ACK包给客户端,告诉客户端允许建立连接;3、客户端接收到服务器的SYN+ACK包后,发送一个ACK包给服务器,告诉服务器说我知道你允许建立连接了,这时才真正建立起连接。思考问题1、为什么得三次握手,而不是一次、两次呢?假如只有一次握手,服务器不知道客户端是否可以正常接收数据,客户端也不知道服务器能否正常接收数据,有可能造成服务器资源的浪费。假如只有两次握手,只

2020-10-05 16:18:06 133

原创 JVM运行时数据区——JDK1.7、JDK1.8

一、运行时数据区1、程序计数器程序计数器是一个较小的内存空间,是线程私有的且不发生OOM,它记录的是当前线程字节码指令的行号。由于JAVA虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,一个处理器只会执行一条线程中的指令。所以,为了线程切换时恢复到正确的位置执行,每个线程都有自己的一个程序计数器来记录字节码指令的行号。如果正在执行的是JAVA方法,则程序计数器的值为字节码指令的行号;如果是Native方法,则程序计数器的值为空。2、虚拟机栈虚拟机栈也是线程私有的,它的生命周

2020-10-03 17:13:24 616

原创 剑指Offer—求二叉搜索树第k小节点—简单

题目给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路由于是二叉搜索树,所以经过中序遍历之后,它就是一个有序的数组,将遍历后的结果放入ArrayList里面,通过list.get()方法获取即可。代码/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public

2020-10-01 17:19:23 77

原创 剑指Offer—两链表找共同点—简单

题目输入两个链表,找出它们的第一个公共结点。思路交替遍历:例如链表A:1->3->4->5->6,链表B:2->7->8->->9->5->6,当链表A遍历完,就指向链表B的头结点继续遍历;当链表B遍历完就指向链表A的头结点,这时他们就可以在同一个位置遍历了。代码/*public class ListNode {int val;ListNode next = null;ListNode(int val) { this.v

2020-09-29 17:39:47 94

原创 剑指Offer—判断链表是否有环—简单

题目判断链表是否有环?思路快慢指针法:一个较快指针和较慢指针,如果有环的话,他们必定会相遇。代码:/* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/public boolean hasCycle(ListNode head){ if(head==null) return fa

2020-09-29 16:14:00 73

原创 剑指Offer—子数组最大累计和—简单

题目给定一个数组arr,返回子数组的最大累加和。例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12。思路从第二个数开始,判断前几个数之和与当前数的大小,取较大的值给当前值。那么数组最后的那个值就是子数组最大累加和。代码public int maxsumofSubarray (int[] arr) { for(int i=1;i<arr.length;i++){ arr[i]=Math.max

2020-09-29 00:55:34 66

原创 剑指Offer—广度优先遍历数(分层)—中等

题目给定一个二叉树,返回该二叉树层序遍历的结果(从左到右,一层一层地遍历)例如:给定的二叉树是{3,9,20,#,#,15,7}思路使用队列1、第一次将3 offer进入队列,[3]。2、遍历队列,节点3出队列。判断节点3左右是否为空,不为空,进入队列,[9,20]。3、遍历队列,节点9出队列。判断节点9左右是否为空,不为空,进入队列,[15,7,20]。节点20出队列。判断节点20左右是否为空,为空,不做处理。4、遍历队列,节点15出队列。判断节点15左右是否为空,为空,不做处理。节点7出

2020-09-29 00:44:41 92

原创 剑指Offer—反转链表—简单

题目输入一个链表,反转链表后,输出新链表的表头。思路将原来的链表作为链表A,定义一个current节点,赋值为链表A的head,新建一个空节点newCode,定义一个n节点,赋值为head.next。操作: current指向空节点newCode,然后将空节点newCode的值赋值为current。接着current赋值为n。如果n不是null的话,才进行赋值。因为如果是null的话,下一循环时,current就没必要指向newCode了。流程图:代码/*public class List

2020-09-28 22:27:56 74

原创 剑指Offer—从尾到头打印链表—简单

题目输入一个链表的头,然后倒序输出链表,返回一个int[] 数组。思路倒序输出链表,可以利用栈的特点,先进后出原则,先把链表逐一放入栈中,然后在出栈,保存到int[]数组中。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */public int

2020-09-28 18:54:24 48

原创 剑指Offer—空格替换—简单

题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。思路对字符串进行空格替换,只需要调用replace方法即可。代码public String replaceSpace(String str){ return str.replace(" ","%20");}结果

2020-09-28 18:28:57 45

原创 剑指Offer—二维数组中的查找—中等

题目在一个n*m的二维数组中,每一行按照从左到右递增的顺序排序,每一列按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该整数。思路因为该二维数组有规律,我们可以先从右上角的数开始遍历,如果数值大于要找的数,则删除列,继续比较右上角的数;反之则删除行,继续比较右上角的数。代码public boolean findNumberIn2DArray(int[][] matrix, int target) { // matrix.length==0 代表是空

2020-09-28 18:17:02 50

原创 剑指Offer—找出数组重复的数—简单

题目给定一个数组,找出数组中第一个重复的数。思路利用Set的特性,set.add进入重复的数,就会返回一个false。代码public int findRepeatNumber(int[] nums){ Set<Integer> set=new HashSet<>(); int repeat=-1; for(Integer num:nums){ if(!set.add()){ repeat=num; break; } } return repe

2020-09-28 17:36:45 63

原创 Docker入门汇总

Docker入门一、Docker简介简单来说,Docker就是一个引擎,一个可以创建镜像的引擎。Docker分为三大部分,分别为镜像、容器、仓库。镜像:docker镜像就相当于一个模板,这个模板可以创建多个容器,比如,镜像是一个类,类有多个实例。容器:docker容器可以运行一个或者多个应用,它是通过镜像来创建的。一个docker容器就相当于一个小型的Linux系统,因为容器里面有些指令是被删除的,比如vim指令等。仓库:docker仓库是存放镜像的地方,比如DockerHub、阿里云镜像仓库。

2020-09-14 16:38:26 161

原创 SpringMVC执行流程简介

SpringMVC执行流程1、执行流程图2、过程描述用户发送一个请求,被前端控制器拦截。DispatcherServlet前端控制器将这个请求发送给HandlerMapping(处理器映射器),HandlerMapping根据注解和配置,对请求进行解析,找到执行这个请求的handler(可以看做是一个bean,代码中的controller的一个方法)并返回给前端控制器。前端控制器接收这个handler,将其发送给HandlerAdapter(处理器适配器)来执行这个handler。handl

2020-08-26 09:50:33 119

原创 HashMap详解

1、简介1、HashMap是由数组和链表组成的(jdk1.8之后加了红黑树)一个存储key/value的集合。其结构图如下:它的主干是数组,在查找某个值时,传入key值,通过hash函数一次性定位到数组部分中的某一个值,所以查找的时间复杂度为O(1),当查找的数在链表上时,则是O(n),所以为了提高HashMap的查找速度,我们应该尽量避免哈希冲突。2、HashMap的初始容量是16,容量必须是 2 的指数次幂。如果初始化设置为 13 ,那么会给你升级到 16,如果是7,那就会自动升级到8。2、

2020-06-12 03:14:50 968

原创 关于HashSet、HashTable、HashMap、ConcurrentHashMap

1、HashSet​HashSet实现的是set接口,它也是key/value的存储形式,由HashMap提供支持,但是它存储的是元素,这个元素的值不能为空,而且不能重复。也就是说,HashSet它add进去的值,是非空且唯一的,而且这个值是作为key存在于HashSet中,而value则是java内部指定的值,即 private static final Object PRESENT = new Object(); 这里的PRESENT就是它的value,这个值是统一的。 HashSet<St

2020-06-11 18:20:53 153

原创 浅谈volatile关键字

一、什么是volatile?volatile是Java中并发编程的一个重要的关键字,它有三个特点,分别是保证可见性、不保证原子性、禁止指令重排。二、为什么保证可见性?1、首先我们来看下面这段代码: static boolean flag=false; public static void createThread(){ new Thread(()->{ final boolean temp=flag; while (!fl

2020-05-21 14:57:57 392 1

空空如也

空空如也

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

TA关注的人

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