- 博客(38)
- 收藏
- 关注
原创 sql语句练习45题(Mysql版)
sql语句练习50题1 表名和字段2 测试数据2.1 学生表2.2 课程表2.3 教师表2.4 成绩表3 练习题和sql语句3.1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数3.2 查询"01"课程比"02"课程成绩低的学生的信息及课程分数3.3 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩1 表名和字段学生表Student(s_id,s_name,s_birth,s_sex) --学生编号,学生姓名, 出生年月,学生性别课程表Course(c_id,c_nam
2020-08-25 16:43:29
696
原创 Ribbon源码解析
Ribbon源码解析1 客户端负载均衡1.1 服务端负载均衡1.2 客户端负载均衡2 Ribbon架构2.1 主要组件2.2 BaseLoadBalancer2.2.1 LoadBalancer负载均衡器2.2.2 Ping心跳检测2.2.3 Rule负载均衡策略自定义负载均衡策略2.3 DynamicServerListLoadBalancer2.3.1 ServerList服务列表2.3.2 ServerListUpdater服务列表更新2.3.3 ServerListFilter服务列表过滤器3 服务
2020-08-14 15:57:56
259
原创 Eureka源码解析
Eureka1 服务治理2 搭建示例2.1 搭建服务注册中心2.2 注册服务提供者2.3 服务发现与消费3 详解3.1 基础架构3.2 服务治理机制3.3 源码分析3.3.1 Eureka Client服务注册服务续约服务获取3.3.2 Eureka Server1 服务治理服务治理是微服务架构中最为核心和基础的模块,主要用来实现各个微服务实例的自动化注册与发现。需要服务治理的原因:当微服务架构中服务的数量不多时,可以通过静态配置来完成服务的调用。但是当系统功能越来越复杂,相应的微服务应用不断增多,此
2020-08-13 15:02:36
328
原创 Semaphore源码
Semaphore源码1 概述1.1 简介1.2 特性1.3 使用2 源码2.1 类结构2.2 源码分析2.2.1 构造2.2.2 内部类Sync2.2.3 内部类NonfairSync2.2.4 内部类FairSync2.2.5 Semaphore其他API参考1 概述1.1 简介信号量为多线程协作提供了更强大的控制方法。广义上说,信号量是对锁的扩展。synchronized和ReentrantLock一次都只允许一个线程访问一个资源,而信号量可以指定多个线程同时访问某一个资源。public Se
2020-07-31 15:07:01
227
原创 二叉树问题
二叉树问题1 模板1.1 递归(先、中、后)1.2 非递归1.2.1 先序1.2.2 中序1.2.3 后序1.3 层序遍历1.4 Moris遍历2 例题2.1 LeetCode 98. 验证二叉搜索树2.2 LeetCode 101. 对称二叉树1 模板1.1 递归(先、中、后)数据结构:public class Node { int val; Node left; Node right; public Node(int val){ this.val
2020-07-30 17:38:31
225
原创 Java类加载机制
Java类加载1 概述1.1 类加载机制1.2 类加载过程1.2.1 加载类1.2.2 验证类1.2.3 准备1.2.4 解析类1.2.5 初始化1.3 类加载的条件2 类加载器2.1 类加载器子系统2.2 类加载器的分类2.3 双亲委派模型2.3.1 概念2.3.2 Tomcat案例2.4 自定义类加载器2.4.1 文件类加载器2.4.2 网络类加载器2.5 打破双亲委派2.5.1 SPI与线程上下文类加载器2.5.1.1 SPI2.5.1.2 线程上下文类加载器2.5.1.3 JDBC案例DriverM
2020-07-29 15:39:06
311
原创 JVM GC
GC1 垃圾回收算法1.1 引用计数法(Reference Counting)1.2 标记清除法(Mark-Sweep)1.3 复制算法(Copying)1 垃圾回收算法常用的垃圾回收算法有:引用计数法标记压缩法标记清除法复制算法分代、分区思想1.1 引用计数法(Reference Counting)最经典也是最古老的一种垃圾回收算法。思想:对于对象A,只要有任何一个对象引用了A,则A的引用计数器就加一。引用失效则减一。当对象A的引用计数器的值为0时,回收A对象。实现:
2020-07-28 19:14:07
198
原创 JVM运行时数据区
JVM运行时数据区1 总体结构2 堆2.1 自动内存管理2.2 堆的管理3 PC4 JVM栈5 方法区1 总体结构程序运行所需的内存空间, 有些是不能在编译期就能确定的, 得要在运行期根据实际运行状况动态地在系统中创建。JVM启动时, 会在内存中开辟空间, 并按职能划分为不同的区域(如下图所示)。主要包含以下几项:堆: 用来分自己 Java 对象和数组的空间。方法区: 存储类元数据。栈:线程栈。PC 寄存器:存储执行指令的内存地址。堆和方法区是所有线程共享的公共区域,堆与方法区所占的内
2020-07-28 14:59:20
129
原创 回溯
回溯1 模板2 例题2.1 N皇后2.2 全排列2.2.1 LeetCode 46. 全排列2.2.2 LeetCode 47. 全排列 II2.2.3 全排列 III permuteSkip2.3 子集问题2.3.1 LeetCode 78. 子集2.3.2 LeetCode 90. 子集 II2.4 组合问题2.4.1 LeetCode 77. 组合2.4.2 LeetCode 39. 组合总和2.4.3 LeetCode 40. 组合总和 II2.4.4 LeetCode 216.
2020-07-24 15:18:43
150
原创 排序
排序1 模板1.1 辅助与测试函数1.1.1 交换函数 swap()1.1.2 测试函数1.2 排序模板1.2.1 冒泡排序1.2.2 插入排序1.2.3 选择排序1.2.4 堆排序1.2.5 快速排序1.2.6 归并排序1.2.7 桶排序1.2.8 基数排序2 排序相关例题1 模板1.1 辅助与测试函数1.1.1 交换函数 swap()public static void swap(int[] arr, int i, int j) { int temp; temp = arr[i]
2020-07-22 15:19:46
151
原创 折半查找
折半查找1 模板23 例题3.1 例11 模板public int search(int[] nums, int target) { int left = 0; int right = nums.length - 1; int mid; while(left<=right){ mid = left + (right - left) / 2; if(target == nums[mid]){ return mid
2020-07-21 21:33:15
403
原创 背包问题
背包问题1 01背包2 完全背包3 多重背包4 混合背包5 二维费用背包参考1 01背包/** * 时间: O(VN) * 空间: O(VN) */public static int zeroOnePack1(int[] c, int[] w, int n, int v) { int[][] dp = new int[n][v + 1]; for (int i = 1; i < n; i++) { for (int j = v; j >= 0; j--
2020-07-21 15:04:10
135
转载 HashMap
HashMap1 概述2 数据结构(jdk1.8)2.1 链表2.2 红黑树2.2.1 红黑树的特性2.2.2 jdk1.8 实现2.2.2.1 类结构2.2.2.1 插入操作1 概述在JDK1.8之前,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的节点都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大
2020-07-11 15:03:46
159
转载 Java动态代理
Java动态代理1 静态代理和动态代理1.1 代理模式1.2 静态代理1.2.1 什么是静态代理1.2.2 简单实现1.3 动态代理1.3.1 什么是动态代理1.3.2 简单实现2 动态代理的原理2.1 反射2.2 小结3 动态代理的几种实现方式3.1 基于JDK的动态代理3.2 基于CGLIB的动态代理4 AOP参考1 静态代理和动态代理1.1 代理模式代理模式定义如下:为其他对象提供一组代理以控制对这个对象的访问。适合代理模式的场景如下不希望用户直接访问该对象,而是提供一个特殊的对象以控制对
2020-06-19 10:12:51
198
原创 Java反射
Java反射1 概述1.1 概念1.2 反射的作用1.3 反射的优缺点2 反射机制(Class 和 java.lang.reflect.*)2.1 概述2.2 Class3 使用反射3.1 获得Class的三种方式3.2 使用Class类的对象来生成目标类的实例3.3 统一形式调用3.3.1 统一形式解析类3.3.2 统一形式调用类的构造方法3.3.3 统一形式调用成员方法3.3.4 通用方法4 反射与工厂模式4.1 传统工厂设计模式4.2 添加反射4.3 添加泛型参考1 概述1.1 概念Refle
2020-06-18 14:46:42
210
转载 Java注解
Java注解1 注解1.1 什么是注解1.2 注解语法1.3 注解的定义1.4 注解的使用2 元注解2.1 @Retention2.2 @Documented2.3 @Target2.4 @Inherited2.5 @Repeatable3 注解的属性4 Java预置的注解4.1 @Deprecated4.2 @Override4.3 @SuppressWarnings4.4 @SafeVarargs4.5 @FunctionalInterface5 注解与反射的结合5.1 注解的提取5.2 注解与反射5.
2020-06-17 15:07:51
227
转载 Java异常
Java异常1 异常类型1.1 Error1.2 Exception2 正确处理异常2.1 关键字2.2 例子2.3 异常处理的基本语法2.3.1 try...catch...finally语句块2.3.2 throws 函数声明2.3.3 finally块2.3.4 throw 异常抛出语句2.4 异常链3 自定义异常3.1 基本概念3.2 例子4 try-with-resource5 finally 和 return的实行顺序参考1 异常类型Throwable 是 Java 语言中所有错误或异常的超
2020-06-17 13:38:22
332
原创 Java枚举
Java枚举1 枚举的用法1.1 常量1.2 switch1.3 向枚举中添加新方法1.4 覆盖枚举的方法1.5 实现接口1.6 使用接口组织枚举1.7 枚举集合2 枚举的实现3 枚举与单例4 Java枚举如何比较5 switch对枚举的支持6 枚举的序列化7 枚举的线程安全8 总结参考1 枚举的用法1.1 常量在JDK1.5 之前,定义常量的方法:public static fianl…而使用枚举,可以把相关的常量分组到一个枚举类型里,并且枚举提供了比常量更多的方法。public enum Co
2020-06-17 09:19:28
265
原创 Java序列化
Java序列化1 概述1.1 序列化和反序列化1.2 为什么序列化2 序列化原理2.1 demo2.2 源码分析2.3 transient3 序列化与单例模式3.1 demo3.2 源码分析3.3 解决方法3.4 源码分析4 protobuf5 安全性6 参考1 概述1.1 序列化和反序列化序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。1.2 为什么序列化持久化对象:把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。网
2020-06-16 22:13:38
270
1
原创 Java缓存
Java缓存1 概念1.1 什么是缓存1.2 为什么要用缓存2 Java内存缓存2.1 场景2.2 ConcurrentHashMap实现缓存3 Guava3.1 介绍3.2 适用场景3.3 简单使用1 概念1.1 什么是缓存在计算中,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储。缓存的访问速度比主存的访问速度快,可以高效地重用之前检索或者计算的数据。也就是把数据从访问慢的介质挪到访问快的介质。1.2 为什么要用缓存提升应用程序性能降低数据库成本减少后端负载可预测性能
2020-05-30 13:42:17
221
原创 String源码 1.8
String源码1 问题提出2 常用方法charAtsubstringtoCharArrayequals1 问题提出2 常用方法charAt检查边界,无错则返回。 public char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); }
2020-05-18 14:24:57
210
原创 设计模式(六)——责任链模式
责任链模式问题提出责任链模式简单实现加入反射回调技术应用示例异步调用问题提出在生活中,经常遇到这样的问题。例如:在企业中,员工请假的问题。假设假期少于一天,可由组长决定;少于两天的,可由车间主任决定;大于两天的,由经理决定。组长、主任、经理构成了一条功能链。员工逐级向上进行申请,直到获得授权。再比如生产产品,需要经过多道工序。解决以上这些问题,责任链模式是一个较好的选择。责任链模式责任链...
2020-02-21 15:06:25
273
原创 设计模式(五)——原型模式
原型模式问题提出原型模式浅复制和深复制实现方法利用构造函数方法利用Cloneable接口方法利用Serializable序列化接口方法应用示例原型管理器问题提出在软件开发过程中,有时候会遇到为一个类创建多个实例的情况,这些实例内部成员变量完全相同或有细微的差异,而且实例的创建开销远大于或者需要输入较多的参数。如果能通过复制一个已创建的对象实例来重复创建多个相同的对象,就可以大大减少创建对象的...
2020-02-20 10:11:43
157
原创 设计模式(四)——生成器模式
生成器模式问题提出生成器模式标准的生成器模式弱生成器模式通过派生类方式实现应用案例问题提出在类的应用中,有些简单的类是容易创建对象的,直接调用构造方法即可。例如:Student student = new Student("1001", "张三", 20);Circle circle = new Circle(10.0f);而有些类却不宜直接创建对象的,成员变量是自定义类型,例如:p...
2020-02-19 22:11:11
228
原创 设计模式(三)——工厂模式
工厂模式场景分类简单工厂工厂抽象工厂应用示例场景工厂模式可以分为简单工厂、工厂、抽象工厂。当用户需要一个类的子类实例,并且不希望与该类的子类形成耦合或者不知道该类有哪些子类可用时,可用采用工厂模式。当用户需要系统提供多个对象,且希望和创建对象的类解耦时,可采用抽象工厂模式。表1——小汽车工厂单一产品系,工厂生产一种类的产品高档中档低档小汽车√√√表...
2020-02-17 13:17:50
186
原创 设计模式(二)——单例模式
单例模式核心思想饿汉式懒汉式懒汉式+同步方法Holder方式(☆)其他单例模式核心思想保证单例模式只有一个实例的核心思想是构造方法私有化,单例模式可从3个属性评判:单实例懒加载高性能饿汉式public final class Singleton { /** * 实例变量 */ private byte[] data = new byte[102...
2020-02-15 22:08:05
180
原创 设计模式(一)——概述
概述分类接口和抽象类反射分类常用设计模式共有24种,分为三大类:创建型模式、行为型模式、结构型模式。创建型模式提供了一种在创建对象的同时,隐藏创建逻辑的方式,而不是使用新的运算符直接实例化对象。常用的创建型模式包括:单例模式简单工厂模式工厂模式抽象工厂模式生成器模式原型模式行为型模式特别关注对象之间的通信。常用的包括:责任链模式命令模式迭代器模式访问者模式中介者...
2020-02-15 16:30:14
169
原创 Java并发编程(三)——锁的优化
锁的优化提高锁的性能减少锁的持有时间减小锁的粒度读写锁替换独占锁锁分离锁粗化JVM中对锁的优化策略锁偏向轻量级锁自旋锁提高锁的性能减少锁的持有时间减少锁的持有时间,有助于降低所冲突的可能性,进而提升系统的并发能力。例如:public synchronized void syncMethod(){ othercode1(); mutexMethod(); otherc...
2019-12-01 20:50:46
380
2
原创 Java并发编程(二)——JDK并发包
JDK并发包同步控制重入锁简单使用中断响应锁申请限时等待公平锁重入锁的实现要素Condition信号量(Semaphore)读写锁倒计数器:CountDownLatch循环栅栏:CyclicBarrier线程阻塞工具类:LockSupportGuava和RateLimiter限流线程的复用:线程池同步控制重入锁重入锁可以完全替代关键字synchronized。从JDK6.0开始,两者的性能差...
2019-11-19 13:48:37
235
原创 Java多线程设计模式——Latch设计模式
Latch设计模式场景描述CountDownLatch实现LatchCountDownLatch使用Reference场景描述程序员Alex叫上好朋友Jack、Gavin、Dillon去“同心湖”游玩。每个人前往目的地的方式不一样,到达的时间也不一样,需要等所有人都到达后开始活动。Latch(门阀)设计模式指定了一个屏障,需要所有条件都满足后,门阀才能打开。CountDownLatch实现...
2019-11-11 18:51:51
315
原创 Java多线程设计模式——读写锁分离
读写锁分离场景描述场景描述在多线程的情况下访问共享资源,需要对资源进行同步操作以防止数据不一致的情况。对资源的访问一般包括两种类型的动作——读和写(更新、删除、增加等资源会发生变化的动作)。如果多个线程在某个时刻都在进行对资源的读操作,虽然有资源的竞争,但是这种竞争不足以产生数据不一致的情况发生,这个时候如果直接使用排它的方式加锁,就显得有些简单粗暴。...
2019-11-10 14:36:26
394
原创 Java多线程设计模式——Single Thread Execution
Single Thread ExecutionSingle Thread Execution场景一(机场过安检)非线程安全线程安全小结场景(吃面问题)引起死锁的例子修改Single Thread ExecutionSingle Thread Execution模式是指在同一时刻只能有一个线程去访问共享资源,就像独木桥一样每次只允许一个人通行。Single Thread Execution就是采...
2019-11-09 19:47:32
286
原创 Java多线程设计模式——监控任务的生命周期
监控任务的生命周期场景描述解决方案观察者模式类图场景描述Thread提供了可获取状态、以及判断状态是否alive的方法。然而,这些方法均是针对线程本身的,我们提交的任务在运行过程中所处的状态是无法直接获取的,例如什么时候开始,什么时候结束。解决方案观察者模式但某个对象发生状态改变需要通知第三方时,观察者模式适合这样的工作。应用观察者模式时,使用Thread作为事件源(引发状态发生变化的源...
2019-11-09 15:55:17
439
3
原创 Java并发编程(一)——并发的基本概念
Java并发编程(一)——并发的基本概念概念并行计算的相关概念同步(Synchronous)和异步(Asynchronous)并发(Concurrent)和并行(Parallelism)临界区阻塞(Blocking)和非阻塞(Non-Blocking)死锁(Deadlock)、饥饿(Starvation)、活锁(Livelock)并发级别阻塞(Blocking)无饥饿(Starvation-Fre...
2019-11-08 12:02:10
372
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人