自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

鹿与森的博客

一个更新缓慢的小白

  • 博客(48)
  • 收藏
  • 关注

原创 第一范式、第二范式、第三范式、BCNF范式的区别

第一范式:数据库的每一列都是不可分割的基本数据项,强调列的原子性。即列不可以再拆分。第二范式:建立在第一范式的基础上,每一个非主属性要完全函数依赖于候选键(或者说是主键,任一个候选键都可以做主键)。即非主键列完全依赖于主键,而不能是依赖于主键的一部分,必须满足两个条件:1.必须有一个主键;2.没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。第三范式(3NF)建立在第二范式的基础上,任何非主属性不依赖于其它非主属性。即每一个非主属性都不传递依赖于该范式的候选键。即非主键列只依赖于主键

2020-03-22 22:56:50 10950

原创 MySQL复合索引(联合索引)原理分析及使用

MySQL索引分类 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据。在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行。在InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查...

2020-03-15 16:31:38 6433 3

原创 MySQL索引为什么选择B+树而不是B树

B类树的特点,B类树保证尽量多的在结点上存储相关的信息,同时保证层数尽量的少,查找更快,磁盘的IO操作也少一些。 B+树的IO更少:B+树的非叶子节点没有指向关键字具体信息的指针,只用作索引,因此B+树的非叶子节点比B树占用更少磁盘空间。当数据量大时,一次不能把整个索引全部加载到内存,只能逐个加载每一个磁盘块,而关键字所占空间更小可以使得一次性读入内存的索引也就越多,IO次数也就越少。 ...

2020-03-13 21:17:45 636

原创 常见排序算法(Java实现)

