自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入理解垃圾回收机制及其实现原理

垃圾回收时机1.System.gc()显示调用System.gc():这个方法的调用是建议JVM进行FGC,只是建议,不是一定,但很多情况下它会触发FGC,从而增加FGC的频率2.JVM垃圾回收机制决定创建对象是分配内存空间,如果空间不足,会触发GC其他回收机制Object类的finalize(): 垃圾回收线程在回收垃圾之前,会先调用finalize()方法,设置一个可回收标志位,最后垃圾回收时,就把标记可回收的都回收掉,调用此方法不会造成对象的“死亡”3.垃圾回收策略 ------

2020-05-24 19:32:39 1362

原创 深入理解类加载

一、类加载的时机如果类没有进行初始化,就需要先对类进行初始化创建类的实例(new 操作)。访问某个类或者接口的静态变量,或者对静态变量赋值,调用类的静态方法 (类.XXX调用)反射初始化某个子类,则其父类也会被初始化Java虚拟机启动时被标明为启动类的类,直接使用java.exe命令来运行某个主类(运行main方法时,会先加载包含main的类)二、类的生命周期有7个阶段:加载、验证、准备、解析、初始化、使用和卸载类加载的全过程:加载、验证、准备、解析和初始化这5个阶段加载:通过一个类的

2020-05-24 11:23:38 225

原创 JDK内存模型

JDK 内存模型线程私有的内存区域:程序计数器:一个较小的内存区域,标识字节码代码行JVM虚拟机栈:方法执行时,会创建一个栈帧保存局部变量表,操作次数,动态链接,方法出口等信息1.会抛出栈溢出异常2.会抛出本地方法栈:...

2020-05-22 18:41:21 200

原创 http1.0/1.1/2.0区别

http1.0/1.1/2.0区别http1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而http1.1默认就是长连接,http是基于tcp/ip协议的,创建一个tcp连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响,因此要维持一个长连接,可以用一个长连接来发多个请求http1.1支持只发送请求头信息,如果服务器认为客户端有权限请求服务器,则返回101,否则返回401,客户端如果接收了100,才开始把请求体发送到服务器,这样当服务器返回40

2022-04-18 17:38:40 2660

原创 http与https的区别

第一点:http是以http开头,默认端口是80端口,https是以https开头,默认端口是443端口第二点:https比hhtp更安全,但http比https费资源,http运行在tcp协议之上,所有传输都是明文传输,并且不能确认对方身份,而https解决了这两个问题,https是运行在SSL协议之上,SSL协议是通过两个方式进行安全传输,首先是加密传输,目前据我了解有两种加密方式,一种是对称加密,一种是非对称加密,对称加密是指加密和解密的密钥是一样的,但是这种密钥的交换存在通信被监听的风险,密钥信息

2022-04-14 15:20:34 4151

原创 简述三次握手和四次挥手

简述 TCP 三次握手以及四次挥手的流程。为什么需要三次握手以及四次挥手?三次握手:首先发送端会发送一个SYN标记的数据包,目的是为了建立发送端到接收端的连接,发送端会进入SYN_send状态,接收端接收到数据包后会返回一个ACK响应以及SYN标记的数据包,目的是确认发送端到接收端的连接正常,建立接收端到发送端的连接,此时接收端进入SYN_RCVD状态,发送端收到数据包后,会返回ACK响应,目的是确认接收端到发送端的连接正常,此时发送端进入已建立连接状态, 由于TCP连接是双向连接,所以通过三次握手会建

2022-04-14 14:46:36 2582

原创 OSI七层模型与TCP/IP四层模型详解

七层模型:物理层:传输比特流,将比特流转化为电流强弱传输,到达目的地后,在转化为比特流数据链路层:数据帧的传送与识别,将比特数据组成桢,对帧解码,并根据帧中包含的信息吧数据发送到正确的接收方网络层:寻址和路由选择,要将数据传输到目标地址,目的地址可以使多个网络通过路由器连接而成的一个地址,要找到从发送方到接收方最佳的路径选择传输层:实现了端对端的传输会话层:负责建立和断开通信连接表示层:数据格式的转化,固有数据格式转换为网络标准格式应用层:为应用程序提供服务的TCP/IP四层模型:第一层:

2022-03-25 11:20:15 3512

原创 什么情况下会发生Full GC?

1.调用System.gc()时当调用System.gc()时,是建议JVM进行Full GC,只是建议,不是一定会发生,但一般情况下,JVM也会进行Full GC,进行Full GC时会让用户线程暂停执行,建议能不使用此方法就不使用,让虚拟机自己去管理它的内存2.老年代空间不够时老年代空间只有在新生代空间不足时,进入老年代空间或者创建了大对象时,才会出现空间不足的情况,当执行了Full GC后还是空间不足,就会抛出OOM,为了避免出现这种情况,我们尽量不要创建过大的对象或者数组3.方法区空间不够时

2020-10-14 16:57:03 4455

原创 Java中的栈和堆有什么不同?

从数据结构的方面来说:1.栈是一种先进先出的数据结构,而堆就是一种完全二叉树,有大顶堆,小顶堆从内存方面来说:1.栈是线程独享的区域,而堆是线程共享的区域2.栈里面保存的是局部变量、操作数栈等信息,而堆里面保存的是创建的对象信息3.一个方法的调用和退出就代表这一个栈帧的入栈和出栈,而堆里面的东西只能通过JVM来进行回收,堆里面又分为新生代和老年代,新生代又分为Eden区、S0区和S1区,比例是8:1:1,首先对象会在Eden进行分配内存,因为新生代的对象都具有朝生夕灭的特性,所以发生YGC的频率很

2020-10-12 16:28:54 208

原创 谈一谈HTTP协议

HTTP协议是超文本传输协议,用于客户端与服务器之间的通信,它是目前互联网上应用最为广泛的一种应用层协议,www都要遵守http协议,http协议规定:请求从客户端发出,最后服务器端响应 该请求并返回,就是说 先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应;http协议的请求报文是由:请求方法、请求URI、协议版本、请求首部字段和请求实体构成的http协议的响应报文是由:协议版本、状态码、原因短语、响应首部字段以及响应实体构成的http是无状态协议,就是自身不具备保存之前发送过.

2020-09-02 17:54:57 293

原创 测试

1. 什么是软件测试?软件测试 就是为了找BUG,为了让程序正常执行验证软件的功能是否满足客户的需求2. 测试、测开、开发测试开发就是编写单元测试框架和自动化测试框架测试是从用户的角度出发,整体实践,分析总结开发是编写功能代码3. 测试和调试的区别测试的任务是发现程序中的缺陷,调试的任务是 定位并且解决程序中的问题测试主要由测试人员和开发人员来执行,黑盒测试主要由测试人员完成,单元/集成测试主要由开发人员完成,调试是由开发人员完成测试贯穿整个项目周期,调试一般在开发阶段4. 测

2020-07-30 18:21:39 322

原创 网络

1. OSI 七层模型物理层:光电信号的传递数据链路层:数据帧的传送和识别网络层:路由管理和地址管理传输层:数据传输会话层:通信管理表示层:固有数据格式和标准数据格式的转换应用层:与应用程序的沟通2. TCP/IP 四/五层模型物理层:集线器数据链路层:交换机、无线LAN网络层:IP、ICMP、ARP传输层:TCP、UDP、SCTP、DCCP应用层:DNS、HTTP、FTP、SMTP3. 封装和分用封装类似发送快递包裹,从内到外打包分用类似拆快递包裹,从外到内拆应

2020-07-27 22:56:39 374

原创 多线程

