![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
文章平均质量分 85
2NaCl
主攻Java后端开发与云计算Paas平台、离线大数据平台相关
展开
-
Java校招面试知识点总结
文章目录操作系统SQLRedisJVMGC线程锁类库网络Spring面试题自我总结操作系统1.操作系统概览2.进程管理之进程实体3.五状态模型4.进程管理之进程同步5.进程调度6.死锁7.内存分配与回收8.段页式存储管理9.虚拟内存10.Linux存储管理11.操作系统的文件管理12.操作系统的设备管理13.线程同步之互斥锁14.线程同步之自旋锁15.线程同步之读写...原创 2020-02-02 01:33:51 · 2312 阅读 · 3 评论 -
剑指Offer(网络)——TCP和UDP的区别
之前仔细的介绍了一下TCP协议,链接:https://blog.csdn.net/qq_41936805/article/details/103441134然后接下来再来介绍一下UDP协议,也是从UDP的报文结构开始说起,相对于TCP,UDP的报文结构简单了很多:由源端口,目标端口,数据包长度和奇偶校验值和用户数据组成。由于其简单的结构,也意味着它少了很多TCP的功能,其中有:不支持错误...原创 2019-12-11 22:33:44 · 298 阅读 · 0 评论 -
剑指Offer(Spring)——Spring AOP
AOP——面向切面编程在软件工程方面有一个重要的概念:即关注点分离:不同的问题交给不同的部分去解决。AOP就是一种关注点分离的技术,比如我们在写一个Javaweb,需要写缓存,业务逻辑,日志,出错处理等等东西都要混在一起,于是为了将业务的各个功能分离开,就有了所谓的切面(Aspect)。当业务功能代码和切面代码分开之后,架构就会变得高内聚低耦合。但是在这个基础上,我们又知道,如果模块化之后...原创 2019-12-11 00:36:32 · 500 阅读 · 0 评论 -
剑指Offer(Spring)——SpringIOC容器
也是先来说一下容器内部的运行原理当Spring启动的时候读取应用程序提供的bean配置信息并在Spring容器中生成一份相应的bean配置注册表,然后根据这张注册表去实例化bean,装配好bean之间的依赖关系之后,为上层提供准备就绪的运行环境,Spring提供一个配置文件描述bean和bean之间的依赖关系,利于java语言的反射功能实例化bean,并且建立bean之间的依赖关系。Spri...原创 2019-12-10 23:29:51 · 375 阅读 · 2 评论 -
剑指Offer(Spring)——SpringIOC原理
首先咱们先来了解一下什么是IOC(Inversion of Control)IOC(Inversion of Control):控制反转。它是Spring最核心的部分,也是任意组件的基本,但是,这并不算是一种技术,而是一种思想,它可以让你从繁琐的对象嵌套中解锁出来,更进一步突出面向对象,但是在了解IOC之前,我们应该先来了解一下Dependency Inversion,也就是依赖注入。给依赖注...原创 2019-12-09 22:51:22 · 386 阅读 · 0 评论 -
剑指Offer(网络)——TCP协议的四次挥手原理详解
这里是TCP协议三次握手的笔记:https://blog.csdn.net/qq_41936805/article/details/103441134所谓挥手,就是指的终止连接,TCP的四次挥手流程图如下:这个行为,由客户端或者服务端任意一着触发close来触发,这里我们假设由客户端触发close当数据传输完毕之后,双方才可以释放连接。最开始的时候,客户端和服务端都处于Estab...原创 2019-12-08 12:47:01 · 321 阅读 · 0 评论 -
剑指Offer(网络)——TCP协议的三次握手原理详解
首先我们先来简单介绍一下传输控制协议TCPTCP协议是面向连接的、可靠的、基于字节流的传输层通信协议。当数据传输的时候,应用层向TCP发送数据流,然后TCP会将应用层的数据流分割成报文段并发送给目标节点的TCP层。而TCP为了保证不丢包,就给每一个包一个序号(Sequence Number),同时序号也保证了,对方接受数据的时候顺序是一定的。然后当对方收到数据的时候,就会回...原创 2019-12-08 02:13:35 · 546 阅读 · 0 评论 -
剑指Offer(类库)——JavaIO机制
在这篇文章总结完之后,就会进入Spring面试题整理和计算机网络面试题整理了,不知不觉还是挺快的。这篇文章将主要介绍BIO、NIO、AIOBlock-IO:基于字节流的InputStream和OutputStream,基于字符流的Reader和Writer,同时也包括Socket那些java.net包下的类等等。BIO的属性是同步阻塞的,优点就是写起来简单,缺点就是效率太低了NonBlo...原创 2019-12-07 13:10:59 · 237 阅读 · 0 评论 -
剑指Offer(类库)——JUC包的知识梳理
首先来展示一张JUC包下包与类的框图其中,JUC下共有这么几个大包:线程执行器executor锁locks原子变量类atomic并发工具类tools并发集合collections针对上面几个JUC的大包,之前已经介绍过了一部分的并发集合和Executor线程执行类了。下面对其他几个包进行一下概述:1. Tools首先我们来看看并发工具类Tools,主要提一些面试中经常会问...原创 2019-12-07 12:13:56 · 422 阅读 · 0 评论 -
剑指Offer(类库)——HashMap、HashTable、ConcurrentHashMap底层源码详解
Map是由一对对的Key-Value组成的,key要求唯一,value无所谓。我们可以针对这点直接看源码;key自带去重功能,因为是Set类型的。value则只是Collection接口,可以存放任意集合。下面来看看map的一些实现类下面,来解决一道非常重要的面试题:HashMap,HashTable,ConcurrentHashMap有什么区别?1.HashMap首先来介绍一...原创 2019-12-07 00:24:05 · 295 阅读 · 0 评论 -
剑指Offer(类库)——Java集合框架
我们在学习编程语言的时候,数据结构和算法是学习的必备知识,是很重要的知识,C语言尤其能体现出这些数据结构所附带的特点,而Java语言比C语言在使用起来更加简单,因为已经将它们封装到了集合框架中。数据结构的考点如下:数组和链表的区别链表的反转,链表环路检测,双向,循环链表队列栈的应用二叉树的遍历红黑树的旋转算法的考点如下:内部排序(递归,冒泡,快排,选择,插入)外部排序(应...原创 2019-12-06 21:15:17 · 196 阅读 · 0 评论 -
剑指Offer(类库)——Java异常体系
在java的异常处理机制中,主要回答了三个问题What:异常类型回答了什么被抛出。Where:异常堆栈跟踪回答了在哪抛出。Why:异常信息回答了为什么被抛出。下面来主要回答一下面试的时候热点的问题:Error和Exception的区别是什么Java的异常体系如下:其中:Error:一般是指与JVM相关的问题,比如说系统崩溃,也就是说是程序无法处理的系统错误如堆栈溢出,内存...原创 2019-12-06 19:26:40 · 142 阅读 · 0 评论 -
剑指Offer(锁)——Java线程池
在Web开发中,服务器需要接受并且处理请求,所以会为一个请求分配一个线程去处理,如果并发的请求数量很大,但是请求的时间很短,那么就会频繁的创建和销毁线程,造成额外的CPU隐患,如此一来,会大大降低系统的效率。为了解决上述的问题,于是我们可以利用Executors创建不同的线程池满足不同场景的需求,目前这个类提供了五种创建线程池的方法:...原创 2019-12-06 00:29:55 · 193 阅读 · 0 评论 -
剑指Offer(锁)——CAS(Compare and Swap)
这是一种高效实现线程安全性的方法它支持原子更新操作,适用于计数器,序列发生器等场景。属于乐观锁机制,号称lock-free(无锁),但是实际上还是有一些底层锁的。CAS操作失败的时候,是由开发者决定是继续尝试还是执行别的操作。CAS操作的思想它包含三个操作数——内存位置(V)、预期原值(A),和新值(B)。在比较的时候,由内存位置和预期原值去进行对比,如果是相同的,就会将内存位置的...原创 2019-12-05 01:04:40 · 162 阅读 · 0 评论 -
剑指Offer(锁)——JMM内存模型
首先来介绍一下Java内存模型JMMJava内存模型(即Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。我们可以从这张图来解释一下:线程内的变量都是存在栈中的,而这些变量被称作线程的私有变量,是存储在线程的工作内存的。JMM要求,...原创 2019-12-04 16:59:15 · 177 阅读 · 0 评论 -
剑指Offer(锁)——Synchronized与ReentrantLock的区别
https://blog.csdn.net/qq_41936805/article/details/94905395可参考我的这篇文章原创 2019-12-04 10:36:05 · 162 阅读 · 0 评论 -
剑指Offer(锁)——synchronized的底层实现原理
首先来说说实现synchronized的基础:Java对象头Monitor然后接下来就对这二者进行详细的讲解。Hospot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据、对齐填充。这里主要来说说对象头。对象头的结构如下:Mark Word然后再来介绍一下Monitor,Monitor是每一个Java对象都天生携带的一把锁,只不过这把锁是一把看不见的锁。被称作...原创 2019-12-04 10:33:44 · 223 阅读 · 0 评论 -
剑指Offer(锁)——synchronized的基本使用方法
到了并发模块,就不得不介绍一下Synchronized和ReentrantLock等等方面,锁的知识。针对于互斥锁,我们先来介绍一下引发线程安全问题的主要诱因是什么?存在共享数据(也称临界资源)。存在多条线程共同操作共享数据。而解决上面提到的问题的解决方法就是:同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再对共享数据进行操作。为了能让我们的解决方法得以实...原创 2019-12-04 00:12:44 · 277 阅读 · 0 评论 -
剑指Offer(线程)——如何中断线程
以前的时候,我们可以使用stop来停止线程,但是这种写法很不安全,因为可以通过一个线程影响到另一个线程,让线程本应该满足的原子性,有无法满足的可能了,而且假如,线程A调用stop,停止了线程B,由于一般情况下,我们的线程是不会进行通信的,这就会让线程B释放或许还有用的锁,这就会导致数据不同步。所以我们目前都会使用interrupt,它的用处其实也不是中断线程,而是通知线程应该去中断了,但是最后...原创 2019-12-03 00:01:40 · 127 阅读 · 0 评论 -
剑指Offer(线程)——sleep和wait的区别以及notify和notifyAll的区别
sleep与wait我们可以从源码看出基本的差别:sleep是Thread下面的一个方法,而wait是Object下面的一个方法sleep()方法可以在任何地方使用。wait()方法只能在synchronized方法或者synchronized块中使用。但它们本质上的区别则在于:Thread.sleep只会让出CPU,但是不会导致锁行为的改变。Object.wait不仅让出...原创 2019-12-02 23:06:26 · 234 阅读 · 0 评论 -
剑指Offer(线程)——线程的六种状态及开启方法
如果我们想知道线程的状态,就可以来到java源码Thread.State中看见线程的状态了:public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread s...原创 2019-12-02 22:37:42 · 137 阅读 · 0 评论 -
剑指Offer(线程)——如何处理线程的返回值
我们知道,run方法是一个Thread内部类的重写方法,没有参数的导入,也没有返回值的设定。但我们若是想要实现在run方法内进行传参,一共有三种方法:构造函数传参成员变量传参回调函数传参...原创 2019-12-02 21:53:24 · 203 阅读 · 0 评论 -
剑指Offer(线程)——Thread和Runnable是什么关系
从本质上来说,Thread是jdk的一个类,而Runnable是一个interface。而Thread内部又实现了Runnable接口。我们同样也是写一个Demo。首先把线程执行的内容写出来(单纯的10次循环,打印执行此任务的线程名):然后创建三个线程去执行这个任务,执行如下我们可以发现,在多线程的情况下,线程之间是保持原子性的,互相都不会依赖,自己干自己的,所以也就不会因为先执行一个...原创 2019-12-01 14:38:59 · 277 阅读 · 0 评论 -
剑指Offer(线程)——Thread中start方法和run方法的区别
首先我们先来写一个程序,看看运行的结果先使用run方法:输出为:可以看出,不管是主方法还是其他的方法,在run方法下执行的线程都是用主线程去执行。而start方法:我们可以看出,线程被切换了,不是主线程去执行非main的方法了:原理如下总结:1. 调用start方法会创建一个新的子线程并且启动。2. run方法只是一个Thread普通方法的调用。...原创 2019-12-01 14:19:44 · 268 阅读 · 0 评论 -
剑指Offer(GC)——面试题
Object的finalize()方法是否与C++的析构函数是一样的答案是不同的,因为析构函数的调用是确定的,而finalize是不确定的,假如一个java的方法,经历过第一次可达性分析的时候,发现并没有和GC ROOTS相连,那么就会去判断是否被finalize覆盖,如果是,就会被放进F-Queue队列中,最后由JVM的finalize去回收这个方法。缺点就是finalize覆盖的方法随时...原创 2019-12-01 02:56:14 · 215 阅读 · 0 评论 -
剑指Offer(GC)——常见的老年代垃圾收集器(Full GC)
还是先把这张图放上,然后再对于老年代这几个垃圾收集器逐一讲解。Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)它是Serial GC的老年代版本,同样也是单线程的,进行垃圾收集的时候,必须暂停所有工作的线程,同样也是简单高效,适用于Client模式下默认的老年代垃圾收集器。Parallel Old 收集器(-XX:+UseParallelOldG...原创 2019-11-30 12:18:24 · 801 阅读 · 0 评论 -
剑指Offer(GC)——常见的新生代垃圾收集器(Minor GC)
在了解新生代收集器之前我们首先要了解一下 Stop-the-World什么是Stop-The-World呢?JVM由于要执行GC而停止了应用程序的执行任何一种GC算法都会发生多数GC优化都是通过减少Stop-the-World发生的时间来提高程序的性能...原创 2019-11-30 11:19:55 · 509 阅读 · 0 评论 -
剑指Offer(GC)——垃圾回收之回收算法
先来介绍几种经典的回收算法:标记-清除算法(Mark and Sweep)如同名字,将回收分成两个阶段:标记和清除,使用的算法主要是可达性算法。标记:从根集合进行扫描,对存活的对象进行标记。清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存。可达性算法就不多说了,从图中来看,当我们回收了一些区域块的时候,...原创 2019-11-30 01:09:55 · 209 阅读 · 0 评论 -
剑指Offer(GC)——垃圾回收之标记算法
首先我们来解释一下,在什么情况下Java对象会被判定为垃圾?当没有被其他对象所引用的情况下,该对象就是没用的。解释起来还是很简单的,那么,判断java对象为垃圾的算法又是什么呢?引用计数算法可达性分析算法引用计数算法说白了就是通过判断对象的引用数量来决定对象是否可以被回收,每个对象实例都有一个引用计数器,如果被引用了就+1,当完成引用了之后就-1,说白了就是对于方法,栈帧入栈了...原创 2019-11-29 00:13:26 · 195 阅读 · 0 评论 -
剑指Offer(JVM)——Java内存模型相关常考题
JVM三大性能调优参数 -Xms -Xmx -Xss的含义?-Xss:规定了每个线程虚拟机栈(堆栈)的大小,一般来说,256K就足够了。-Xss的大小会影响并发线程数的大小。-Xms:堆刚被创建出来的时候的初始大小。-Xmx:指堆的内存在不够的时候,会进行扩容,-Xmx是堆能扩展到的最大值。但我们通常将-Xms和-Xmx的大小设置成一样的,因为当堆扩容的时候会发生内存抖动,影响程序...原创 2019-11-28 23:12:47 · 202 阅读 · 0 评论 -
剑指Offer(JVM)——Java内存模型解析
在开始讲java内存模型之前,首先我们先来了解一下关于内存方面的介绍:在我们的程序执行中,需要不断的根据逻辑地址和物理地址之间进行映射,找到指令具体执行的位置。Java程序运行在虚拟机之上,运行的时候也是需要内存空间的,在执行java程序的过程中,JVM内部会将整个jvm划分成为不同的数据区域去管理。我们都知道,c的编译器会在划分内存区域的时候,经常将管理的区域划分成数据段和代码段。数据段...原创 2019-11-28 08:29:18 · 200 阅读 · 0 评论 -
剑指Offer(JVM)——loadClass和forName的区别
在讲这两个方法之前,我先说一下,类的加载方式。一个类被加载出来,是有两种方式的,分为隐式加载和显式加载:隐式加载:new显式加载:loadClass,forName等隐式加载就不多说明了,通过new一个class来获得到类的实例,并且相对于显式加载更优秀的地方是,可以直接调用有参构造;但是显式调用的原理则不是这么简单的,当我们获取到class对象之后,需要调用class对象的...原创 2019-11-27 20:03:39 · 199 阅读 · 0 评论 -
剑指Offer(JVM)——ClassLoader的双亲委派机制
从之前的文章我们体会到,不同的类加载器对于类和路径的加载方式是有所不同的,并且各自负责各自的区块,使得逻辑更加的明确,但是这相互的协调工作,如果我们没有一定的方法,就会造成一定的问题,于是就有了双亲委派机制,能够让这些类加载器各司其职,互不干扰。首先我们可以来看看双亲委派机制的原理框图然后我来解释一下这张图,在类被加载的时候,是自底向上去执行的,考量是否以前被加载过,如果加载过,直接返回...原创 2019-11-25 23:26:44 · 163 阅读 · 0 评论 -
剑指Offer(JVM)——java类加载机制ClassLoader
这篇文章,我们主要来说说类从编译到执行的过程,假设我们有一个普普通通的类,名字叫做Robot.java从我们编译这个类,到执行的这一段时间里,Robot一共执行了以下几个阶段:编译器将Robot.java源文件编译为Robot.class字节码文件ClassLoader将字节码转换为JVM中的Class<Robot> 对象JVM利用Class<Robot>对象实例...原创 2019-11-25 22:52:51 · 232 阅读 · 0 评论 -
剑指Offer(JVM)——反射(Reflect)
java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象的功能称为java语言的反射机制。...原创 2019-11-24 22:55:54 · 224 阅读 · 0 评论 -
剑指Offer(redis)——Redis的集群管理
我们该如何从海量数据中快速找到所需呢?分片:按照规则去划分数据,分散存储在多个节点上,我们可以通过使用分片,降低单节点的压力。并且redis cluster采用无中心结构,节点之间使用Gossip协议发送信息,或者发现新的节点,既然redis的目的是将key分布式的放在不同的节点上,那是怎么实现的呢?通常情况下,我们会获取到key的哈希值,根据节点数求mod,但是这有一个弊端,那就是我们无法...原创 2019-11-24 00:05:21 · 167 阅读 · 0 评论 -
剑指Offer(redis)——Pipeline及主从分布原理和哨兵模式讲解
pipeline倘若我们使用Redis进行批量生产数据,然后存入缓存,通常情况下,我们理解的是,上一条缓存,存完了之后才轮到下一个存储指令的执行。这样势必会让Redis的性能降低,而实际上Redis也针对此进行了一定的优化,而优化的方法,也就是关于Redis针对Pipeline的使用:pipeline和linux的管道类似pipeline批量执行指令,节省多次IO往返的时间有顺...原创 2019-11-23 22:19:14 · 315 阅读 · 0 评论 -
剑指Offer(redis)——Redis如何做持久化
我们都知道,Redis是一种内存存储,所以可以保证查询速度极其快,但也正是因为内存数据库,所以导致,如果一旦断电宕机,就会立刻失去所有的缓存,在企业是很危险的。于是就有了Redis的持久化策略,将缓存信息,边存,边写入到硬盘上,保证数据的存储是完全的。下面就来介绍几种Redis保证持久化的具体实现。1.RDB(快照)持久化首先是RDB实现缓存持久化,它能保存某个时间点的全量数据快照。...原创 2019-11-23 15:07:33 · 236 阅读 · 0 评论 -
剑指Offer(redis)——如何使用redis实现异步队列
我们可以使用redis的list作为数据类型,使用RPush生产消息,LPOP消费信息,其数据结构,和队列是一样的,先进先出。案例如下:当没有队列消息的时候,就自然的return nil了。这样写的缺点是:没有等待队列里有值就直接消费。而对这个缺点的弥补就是:可以通过在service层引入sleep机制去调用lpop去重试,并且不用sleep,也有另外一种解决措施:使用blpop + 阻塞...原创 2019-11-23 01:20:27 · 229 阅读 · 0 评论 -
剑指Offer(redis)——使用Redis实现分布式锁
分布式锁,是控制分布式系统或者不同系统之间共同访问共享资源的一种锁的实现,当我们的不同主机共享了某一种资源的时候往往通过互斥来除去彼此的干扰,来保证一致性。互斥性...原创 2019-11-22 23:58:21 · 204 阅读 · 0 评论