排序算法概述常见排序算法主要分为两种(本文log皆以2为底):算法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性选择排序 O(N²) O(N²) O(N²) O(1) 不稳定冒泡排序 O(N²) O(N²) O(N) O(1) 稳定插入排序 O(N²) O(N²) O(N) O(1) 稳定希尔排序 O(N^1.3) (shell序列) O(N²) O(N^1.3) O(1) 不稳定快速排序 O(N logN) O(N²) O(N logN) O(N logN

2020-03-09 23:49:26 206

原创 MySQL数据库优化

SQL语句的优化步骤:开启MySQL慢查日志(slow_query_log)。分析MySQL慢查日志,通过使用一些MySQL慢查日志分析工具(mysqldumpslow、pt-query-digest)。优先查找出一些查询次数多且执行时间长的SQL语句。explain查询SQL语句的执行计划,针对执行计划进行优化。具体的SQL语句优化:索引优化:索引字段长度越小越好。因为数据库中数据存储单位是“页”,索引字段长度越小一次IO读取的索引会更多,越容易命中对应的值。(大意就是不要

2020-03-02 22:42:07 89

原创 Java泛型

什么是泛型Java泛型是JDK 5引入的一个一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。对比JDK 5以前运行时抛出异常的处理,可以更早和更优雅的发现非法类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,不限定于特定类型,可以根据实际需要设置不同的数据类型,以实现代码复用。泛型的使用参数化类型特征:把类型当做参数传递。类型参数只能代表引用类型,不能是原始类型(像int,double,char等)。一些常用的泛型类型

2020-02-23 23:42:17 130

原创 二叉树常见遍历算法

二叉树常见遍历先序遍历:先根后左再右,根左右。 中序遍历:先左后根再右,左根右。 后序遍历:先左后右再根,左右根。 广度优先遍历:一种图算法,二叉树中一般称为层序遍历。广度优先遍历按层处理,据开始点最近的那些顶点先被处理,而最远的那些顶点最后被处理。 深度优先遍历:一种图算法,深度优先遍历从某个顶点v出发,依次从v的未被访问的邻接点出发,对图进行深度优先遍历,直至图中和v有路径相通的顶...

2020-01-25 20:05:04 150

原创 原子操作的实现

目录原子操作处理器实现原子操作Java如何实现原子操作1.锁2.CAS循环原子操作不可中断的一个或一系列操作。处理器实现原子操作 通过总线锁保证原子性,所谓总线锁就是使用处理器提供的一个LOCK #信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。 通过缓存锁保证原子性,所谓缓存锁是指内存区域如果被缓存...

2020-01-12 23:54:14 323

原创 volatile、synchronized、final

目录一、volatile(一)什么是volatile(二)volatile的实现(三)volatile内存语义二、synchronized(一)什么是synchronized(二)锁优化1.偏向锁2.轻量级锁(三)synchronized的实现(四)synchronized的使用三、final(一)什么是final1.final类2.fi...

2020-01-12 22:39:35 384

原创 原子性、可见性和有序性

原子性(Atomicity)由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write,我们大致可以认为基本数据类型的访问读写是具备原子性的。Java内存模型提供了lock和unlock来保证更大范围的原子操作,尽管虚拟机未把lock和unlock操作直接开放给用户使用,但是却提供了更高层次的字节码指令monitorenter和moni...

2020-01-12 12:08:49 212

原创 Java并发工具类

倒计时锁(CountDownLatch)CountDownLatch允许一个或多个线程等待其他线程完成操作。同步屏障(CyclicBarrier)CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行。信号量(Semaphore)Semaphore是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源

2020-01-12 00:32:29 87

原创 Java中的锁

Lock接口在Lock接口出现之前,Java程序是靠synchronized关键字实现所功能的。而JDK1.5之后,并发包中新增了Lock接口(以及实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是使用时需要显式地获取和释放锁。Lock接口提供的synchronized关键字不具备的主要特性:特性 描述 尝试非阻塞的获取 当前线程尝试...

2020-01-09 23:30:24 475

原创 散列表与散列冲突

目录散列表与散列冲突解决散列冲突的方法1.分离链接法(拉链法)2.开放寻址法再散列散列表与散列冲突HashTable,音译为哈希表,是根据关键字(key)而直接进行访问的数据结构。关键字k,值存放在f(k)的存储位置上,则f为散列函数。关键字(key)通过散列函数直映射到表中一个位置,以加快查找速度。散列冲突,因为存储单元数目是有限的,当关键字数量增大时,两个不同的...

2020-01-08 23:52:18 1638

原创 Java原子操作类

目录原子操作类原子基本类型原子数组类型原子引用类型原子更新字段类型原子操作类JDK1.5开始提供了java.util.concurrent.atomic包,包下13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。JDK1.8新增了DoubleAccumulator、LongAccumulator、DoubleA...

2020-01-07 23:28:25 182

原创 Java内存模型

目录一、物理机内存模型(一)缓存一致性(二)指令重排序二、Java内存模型(一)主内存与工作内存(二)内存间交互操作(三)从源代码到指令序列的重排序(四)重排序规则1.数据依赖性2.as-if-serial语义3.先行发生原则(happens-before)一、物理机内存模型首先,了解一下物理计算机并发的问题,了解物理机的并发解决方案对虚拟机的...

2020-01-05 11:50:02 200

原创 String对象创建

(1)String str = "abc";(2)String str = new String("abc");(3)String str = "abc".intern();(看书时会常看到这个)第一种方式会先从常量池中判断是否存在“abc”对象,如果不存在,则会在常量池中创建该对象,然后返回常量池“abc”的引用。第二种方式会先从常量池中判断是否存在“abc”对象,如果不存在,则...

2020-01-05 01:00:41 139

原创 Java栈

Java的StackJDK 1.0/1.1 的Stack很奇怪,竟然不是用Vector来构建Stack,而是继承Vector。所以它拥有Vector所有的特点和行为,再加上一些额外的Stack行为。这是一个糟糕的设计,你永远都不应该使用它。 ——Thinking in Java自实现Stack所以,目前都是自实现栈,自实现栈有两种常见的方式,一种是使用链表,另一种是使用数组。数组的

2020-01-02 10:02:55 87 2

原创 compareAndSet和weakCompareAndSet区别

JDK1.9以前,两者底层实现是一样的,并没有严格区分。JDK 1.9提供了Variable Handles的API,主要是用来取代java.util.concurrent.atomic包以及sun.misc.Unsafe类的功能。Variable Handles需要依赖jvm的增强及编译器的协助,即需要依赖java语言规范及jvm规范的升级。VarHandle中compareAndSet和c...

2020-01-01 21:34:25 3241

原创 Fork/Join框架

什么是Fork/Join框架Fork/Join框架是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。基本原理就是分而治之。Fork/Join实现原理工作窃取算法,是指某个线程向其他队列窃取任务来执行。将一个较大的任务拆分,多队列多线程去执行,线程和队列一一对应。先完成自己任务队列的会去别的任务队列去窃取一个任务...

2019-12-31 23:03:22 131

原创 Integer初始化

Integer的valueOf()在-128~127之间时会使用Integer内部类IntegerCache,这时新创建的Integer对象中保存的是cache数组中某个元素的引用。所以integer == integer1为true,由于引用同一对象,地址相同。public class Test { public static void main(String[] args) { Integer integer = 127; Integer integer1 =

2019-12-31 14:08:37 1840 2

原创 队列同步器AbstractQueueSynchronizer

目录什么是队列同步器队列同步器的实现同步队列独占式同步状态获取与释放共享式同步状态获取与释放等待队列队列同步器使用什么是队列同步器队列同步器是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,在抽象方...

2019-12-30 23:34:46 224 1

原创 Java线程池关闭

import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.Executors;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ShutDownExam...

2019-12-30 13:24:15 214

原创 Java线程池和Executor框架

线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。使用线程池可以对线程进行统一分配、调优和监控。 线程池的实现原理Java的线程即是工作单元,也是执行机制。从JDK 1.5开始,把工作单元和执行机制分离开来。工作单元包括Runnable和Ca...

2019-12-29 20:50:53 157

原创 Java线程

目录什么是线程线程的实现线程优先级线程的状态守护线程线程中断安全地终止线程ThreadLocal什么是线程线程是比进程更轻量级的调度执行单位,现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆、栈和局部变量等属性,并且能够访问共享的内存变量。线程的实现Java线程在JDK1.2之前,是基于成...

2019-12-29 16:29:26 130

原创 Java阻塞队列(BlockingQueue)

目录什么是阻塞队列阻塞队列支持的方法阻塞队列的实现原理1.Condition2.LockSupportJava中的阻塞队列什么是阻塞队列阻塞队列(BlockingQueue)是一个附加支持阻塞的插入和移除的队列。 支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。 支持阻塞的移除方法:当队列为空时,队列会阻塞插入元素的线程,知道...

2019-12-28 17:29:41 207

原创 递归简述

递归四条基本法则:基准情形。必须总要有某些基准情形,它无需递归就能解出。 不断推进。对于那些需要递归求解的情形,每一次递归调用就必须要使状况朝向一种基准情形推进。 设计法则。假设所有的递归都能运行。 合成效益法则。在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。...

2019-12-26 23:26:24 106

原创 Java并发编程的问题与挑战

目录一、并发的关键问题1.1 线程之间如何通信1.2 线程之间如何同步二、并发的挑战:2.1 上下文切换2.1.1 如何减少上下文切换:2.2 死锁2.2.1 如何避免死锁:2.3 资源限制一、并发的关键问题1.1 线程之间如何通信通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型...

2019-12-22 23:04:43 127

原创 Java对象初始化顺序

结论:父类静态代码块,父类静态成员变量(同级,按代码顺序执行) 子类静态代码块,子类静态成员变量(同级,按代码顺序执行) 父类普通代码块,父类普通成员变量(同级,按代码顺序执行) 父类构造方法 子类普通代码块,子类普通成员变量(同级,按代码顺序执行) 子类构造方法注意:我们new一个对象A时,首先会先创建A类的父类B的实例对象,如果B类仍有父类C,会先创建父类C的对象,以此类推...

2019-12-22 01:56:43 100

转载 Mysql数据类型

https://www.runoob.com/mysql/mysql-data-types.html

2019-12-21 12:40:25 62

原创 @EnableEurekaServer注解引不到

pom引包坐标不对 spring-cloud-starter-netflix-eureka-server<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server&...

2019-12-05 11:17:20 551

原创 eureka.client常用配置

eureka.client常用配置参数 参数名 说明 默认值 eureka.client.enabled 启用 Eureka 客户端 true eureka.client.registryFetchIntervalSeconds 从 Eureka 服务端获取注册信息的间隔时间,单位为秒。 30 eureka.client.instanceInfoR...

2019-12-05 11:13:40 4617

原创 Eureka服务治理体系

1.服务治理:服务治理可以说是微服务中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现。为了解决微服务框架架构中的服务实例维护问题,产生了大量的服务治理框架和产品。Eureka服务治理体系包含三个核心角色:服务注册中心、服务提供者以及服务消费者。1.1服务注册中心:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、...

2019-12-04 14:41:55 284

原创 Spring Boot的几种启动方式

1.主函数启动2.打包,jar包启动mvn installjava -jar xxx.jar3.Maven的spring-boot插件启动mvn spring-boot:run

2019-12-04 08:23:03 391

原创 记录一些漂亮话

事务:事务是逻辑上的一组操作,要么都执行,要么都不执行。并发编程:我们可以将程序划分为多个分离的、独立运行的任务。通过使用多线程机制,这些独立任务(也被称为子任务)中每一个都将由执行线程来驱动。程序员创建任务:并通过某种方式将一个线程附着到任务上,已使得这个线程可以驱动任务。产品:每个成员都应该对产品的整个生命周期负责。项目:以完成开发和交付并将结果交接给维护者为最终目标。微服务:...

2019-12-04 08:08:53 247

原创 Spring Boot 数据文件的加载顺序

按优先级排序:1.在命令行中传入的参数2.SPRING_APPLICATION_JSON中的属性。SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中的内容。3.java:comp/env中的JNDI属性。4.Java的系统属性,可以通过System.getProperties()获得的内容。5.操作系统的环境变量。6.通过random.*配置...

2019-12-03 16:14:14 73

原创 Java中的浅复制和深复制

一、浅复制与深复制概念(1)浅复制浅复制会复制“被复制对象”基本类型的值和对象的引用。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。(2)深复制深复制会复制“被复制对象”基本类型的值,对象的引用将重新指向一个被复制过的新对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。二、clone()、Cloneable和Serialiable(1)clone()...

2019-11-19 11:36:57 499

原创 UML类图

目录UML类图:类(Class)接口(Interface)继承关系(Generalisierung(德,泛化关系))实现关系(Realisierung(德,实现))关联关系(Assoziationsklasse(德,关联))聚合关系(Aggregation(德,聚合))复合关系(Gerichtete Assoziation(德,泛化联合))依赖关系(Abhäng...

2019-11-18 12:37:37 891

原创 垃圾收集器和内存分配策略

目录一、垃圾收集(Garbage Collection,GC)(一)对象引用(二)对象存活判定(三)对象回收(四)垃圾收集算法1.标记-清除算法(Mark-Sweep)3.标记-整理算法(Mark-Compact)4.分代收集算法(Generational Collection)(五)HotSpot的算法实现1.枚举根节点2.安全点(SafePoint)...

2019-11-05 13:52:42 394

原创 设计模式(1)——简单工厂模式

简单工厂模式:实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。使用场景://TODOUML类图:具体实现:/** * @ClassName Operation * @Description 运算类 */public ...

2019-11-04 23:23:15 116

原创 第二章——Java内存区域与内存溢出异常(3)OutOfMemoryError异常

三、OutOfMemoryError异常(一)Java堆溢出-Xms20m设置堆的初始值,默认情况是机器物理内存的1/64-Xmx20m设置堆的最大值,默认是机器物理内存的1/4(-Xms等于-Xmx时,即可避免自动扩展)Java堆用于存储对象,只要不断的创建对象,并且避免被GC,那么在对象数量到达最大堆的容量限制后就会产生OutOfMemoryError异常。(二)虚拟机...

2019-11-01 16:56:55 90

空空如也

空空如也

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

TA关注的人

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