数据结构与算法经典问题解析-Java语言描述 第三章 链表剑指 Offer 22. 链表中倒数第k个节点剑指 Offer 24. 反转链表141. 环形链表142. 环形链表 II160. 相交链表876. 链表的中间结点剑指 Offer 06. 从尾到头打印链表第三章 链表...
数据结构与算法经典问题解析-Java语言描述 第三章 链表剑指 Offer 22. 链表中倒数第k个节点剑指 Offer 24. 反转链表141. 环形链表142. 环形链表 II160. 相交链表876. 链表的中间结点剑指 Offer 06. 从尾到头打印链表第三章 链表...
Java秒杀 目录1 登陆模块注册:用户填写账号密码,点击注册前端使用一个固定的salt值拼接到密码上前端使用md5加密拼接后的密码把拼接加密后的内容发送给后端后端再随机生成一个salt值,再次拼接到密码上后端把密码和那个随机生成的salt值都存到数据库里登录:用户提交密码,前端使用一个固定的salt值拼接到密码上前端使用md5加密拼接后的密码把拼接加密后的内容发送...
SpringBoot 1 将SpringBoot打成war包(1)添加Tomcat依赖,去除Tomcat<!-- 设置tomcat在打包时去除--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-t...
代理模式-结构型 1 模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。通过引入一个新的对象(如小图片和远程代理 对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式...
框架面试 SpringSpring DI(IOC) 是什么?如何实现?Spring AOP是什么?使用场景?底层如何实现?项目里用到了AOP?为什么要使用aop,直接抽取方法封装起来不行吗?待定spring bean的生命周期,注入方式参考:https://www.cnblogs.com/youngao/p/12576719.htmlspringmvc执行流程Spring...
银行家算法 避免死锁同样属于事先预防的策略,但是并不是事先采取某种限制措施来破坏死锁的必要条件,而是在资源的动态分配过程中,防止系统进入不安全状态,以避免发生死锁。避免死锁这种方法对资源的分配限制条件较弱(相比于预防死锁),以期望获得更好的系统性能。 关于安全状态和不安全状态的概念,可以参看这篇博文。 银行家算法是我们的老朋友迪杰斯特拉为T.H.E系统设计的一种避免死锁产生的算法。该算法...
Hash算法总结 目录1 Hash函数2 Hash冲突3 一致性hashhash表1 hash函数地址index=H(key)即根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。1.1 hash函数的性质(1)输入域是无穷的,但是输出域是有限的(2)不是随机产生的输出,相同的输入一定对应相同的输出(3)不同的输入可能会导致相同的输出(hash碰撞)(4)输...
Hash函数相关 hash表1 hash函数地址index=H(key)即根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。1.1 hash函数的性质(1)输入域是无穷的,但是输出域是有限的(2)不是随机产生的输出,相同的输入一定对应相同的输出(3)不同的输入可能会导致相同的输出(hash碰撞)(4)输出的值在整个输出域几乎是均匀分布的(离散性)1.2 hash...
集合与多线程面试 集合Java中集合和数组的区别?一、集合和数组的区别区别1:数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值。集合只能存储引用数据类型(对象)。集合也能存储基本数据类型(有点矛盾,看后句),但是在存储的时候会自动装箱变成对象。区别2:数组长度是固定的,不能自动增长。集合的长度是可变的,可以根据元素的增长而增长。二、集合和...
算法题目 算法题LeetCode83. 删除排序链表中的重复元素LeetCode50. Pow(x, n)LeetCode103. 二叉树的锯齿形层次遍历LeetCode138. 复制带随机指针的链表LeetCode232. 用栈实现队列LeetCode104. 二叉树的最大深度LeetCode111. 二叉树的最小深度LeetCode344. 反转字符串Leet...
重点题目 LeetCode83. 删除排序链表中的重复元素给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。LeetCode695. 岛屿的最大面积最大岛问题(我想了个分治,思路不对,直接爆炸,面试官还是不错的,给我换了道题)编程题2:股票利润1(还要求写测试用例,要求跑通)编程题3:股票利润2(可以买卖多次)(这两题都秒了,面试前一晚正好想刷一刷dp的题,就刷了...
可能是全网最好的MySQL重要知识点 什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。事务...
MySQL的万字总结(缓存,索引,Explain,事务,redo日志等) 01 开局一张图这张图是重点!!!咱要先对MySQL有一个宏观的了解,知道他的执行流程。一条SQL语句过来的流程是什么样的?那就follow me。哈哈哈哈,皮一下很开心。1.当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。2.在正式查询之前,服...
Spring MVC 原理探秘 - 容器的创建过程 1.简介在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的。Spring MVC 可对外提供服务时,说明其已经处于了就绪状态。再次之前,Spring MVC 需要进行一系列的初始化操作。正所谓兵马未动,粮草先行。这些操作包括创建容器,加载 DispatcherServlet 中用到的各种组件等。本篇文章就来和大家讨论一下这些初始化操作中的容器创建操作,容...
Spring MVC 原理探秘 - 一个请求的旅行过程 1.简介在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章。为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一下 Spring MVC 的一些原理。在本篇文章中,你将会了解到 Spring MVC 处理请求的过程。同时,你也会了解到 Servlet 相关的知识。以及 Spring MVC 的核心 D...
Spring AOP 源码分析 - 拦截器链的执行过程 1.简介本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程。现在我们的得到了 bean 的代理对象,且通知也以合适的方式插在了目标方法的前后。接下来要做的事情,就是执行通知逻辑了。通知可能在目标方法前执行,也可能在目标方法后执行。具体的执行时机,取决于用户的配置...
Spring AOP 源码分析 - 创建代理对象 1.简介在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的。现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 bean 的某些方法前后。与筛选合适的通知器相比,创建代理对象的过程则要简单不少,本文所分析的源码不过100行,相对比较简单。在接下里的章节中,我将会首先向大家介绍一些背景知识,然后再去分析源...
Spring AOP 源码分析 - 筛选合适的通知器 1.简介从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor)。在上一篇AOP 源码分析导读一文中,我简单介绍了 AOP 中的一些术语及其对应的源码,部分术语和源码将会在本篇文章中出现。如果大家不熟悉这些术语和源码,不妨去...
Spring AOP 源码分析系列文章导读 1. 简介前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解。在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅读了 AOP 方面的源码。开始以为 AOP 部分的源码也会比较复杂,所以原计划投入一周的时间用于阅读源码。但在我大致理清 AOP 源码逻辑后,发现没想的那么复杂,所以目前进度算是超前了。从今...
Spring IOC 容器源码分析 - 余下的初始化工作 1. 简介本篇文章是“Spring IOC 容器源码分析”系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bean 做最后的初始化工作。相较于之前几篇文章所分析的源码,initializeBean 的源码相对比较简单,大家可以愉快的阅读。好了,其他的不多说了,我们直入主题吧。2. 源码分析本章我们来分析一下 in...
Spring IOC 容器源码分析 - 填充属性到 bean 原始对象 1. 简介本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的。我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反射创建一个原始的 bean 对象,然后再向这个原始的 bean 对象中填充属性。对于填充属性这个过程,简单点来说,JavaBean 的每个属性通常都有 getter/setter 方法,我们...
Spring IOC 容器源码分析 - 循环依赖的解决办法 1. 简介本文,我们来看一下 Spring 是如何解决循环依赖问题的。在本篇文章中,我会首先向大家介绍一下什么是循环依赖。然后,进入源码分析阶段。为了更好的说明 Spring 解决循环依赖的办法,我将会从获取 bean 的方法getBean(String)开始,把整个调用过程梳理一遍。梳理完后,再来详细分析源码。通过这几步的讲解,希望让大家能够弄懂什么是循环依赖,以及如何解循环依赖。...
Spring IOC 容器源码分析 - 创建原始 bean 对象 1. 简介本篇文章是上一篇文章(创建单例 bean 的过程)的延续。在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程。本篇文章,我们就从战术的层面上,详细分析doCreateBean方法中的一个重要的调用,即createBeanInstance方法。在本篇文章中,你将看到三种不同的构造 bean 对象的方式。你也会了解到构造 bean 对象的两种策略。如果你对...
Spring IOC 容器源码分析 - 创建单例 bean 的过程 1. 简介在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑。对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去创建,而是从缓存中获取。如果某个 bean 还未实例化,这个时候就无法命中缓存。此时,就要根据 bean 的配置信息去创建这个 bean 了。相较于getBean(String)方法的实现逻...
Spring IOC 容器源码分析 - 获取单例 bean 1. 简介为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章。在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一些建议。在做完必要的准备工作后,从本文开始,正式开始进入源码分析的阶段。在本篇文章中,我将会详细分析BeanFactory的getBean(String)方法实现细节,getBean(St...
Spring IOC 容器源码分析系列文章导读 1. 简介Spring 是一个轻量级的企业级应用开发框架,于 2004 年由Rod Johnson发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已经非常成熟了。Spring 包含了众多模块,包括但不限于 Core、Bean、Context、AOP 和 Web 等。在今天,我们完全可以使用 Spring 所提供的一站式解决方案开发出我们所需要的应用。作为 Java...
Spring bean的生命流程 Spring 是一个轻量级的 J2EE 开源框架,其目标是降低企业级应用开发难度,提高企业级应用开发效率。在日程开发中,我们会经常使用 Spring 框架去构建应用。所以作为一个经常使用的框架,了解其原理还是很有必要的。接下来我们就从宏观层面上,来看看 Spring 中的 bean 由实例化到销毁的过程。在详细讨论 bean 生命周期前,先上一张图,后面也会围绕这张图展开讨论。图1...
自己动手实现的 Spring IOC 和 AOP - 下篇 1. 背景本文承接上文,来继续说说 IOC 和 AOP 的仿写。在上文中,我实现了一个很简单的 IOC 和 AOP 容器。上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块没有整合到一起。IOC 在加载 bean 过程中,AOP 不能对 bean 织入通知。在本文中,我们详细说一下升级版 IOC 和 AOP。这个版本的实现包含了在上篇中所说的功能,这里再重述...
自己动手实现的 Spring IOC 和 AOP - 上篇 1. 背景我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了。不过之前没有仿写过 Spring IOC 和 AOP,只是宏观上对 Spring IOC 和 AOP 原理有一定的认识。所以为了更进一步理解 Spring IOC 和 AOP 原理。在工作之余,参考了一些资料和代码,动手实现了一个简单的 IOC 和...
Java 序列化和反序列化相关整理 1. 概述Java 提供了一种对象序列化的机制,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。把对象转换为字节序列的过程称为对象的 序列化。将序列化对象写入文件后,可以从文件中读取出来,并且对它进行反序列化,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。把字节序列恢复为对象的过程称为对象的 ...
Java 反射相关整理 1. Class 类Class 是一个类,封装了当前对象所对应的类的信息,一个类中有属性,方法,构造器等。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。Class 对象只能由系统建立对象,一个类(而不是一个对象)在 Java 虚拟机中只会有一个 Class 实例。Class 对象的由来是将 class...
Java 泛型相关整理 1. 概述Java 泛型(generics)是 JDK 5 中引入的一个新特性,泛型提供了 编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型,即 参数化类型。将类型由原来的具体的类型(类似于方法的变量参数,该变量定义了具体的类型),也定义成参数形式(可以称之为类型形参),然后在使用/调用时再传入具体的类型(类型实参)。泛型的本质是为了参数化类型(在不创建新...
Java 动态代理实现 JDK 动态代理代理模式是常用的 JAVA 设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 JDK 动态代理是 java.lang....
7 种阻塞队列相关整理 1. 简介阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。两个附加的操作。支持阻塞的 插入 方法,在队列为空时,获取元素的线程会等待队列变为非空。支持阻塞的 移除 方法,当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而...
Exchanger 相关整理 1. 简介Exchanger(交换者)是自 JDK 1.5 起开始提供的工具套件,源于 java.util.concurrent 包。是一个用于线程间协作的工具类。Exchanger 用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。此类提供对外的操作是同步的。用于 成对 出现的线程之间交换数据。可以视作双向的同步队列。可应用于基...
Semaphore 相关整理 1. 简介Semaphore 类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或逻辑的)线程数目。一个信号量有且仅有 3 种操作,且它们全部是原子的。初始化、增加和减少。增加可以为一个进程解除阻塞。减少可以让一个进程进入阻塞。Semaphore 管理一系列许可证。每个 acquire() 方法阻塞,直到有一个许可证可以获得然后拿...
ConcurrentLinkedQueue 相关整理 1. ConcurrentLinkedQueue在并发编程中有时候需要使用线程安全的队列,线程安全队列有两种实现方式。阻塞方式:对入队和出队操作加锁,阻塞队列。非阻塞方式:通过自旋 CAS 实现,例如:ConcurrentLinkedQueue。在中等规模的并发场景下,ConcurrentLinkedQueue 性能会高出不少,而且相当稳定。Concurren...
ConcurrentHashMap(1.8) 相关整理 1. ConcurrentHashMap1.1 HaspMap(JDK 1.8)JDK 1.8 HashMapJDK 1.8 对 HashMap 进行了修改,最大的不同就是利用了红黑树,其由数组+链表+红黑树组成。JDK 1.7 中,查找元素时,根据 hash 值能够快速定位到数组的具体下标,但之后需要顺着链表依次比较才能查找到需要的元素,时间复杂度取决于链表...
ReentrantReadWriteLock 相关整理 1. ReentrantReadWriteLock 概述ReentrantReadWriteLock 是 Lock 的另一种实现方式,ReentrantLock 是一个排他锁,同一时间只允许一个线程访问,而 ReentrantReadWriteLock 允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况...
LockSupport 工具相关整理 1. LockSupportLockSupport 是用来创建锁和其他同步类的基本线程阻塞原语。是一个简单的代理类,里面的代码都是使用 Unsafe 类里面的方法。JDK 对 LockSupport 的描述:Basic thread blocking primitives for creating locks and other synchronization classes...
Lock 相关整理 锁是用来控制多个线程访问共享资源的方式。Java 程序可以使用 syschronized 关键字实现锁功能,而 Java 5 之后,在并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能。Lock 提供了与 syschronized 关键字类似的同步功能,只是在使用时需要 显式地获取和释放锁。虽然缺少了 syschronized 关键字的隐式获取释放锁的便捷性(锁获取...
进程与线程 目录1 基本概念进程进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。线程线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。进程和线程的关系线程是进程的一部分。一个线程只能属于一个进程,而...
线程 一、线程的基本概念1.1 单线程简单的说,单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。public class SingleThread { public static void main(String[] args) { for (int i = 0; i < 10000; ...
Unsafe 相关整理 1. Unsafe 类Java 不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe 类提供了硬件级别的原子操作。Unsafe 类在 sun.misc 包下,不属于 Java 标准。很多 Java 的基础类库,包括一些被广泛使用的高性能开发库都是基于 Unsafe 类开发,比如 Netty、Hadoop、Kafka 等。Unsafe 是用于在实质上扩展 Java 语言...
并发关键字-volatile、syschronized 1. hsdis通过 hsdis 可以查看 Java 编译后的机器指令。window 32/64 位,可以下载 hsdis-amd64.dll/hsdis-i386.dll下载后拷贝至 $JAVA_HOME\jre\bin\server 目录下。或者 linxu 下载 hsdis-amd64.so。下载后拷贝至 $JAVA_HOME/jre/lib/amd64/se...
并发机制底层实现整理 1. 缓存一致性问题 硬件内存架构现代计算机一般都有 2 个以上 CPU,而且每个 CPU 还有可能包含多个核心。因此,如果应用是多线程的话,这些线程可能会在各个 CPU 核心中并行运行。在 CPU 内部有一组 CPU 寄存器,也就是 CPU 的储存器。CPU 操作寄存器的速度要比操作计算机主存快的多。在主存和 CPU 寄存器之间还存在一个...
Java内存模型与线程安全 CPU多级缓存计算机硬件架构简单图示(多CPU):多个CPU带来的问题及解决方法:(1)缓存一致性问题:MESI原则(2)CPU乱序执行优化Java内存模型(Java Memory Model,JMM)Java内存模型与硬件架构关联硬件架构中没有划分线程栈和堆Java内存模型抽象结构图本地内存是Java抽象出来的,包含寄存器,缓存,写缓冲区以...
Jdk1.8 JUC源码解析-atomic-(3)AtomicXXXFieldUpdater 一、什么是FieldUpdater在java.util.concurrent.atomic包中,由三个比较特殊的原子类:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater。通过名称可以看到,这几类的功能大致相同,只是针对的类型有所不同。所谓AtomicXXXFieldUpdater,...
Atomic数组 一、Atomic数组简介Atomic数组,顾名思义,就是能以原子的方式,操作数组中的元素。JDK提供了三种类型的原子数组:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray。这三种类型大同小异:AtomicIntegerArray对应AtomicIntegerAtomicLongArray对应AtomicLon...
Jdk1.8 JUC源码解析(1)-atomic-AtomicXXX 目录1 功能简介:原子量和普通变量相比,主要体现在读写的线程安全上。对原子量的是原子的(比如多线程下的共享变量i++就不是原子的),由CAS操作保证原子性。对原子量的读可以读到最新值,由volatile关键字来保证可见性。原子量多用于数据统计(如接口调用次数)、一些序列生成(多线程环境下)以及一些同步数据结构中。2 源码分析:首先,原子量的一些较底层的操作都是来自sun...
AbstractQueuedSynchronizer 原理分析 - Condition 实现原理 1. 简介Condition是一个接口,AbstractQueuedSynchronizer 中的ConditionObject内部类实现了这个接口。Condition声明了一组等待/通知的方法,这些方法的功能与Object中的wait/notify/notifyAll等方法相似。这两者相同的地方在于,它们所提供的等待/通知方法均是为了协同线程的运行秩序。只不过,Object 中的方法...
Java 重入锁 ReentrantLock 原理分析 1.简介可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似。所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生。ReentrantLock 的主要功能和 synchronized 关键字一致,均是用于多线程的同步。但除此之外,ReentrantLock 在功能上比 synchronized 更为丰富...
Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析 1.简介在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步组件CountDownLatch和CyclicBarrier。这两个同步组件比较常用,也经常被放在一起对比。通过分析这两个同步组件,可使我们对 Java 线程间协同有更深入的了解。同时通过分...
AbstractQueuedSynchronizer 原理分析 - 独占/共享模式 1.简介AbstractQueuedSynchronizer (抽象队列同步器,以下简称 AQS)出现在 JDK 1.5 中,由大师 Doug Lea 所创作。AQS 是很多同步器的基础框架,比如 ReentrantLock、CountDownLatch 和 Semaphore 等都是基于 AQS 实现的。除此之外,我们还可以基于 AQS,定制出我们所需要的同步器。AQS 的使用方式...
Java 线程池原理分析 1.简介线程池可以简单看做是一组线程的集合,通过使用线程池,我们可以方便的复用线程,避免了频繁创建和销毁线程所带来的开销。在应用上,线程池可应用在后端相关服务中。比如 Web 服务器,数据库服务器等。以 Web 服务器为例,假如 Web 服务器会收到大量短时的 HTTP 请求,如果此时我们简单的为每个 HTTP 请求创建一个处理线程,那么服务器的资源将会很快被耗尽。当然我们也可以自己去...
Java CAS 原理分析 目录1 简介2 背景介绍1.简介CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制。CAS 操作包含三个操作数 – 内存位置、预期数值和新值。CAS 的实现逻辑是将内存位置处的数值与预期数值想比较,若相等,则将内存位置处的值替换为新值。若不相等,则不做任何操作。在 Java 中,Java 并没有直接实现 CAS,CAS 相关的...
集合框架系列 Map(十三):HashTable(1.8) 目录1 概述1 概述 Hashtable是一个比较古老的Map实现类,从它的名称就可以看得出来,因为没有遵循Java的语言规范。它和HashMap很像,同属于散列表,有以下特性:首先就是线程安全,这也估计算是唯一一个优于HashMap的特性了吧;Hashtable不允许key或者value为null;自从JDK1.2开始,Hashtable实现了Map接口,成...
集合框架系列 Map(十二):TreeMap(1.8) 目录一 简介二 概览三 源码分析 3.1 查找 3.2 遍历 3.3 插入 3.4 删除一、简介TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很高。另一方面,由于 Tr...
集合框架系列 Map(十一):LinkeHashMap 目录1 概述2 原理3 源码分析 3.0 Entry 的继承体系 3.1链表的建立过程 3.2 链表节点的删除过程 3.3 访问顺序的维护过程 3.4 基于 LinkedHashMap 实现缓存4 总结1. 概述LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时...
集合框架系列 Map(十):HashMap 1.8 目录1 概述2 原理3 源码分析 3.1 构造方法 3.1.1 构造方法分析 3.1.2 初始容量、负载因子、阈值 3.2 查找 3.3 遍历 3.4 插入 3.4.1 插入逻辑分析 3.4.2 扩容机制 3.4.3 链表树化、红黑树链化与拆分 3.5 删除 3.6 其他细节 3.7 总结1. 概述本篇文章我们来聊聊大家日常开发中常用的一个集合...
集合框架系列 Map(十):HashMap 目录1 概述2 原理3 源码分析 3.1 构造方法 3.1.1 构造方法分析 3.1.2 初始容量、负载因子、阈值 3.2 查找 3.3 遍历 3.4 插入 3.4.1 插入逻辑分析 3.4.2 扩容机制 3.4.3 链表树化、红黑树链化与拆分 3.5 删除 3.6 其他细节 3.7 总结1. 概述本篇文章我们来聊聊大家日常开发中常用的...
集合框架系列概述 目录1 概述2 继承体系1 概述总的来说,Java 容器可以划分为 4 个部分:List 集合Set 集合Queue 集合Map 集合除了上面 4 种集合之外,还有一个专门的工具类:工具类(Iterator 迭代器、Enumeration 枚举类、Arrays 和 Collections)下面先给出集合总览图,进行直观上的感受在图中还有一个类没有表示...
集合框架系列 Queue(九):ArrayDeque 目录1 概述2 源码分析1 概述从名字我们可以看出,其实一个双向队列实现,而且底层采用数组实现。public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Ser...
集合框架系列 Queue(八):PriorityQueue 目录1 概述2 源码分析1 概述PriorityQueue 是一个优先级队列,其底层原理采用二叉堆实现。我们先来看看它的类声明:public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.SerializablePriorityQ...
集合系列 Set(七):TreeSet 目录1 概述2 源码分析 2.1 类成员变量 2.2 构造方法 2.3 核心方法3 总结1 概述TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现。我们先来看看 TreeSet 的定义。public class TreeSet<E> extends AbstractSet<E&g...
集合框架系列 Set(六):LinkedHashSet 目录1 概述2 源码分析3 总结1 概述LinkedHashSet 继承了 HashSet,在此基础上维护了元素的插入顺序。public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Seriali...
集合框架系列 Set(五):HashSet 目录1 概述2 源码分析 2.1 类成员变量 2.2 构造方法 2.3 核心方法3 总结1 概述HashSet 是 Set 集合的哈希实现,其继承了 AbstractSet 抽象类,并实现了 Set 接口。public class HashSet<E> extends AbstractSet<E> implements Se...
集合框架系列List (四):Stack源码分析 目录1 概述2 源码分析1 概述Stack 是先进后出的栈结构,其并不直接实现具体的逻辑,而是通过继承 Vector 类,调用 Vector 类的方法实现。publicclass Stack<E> extends Vector<E>2 源码分析Stack 类代码非常简单,其有 3 个核心方法:push、pop、peek。2.1p...
集合框架系列List&Queue (三)LinkedList 源码分析(JDK 1.8) 目录1 概述2 继承体系3 源码分析 3.1 查找 3.2 遍历 3.3 插入 3.4 删除4 总结1.概述LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构。和 ArrayList 一样,LinkedList 也支持空值和重复值。由于 LinkedList 基于链表实现,存储元素过程中,无需像 ArrayList 那样进行扩容...
集合框架系列(二)Vector源码分析 目录1 概述2 源码分析1 概述Vector 的底层实现以及结构与 ArrayList 完全相同,只是在某一些细节上会有所不同。这些细节主要有:线程安全扩容大小2 源码分析2.1 线程安全我们知道 ArrayList 是线程不安全的,只能在单线程环境下使用。而 Vector 则是线程安全的,那么其实怎么实现的呢?其实 Vector 的实现很简单,就是在每一个可...
集合框架概述 目录1 概述2 继承体系1 概述总的来说,Java 容器可以划分为 4 个部分:List 集合Set 集合Queue 集合Map 集合除了上面 4 种集合之外,还有一个专门的工具类:工具类(Iterator 迭代器、Enumeration 枚举类、Arrays 和 Collections)下面先给出集合总览图,进行直观上的感受2 继承体系在开始聊...
一些高质量博客整理 第一个:java_my_life作者介绍:找不到原作者信息。大概做了翻阅全部是2012年的博客。博客主要内容:主要内容是关于Java设计模式的一些讲解和学习笔记,在相信对学习设计模式的同学帮助很大。在一望无际的Java博文中有那么一两篇Javascript文章,就算两篇Javascript的质量不是很高,其它教程也是能很好的帮助到在学习中的朋友。博客关键词:JAVA与模式、简单工厂...
TreeMap源码分析(JDK1.8) 目录一 简介二 概览三 源码分析 3.1 查找 3.2 遍历 3.3 插入 3.4 删除一、简介TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很高。另一方面,由于 Tr...
HashMap 源码详细分析(JDK1.8) 目录1. 概述本篇文章我们来聊聊大家日常开发中常用的一个集合类 -HashMap。HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。另外,需要注意的是,HashMap 是...
集合框架系列(一)ArrayList源码分析 目录1 概述2 源码分析 2.1 构造方法 2.2 插入 2.3 删除1 概述ArrayList是一种变长的集合类,基于定长数组实现。ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个更大的数组。另外,由于 ArrayList 底层基于数组实现,所以其可以保证在O(1)复杂度下完成随...
LeetCode 153-寻找旋转排序数组中的最小值最小值也就是数组中的旋转点,这里称为断点,那么根据题意断点只有三种可能,最左侧,最右侧,中间,题目比较麻烦的地方就在于考虑各种情况分析,这种是没有共同之处的,不同题目要具体分析。比如这道题目中可以考虑:2 3 4 1;3 1 2;1 2 3 4;public int findMin(int[] nums) { if (nums == n...
刷题总结 目录 这是自己的刷题总结,题目主要包含:剑指offer、程序员代码面试指南、LeetCode,对于一些解题方法和思路除却上面三块外,还有在网上找的各种比较好的解决方法。数据结构总览 数据结构有散列表、栈、队列、堆、树、图等等各种数据结构,但归根结底这些数据结构只有两种存储方式,数组(顺序存储)和链表(链式存储)。 队列、栈这两种数据结构既可以使链表也可以使用数组实现...
RabbitMQ安装 安装后出现闪退1、下载好rabbitmq已经erl,并且把erl配置环境变量后,我通过cmd到rabbitmq下的sbin,输入:rabbitmq-plugins enable rabbitmq_management为了能够打开rabbitmq页面,解决方案如下:(1)rabbitmq-service.bat remove(2)倒数第二个rabbitmq的版本号为你下载的版本号。...
Redis安装及使用 安装下载官网上只有linux下载地址,windows版的要在github上下载windows下载地址:https://github.com/microsoftarchive/redis/tags选择msi版本为安装版本,zip为免安装版本,因为免安装版本每次打开比较麻烦,因此这里选择安装版本安装有两点要注意:1 选择“添加Redis目录到环境变量PATH中”,这样方便系统...
网格染色问题 有一个网格,在初始状态下所有网格都是空白的。现有如下操作:执行n次操作,每次选择坐标对应的那一行和一列,在该行或该列上选择两个端点网格,将两个端点网格间的所有网格(包括端点网格)都染色。具体染色规则:如果两个网格坐标(x1, y1)和(x2, y2)中横坐标x1 ==x2,则把这一列所有网格都染色,如果纵坐标y1 == y2则把这一行都染色。同一网格多次染色只计一次。问:n次操作后将...
数据库设计及应用 目录数据库几种范式1NF,即第一范式,是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。第一范式的模式要求属性值不可再分裂成更小部分,即属性项不能是属性组合或由组属性组成。简而言之,第一范式就是无重复的列...
图 目录1 生成图图的表示图表示有很多中,一般在面试中常见的如下:代码实现图的节点//图的节点的定义public class Node { //value的类型不一定是整型可以是泛型 public int value; //节点的入度 public int in; //节点的出度 public int out; //从...
Trie树和并查集 目录1 Trie(字典树) 1 字典树的定义 2 字典树的实现2 前缀树3 并查集 1 并查集主要解决的问题 2 并查集的实现 1 并查集的简单实现 2 并查集实现 3 并查集的优化 4 最终实现1 Trie(字典树)1 字典树的定义Trie:字典树、前缀树;其特点不再是普通树中的二叉结构而是多叉结构。Trie优点:适合处理类似通讯录问题,当有n个...
数据结构学习-4-Trie树和并查集 目录1 Trie(字典树) 1 字典树的定义 2 字典树的实现2 前缀树3 并查集 1 并查集主要解决的问题 2 并查集的实现 1 并查集的简单实现 2 并查集实现 3 并查集的优化 4 最终实现1 Trie(字典树)1 字典树的定义Trie:字典树、前缀树;其特点不再是普通树中的二叉结构而是多叉结构。Trie优点:适合处理类似通讯录问...
堆 目录1 堆的基础概念2 堆的实现 2.1 实现一个堆类 2.2 将无序数组调整为最大堆1 堆的基础概念最大堆:父节点要比每一个子节点的值都要大最小堆:父节点要比每一个子节点的值都要小堆可以看做是一个完全二叉树的数组对象堆的出队入队时间复杂度如下图所示:2 堆的实现2.1 实现一个堆类利用数组实现一个堆的原理:自上而下,自左向右对每一个节点标上序号,可...
数据结构学习-3-堆 目录1 堆的基础概念2 堆的实现 2.1 实现一个堆类 2.2 将无序数组调整为最大堆1 堆的基础概念最大堆:父节点要比每一个子节点的值都要大最小堆:父节点要比每一个子节点的值都要小堆可以看做是一个完全二叉树的数组对象堆的出队入队时间复杂度如下图所示:2 堆的实现2.1 实现一个堆类利用数组实现一个堆的原理:自上而下,自左向右对每一个节点标上...
算法辅助代码 本部分提供一些常用的代码模板,尽量节约算法笔试的时间目录1 输入输出流2 定义链表 2.1 单向链表 2.2 双向链表3 创建链表 3.1 创建单向链表 3.2 创建双向链表4 定义创建树并遍历5利用字符串创建树,并建立对应关系和parent指向注:广泛采用static是为了方便main方法调用1 输入输出流public static void main(S...
牛客网中级项目 目录第2章SpringBoot使用学习第2章SpringBoot使用学习官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/http://docs.spring.io/spring-boot/docs/current/reference/html/ind...
程序员代码面试指南下(7-9) 目录第7章第8章转圈打印矩阵将正方形矩阵顺时针转动90度之字形打印矩阵找到无须数组中最小的k个数需要排序的最短子数组长度在数组中找到出现次数大于N/K的数在行列都排好序的矩阵中找数最长的可整合子数组的长度不重复打印排序数组中相加和为给定值的所有二元组和三元组未排序正数数组中累加和为给定值的最长子数组长度未排序数组中累加和为给定值的最长子数组系列问题未排序数组...
程序员代码面试指南补充 目录1 hash函数的性质(1)输入域是无穷的,但是输出域是有限的(2)不是随机产生的输出,相同的输入一定对应相同的输出(3)不同的输入可能会导致相同的输出(hash碰撞)(4)输出的值在整个输出域几乎是均匀分布的(离散性)2 hash表hash表的存储数据如下图所示:每个字符是随机均匀分布在长度为10的数组上的,因为字符多,那么在相同位置字符使用链表连接的(JD...
操作系统 讲下操作系统中的分页6.分页的页较大时的优缺点与较小时的优缺点Linux下一些根目录的命名规范介绍一下2. Linux相关命令。5. 操作系统I/O模型了解吗?epoll模型了解吗?进程间通信,中断机制,扯了信号啥的,然后问中断的方式,我还没反应过来,后来面试完搜了一下,应该是让我举例说说强制性中断和自愿性中断吧4.解释下TIME_WAIT, 为什么取值为2MSL答2MSL...
JVM jvm结构、gcgc算法-四个,具体解释Java代码编译过程4. java类加载过程5. 初始化发生在什么时候问:JVM内存模型了解过吗?介绍一下?答:java内存模型分为堆内存和栈内存,栈内存的话保存一些方法传递的参数和一些局部变量。堆内存的话分为新生代和老年代,新生代又分为eden区和两个survivor区 bulabulabula。。问:新生代和老年代可以转换吗?答...
计算机网络与相关协议 如果前端访问量巨大(叶神的中级项目),可以怎么做tcp三次握手,四次挥手为什么是四次挥手http响应码(200 300 400 404 500)cookie和session的区别url---6位短地址的映射,lru算法7. udp和tcp的区别讲解udp的校验和讲解tcp的校验和tcp的四次挥手过程如果服务器中含有大量一直处于close_wait的tcp连接...
项目 6.让我说一下项目的具体业务模块7.对其中一个模块(用户)说下数据库有几张表以及每张表有什么字段(着重问了其中一张表)8.问我项目中一个业务(购票)可能存在的问题以及解决办法(我就说了两个问题..一个是一致性问题,解决办法是加锁,一个是高并发问题)看你用到了redis,某个功能具体怎么实现的4. 你的异步队列,好像可以用消息中间件来做5. 用到SpringBoot,那你知道微服务吗...