1. 程序和进程、文件的区别?文件:本地磁盘中的资源程序:属于文件,是静态资源,但是是一种可执行的资源进程:通过程序运行,被操作系统管理的2. 操作系统的运行方式:单核CPU:采用的是时间片轮转调度的方式 并发多核CPU:在同一个时间点上,有多个进程同时运行 并行3. 进程的状态创建、就绪态、运行态、终止、阻塞态阻塞态不能直接转变为运行态4. 进程和线程进程是系统分配资源的最小单位线程是系统调度的最小单位一个进程内的线程是可以共享资源的...

2020-07-20 22:19:08 110

原创 集合

1. 什么是集合集合框架: 存储数据的一个容器集合框架是用于表示和操作集合而规定的一种体系结构他有三大块内容:接口、实现、算法接口:表示集合的抽象数据类型实现:接口的具体实现算法:API方法,比如排序、查找等等2.集合的特点存储对象 长度可变3. 集合和数组的区别数组是固定长度的,集合是可变长度的数组能存储基本数据类型和引用数据类型,集合只能存储引用类型数组存储的必须是同一类型,集合存储的对象可以是不同类型4. List、Set、Map三者之间的区别?List是一个存取顺序一

2020-06-17 23:30:20 416

原创 买卖股票的最佳时机 6种问题解答

这是一个动态规划的题目,所以我们首先要找的是 状态方程我们每天买卖股票都有3种选择:买、卖、没有操作我们这个问题有3个参数:天数、允许交易的次数、当天是否持有股票我们以 0 作为 未持有股票 ,1 作为 持有股票比如 a[3][1][0]:就表示 今天是第3天,我手上没有股票,至今最多交易1次a[5][2][1]:就表示 今天是第5天,我现在手上持有股票,至今最多交易两次下面我们来看一下状态方程:1.比如我们今天手里有股票,那这个股票有两个来源:1.我们前一天已经有股票了 2.我们.

2020-06-17 16:19:20 718

原创 常见的排序算法及其原理

1.直接插入排序1.1 原理整个区间被分为: 有序区间和无序区间每次选择无序区间的第一个元素,在有序区间内找个合适的位置插入1.2 实现依次查询public static void insertSort(int[] array){ for (int i = 1; i < array.length; i++) { // 有序区间: [0, i) // 无序区间: [i, array.length) int v = array[i];

2020-06-16 20:50:22 1099

原创 谈谈抽象类、接口以及两者的区别

抽象类如果一个方法没有实际工作,那就可以把它设计成一个抽象方法,抽象方法是使用abstract关键词修饰,仅有声明没有方法体的方法,包含抽象方法的类称为抽象类抽象类不能被实例化抽象方法不可以是private抽象类存在的意义就是被继承接口接口使抽象类的一种特殊形式,使用interface修饰接口中包含的方法只能是抽象方法,字段只能是静态常量接口和接口是继承,接口和类是实现接口表达的含义是 具有xxx特性接口和抽象类的区别结构组成:抽象类是普通类+抽象方法;接口是抽象方法+全局常量权限:

2020-06-14 23:02:32 132

原创 面试常客:谈谈你对封装、继承、多态的理解

封装封装就是把一个对象的属性是实现方式隐藏在类内部,不允许外部对象来访问内部的信息,但是可以提供方法来操作属性,就好像我们看不到空调内部的零件信息,但是却能使用遥控器控制空调Java提供了3个访问控制符:private、protected、public 还有一个是包访问权限(default)private(当前类访问权限):类内部可以访问,类外部不能访问default(当前包访问权限):类内部可以访问,同一个包中的类可以访问,其他类不能访问protected(子类访问权限):可以被同一包中其他类

2020-06-14 23:01:22 2301

原创 SE

1. Java和C++的区别?都是面相对象的语言,支持多态、封装、多态C++需要指针访问内存,Java不提供指针C++需要手动对垃圾进行回收,Java有自动垃圾回收C++有多重继承,而Java只是单继承C语言中的字符串都是以“\0”结尾,Java中没有2. 字符常量和字符串常量的区别?形式上:字符常量是用单引号引起的单个字符,字符串常量是用双引号引起的多个字符含义上:字符常量相当于一个整型值,可以参与表达式运算,字符串常量相当于是一个地址占内存大小上:字符常量只占两个字节,字符串常量占若干

2020-06-14 22:56:46 308

原创 餐馆

题目描述某餐馆有n张桌子,每张桌子有一个参数:a 可容纳的最大人数; 有m批客人,每批客人有两个参数:b人数,c预计消费金额。 在不允许拼桌的情况下,请实现一个算法选择其中一部分客人,使得总预计消费金额最大分析:先找出可以坐第i张桌子的客人如果下一位客人也可以坐的下,看这位客人消费金额有没有上一位客人高,如果这位客人消费金额高,那就让这位客人顶替上一位客人然后将每个桌子的消费金额相加,求出总营业额代码示例:import java.util.Arrays;import java.util.

2020-06-13 22:51:28 425

原创 树的子结构

题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)题目分析:先从二叉树A中寻找到二叉树B的根节点然后再从根节点往下递归查询它们的左右子树是否相同代码示例:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val

2020-06-13 19:31:31 133

原创 Spring框架

一. Spring简介1.1 什么是SpringSpring是一个Java企业级应用的开源框架。主要用来开发Java应用,Spring的用途不仅限于服务器端的开发。它是一个容器框架,用来装javaBean(java对象),Spring是一个轻重级的控制反转(IoC)和面向切面(AOP)的容器框架目的: 解决企业应用开发的复杂性1.2 Spring的好处基于 POJO的轻量级和最小侵入性编程通过依赖注入(DI)和面向接口实现松耦合基于切面(AOP)和惯例进行声明式编程通过切面和模板减少样式

2020-06-13 19:19:59 119

原创 深入理解多线程

1. CAS:Compare And Swap 比较并交换前提: 代码块执行速度非常快 使用synchronized时,线程间会竞争对象锁,失败后 会进入同步队列,线程就是在阻塞态<—>被唤醒之间来回切换 比较耗时目的: 保证效率很高的线程安全操作——使用较多的场景:对变量修改保证线程安全原理: 使用CAS 不造成线程阻塞(一直处于运行态)基于原始值+修改值 , 尝试修改操作,判断是否等于预期值,不满足就是不修改并返回false,满足则直接修改原始值:主存中变量真是的值修改值:拷

2020-06-07 12:10:41 150

原创 牛客:汽水瓶

题目描述有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?输入描述:输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小

2020-06-06 12:15:18 170

原创 牛客:统计回文

题目:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。例如:A = “aba”,B = “b”。这里有4种把B插入A的办法:在A的第一个字母之前: “baba” 不是回文在第一个字

2020-05-28 22:13:05 255

原创 单链表找环的入口点原理

找环的入口点原理找环的入口点 方法:1.定义两个引用fast和slow,fast一次两步走,slow一次一步走2.等到fast == slow时,将slow放到链表头节点,然后fast和slow一起一步走,下一次相遇就是环的入口点可是为什么fast和slow一起走,相遇就是环的入扣点呢?假设:由头结点到环的入口点距离为x,头结点到第一次相遇距离为y,链表总长度为n假设fast 和...

2020-04-19 20:29:53 305

原创 栈和队列

一.栈1.1 栈的概念栈就是一种特殊的线性表,只允许固定的一端进行插入和删除元素的操作,进行数据的插入删除操作的一端称为栈顶,另一端称为栈底 栈中的数据元素遵守 后进先出 LIFO的原则压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶出栈:栈的删除操作叫做出栈,出数据在栈顶1.2 实现用顺序表实现栈public class MyStack { private int...

2020-04-17 23:51:01 138

原创 网络

一.网络基础1.网络发展独立模式:计算机之间相互独立网络互联:多台计算机连接在一起,完成数据共享局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起广域网WAN:将远隔千里的计算机都连在一起2.认识“协议”协议就是一种约定计算机之间的传输媒介是光信号和电信号,通过“频率”和“强弱”来表示 0 和 1 这样的信息,要想传递各种不同的的信息,就需要约定好双方的数据格式3....

2020-04-15 23:01:30 308

原创 给定一个整数n,请返回n位的格雷码,顺序为从0开始

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。给定一个整数n,请返回n位的格雷码,顺序为从0开始。测试样例:1返回:[“0”,“1”]递归思想第n位的格雷码是由n-1位组成的通过对第n-1位格雷码加“0”和加“1”组成的比如:第1位就是“0”,“1”第2位就给第1位的首位加“...

2020-04-11 18:06:13 646

原创 多线程(3)

4.2.3 代码的重排序如果在单线程情况下,JVM和CPU指令集 都会对代码进行优化(重排序)重排序优化方案 会保证线程内代码执行的依赖关系4.3 线程安全使用 synchronized关键字synchronized 语法使用1.静态方法2.实例方法3.代码块synchronized(对象){ ....}// Java的一个类也是一个对象// 类名.class s...

2020-04-10 23:36:16 76

原创 多线程(2)

2.6 线程的中断中断一个线程interrupt() //实例方法测试当前线程是否中断interrupted() //静态方法isInterrupted() //实例方法以上方法,不是真实的直接中断线程,只是告诉某个线程,需要进行中断,具体是否要中断,由该线程自己来决定public class Interrupt { public static void test1() {...

2020-03-15 00:00:06 68

原创 从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7后序遍历从后往前遍历根节点在中序遍历中找到根...

2020-03-13 18:12:25 118

原创 从前序与中序遍历构造二叉树

从前序与中序遍历序列构造二叉树根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7前序先遍历根节点,根据根节点可以在中序里面找出根...

2020-03-13 17:48:49 154

原创 根据二叉树创建字符串

你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例 1:输入: 二叉树: [1,2,3,4] 1 / \ 2 3 / 4 输出: "1(2(4))(3)"解释: 原本将是“1(...

2020-03-09 22:08:43 139

原创 合并k个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6思路:两个两个组合,排序使用递归使用递归就要找截止条件(当节点为null)/** * Definition for s...

2020-03-09 21:57:45 90

原创 多线程(1)

多线程1.认识线程1.1概念进程是系统分配资源的最小单位线程是系统调度的最小单位一个进程内的线程之间是可以共享资源的每个进程内至少有一个线程存在,即主线程进程和线程的区别?1.进程是系统分配资源的最小单位2.线程是系统调度的最小单位3.一个进程中的各个线程之间共享 方法区(常量池)、堆线程也存在并发、并行代码1:public static void main(Stri...

2020-03-08 19:10:46 84

原创 操作系统与进程

一.操作系统概念任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。操作系统包括: 一款纯正的“搞管理”的软件内核:进程管理、内存管理、文件管理、驱动管理其他程序:比如 函数库、shell程序 等等操作系统的管理可以分为:硬件管理 和 软件管理也可以分为:一种对内的管理、一种对外业务进行管理二.进程2.1 认识进程对于操作系统来说,一个任务就是一个进程。文件、...

2020-03-08 16:49:51 284

原创 二叉树的前序遍历(递归及跌代)

递归方法一:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class PreOrder1 {...

2020-03-03 17:45:30 107

原创 异常

一.初识异常常见的异常有:除以0System.out.println(10/0);//运行结果java.lang.ArithmeticException:/by zero数组下标越界异常int[] arr = {1,2,3};System.out.println(arr[5]);//运行结果java.lang.ArrayIndexOutOfException:5访问nul...

2020-02-29 15:53:29 107

原创 String类

一.创建字符串常见构造String类的方式//方式1.String s1 = "Hello word";//方式2.String s2 = new String("Hello word");//方式3.char[] array = {'a','b','c'};String s3 = new String(array);注意:“hello”这样的字符串字面值常量,类型也是St...

2020-02-26 16:21:54 105

空空如也

空空如也

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

TA关注的人

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