自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

四年时光

莫愁前路无知己, 天下谁人不识君

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

原创 Docker 临时快速安装 MySQL 8.0

docker 快速安装 MySQL

2022-12-21 23:43:57 153 1

原创 Redis 内存驱逐策略

1 缓存替代算法cache algorithms (also frequently called cache replacement algorithms or cache replacement policies).When the cache is full, the algorithm must choose which items to discard to make room for the new ones.当缓存已满时, 缓存替代算法必须要选择要丢弃的数据项, 以便为新的数据项腾出空间.

2021-12-21 22:37:23 1224

原创 volatile 示例分析

我被自己蠢哭了(〒︿〒)…还是要戒骄戒躁, 踏踏实实地学习才行.“一个人知道自己为何而活, 就可以忍受任何生活” - 尼采.1 共享变量的内存可见性问题看这个示例:public class Test1 { private static boolean b = false; public static void main(String[] args) throws InterruptedException { // 假设这个线程叫 T0 new Th

2021-11-21 17:11:07 681

原创 原码与补码

转载这篇文章, 很赞, 讲的很详细.

2021-11-16 23:03:17 246

原创 ConcurrentHashMap分析(JDK1.8)

ConcurrentHashMap 里有 50+ 个子类, 一共 6k+ 行代码, 对于初学者直接阅读有一些难度. 本文详细介绍 ConcurrentHashMap 中的一些 关键要素(概念/代码), 掌握这些再看这个类的实现细节(代码), 就比较容易看懂.推荐 JDK 使用 liberica-1.8 版本, 这个版本的 JDK 所有源码都有, 方便阅读.Oracle 版本的 JDK 有一些类是没有源码的, 只有 .class 文件(比如 Unsafe 类), .class 反编译出来的代码看起来很难受

2021-11-10 00:21:27 510

原创 HashMap 实现细节(JDK1.8)

1 简介Java 8前后 HashMap 的区别:对比项Java 8 之前Java 8 之后(含)节点类型EntryNode/TreeNode存储结构数组+单向链表数组+单向链表/红黑树插入方式头插法尾插法扩容时机先扩容再插入先插入再扩容hash 算法4次位运算+五次异或1次位运算+1次异或插入方式数组+单向链表数组+单向链表/红黑树以下分析均基于 Java 8.1.1 HashMap 的主要成员变量HashMap 中

2021-11-08 01:57:19 180

原创 Java中的按位操作符

最近看 JDK 的源码, 看到一些 按位运算(Bitwise Operators), 这里做个总结.1 按位运算符汇总OperatorDescription&Bitwise AND(按位与)|Bitwise OR(按位或)^Bitwise XOR(eXclusive OR, 按位异或)~Bitwise Complement(按位取反)<<Left Shift(左移)>>Signed Right Shift(有符

2021-11-07 13:21:45 318

原创 Spring 框架实战: TaskExecutor

1 ThreadPoolTaskExecutor使用 ThreadPoolTaskExecutor 可以实现一个 TaskExecutor.下面看个示例, 基于 ThreadPoolTaskExecutor 实现方法的异步调用.写一个配置类 提供线程池:@Configuration@ComponentScan("cn.mitrecx.learn4advance.executor")@EnableAsync // 开启异步任务支持public class TaskExecutorConfig i

2021-10-06 18:37:06 740

原创 Spring 框架实战: 常用配置

1 Bean 的 ScopeScope 描述的是 Spring 容器如何创建 Bean 实例的.Spring 的 @Scope 的 value 取值常见的有以下几种:singleton: 一个 Spring 容器中只有一个 Bean 的实例, 全容器共享一个实例. @Scope 的默认值就是 Singleton.prototype: 每次调用新建一个 Bean 实例.request: web 项目中, 给每一个 http request 新建一个 Bean 实例.session: web 项

2021-10-06 12:19:32 78

原创 Spring 框架实战: AOP

1 概述Spring 的切面编程由 AspectJ 提供支持.AOP 需要了解的基础:使用 @Aspect 声明一个切面.@After, @Before, @Around 定义 建言(advice); 这 3 个注解的参数 就是 切点(PointCut) , 所谓 切点 其实就是一个 拦截规则.可以把 切点 用 @PonitCut 来定义, 然后放到 @After, @Before, @Around 当参数, 这样可以复用切点.符合 拦截条件 的每一处 也是 连接点(JoinPoint).

2021-10-06 00:25:18 90

原创 Spring 框架实战: Hello World

这篇博客用到的所有代码已经放在 GitHub 上.1 Spring 概述Spring 版本历史(参考 wiki-Version history):VersionDateNotes0.920031.0March 24, 2004First production release.2.020063.020094.020135.02017目前(2021-10-5) Spring Framework 的最新 GA(general

2021-10-05 18:42:58 459

原创 PostgreSQL 事务与并发控制

当多个事务并发执行时, 即使每个 单独的事务 都正确执行, 数据库的一致性也可能被破坏.为了控制 并发事务 之间的相互影响, 解决并发可能带来的数据不一致问题, 数据库的并发控制系统 引入了 基于锁的并发控制(Lock-Based Concurrency Control) 和 基于多版本的并发控制机制 MVCC (Mult-Version Concurrency Control).1 事务事务 是 数据库系统 执行过程中最小的逻辑单位.当事务被提交时, 数据库管理系统 要确保一个事务中的 所有操作都

2021-10-05 00:59:43 408

翻译 Dropwizard 框架概述

原文地址.Dropwizard 跨越了 作为库和框架 之间的界限.(Dropwizard straddles the line between being a library and a framework.)它的目标是为生产就绪的(production-ready) web 应用 提供高性能, 可靠的实现.因为此功能被提取到一个可重用的库中, 所以你的应用程序能够 保持精简和专注, 减少了上市时间(time-to-market)和维护负担.1 通过 Jetty 使用 HTTP因为一个 web 应

2021-10-04 11:54:21 602

原创 PostgreSQL 入门

1 简介PostgreSQL 是由 PostgreSQL 社区全球志愿者开发团队开发/维护的 对象-关系型数据库管理系统(Object-Relational DataBase Management System).PostgreSQL 源于 UC Berkeley 1997 年的 Ingres 计划.在1994 年, 两个 UC Berkeley 的研究生 Andrew Yu 和 Jolly Chen 增加了一个 SQL 语言解释器来替代 基于 Ingres 的 QUEL 系统, 建立了 Postgr

2021-10-03 23:33:06 1941

原创 并发编程基础知识

1 什么是并发编程并行: 同一时刻, 多个任务同时执行.(一个 CPU 核 处理一个任务)并发: 一个时间段内, 多个任务都在执行, 并且都没有执行结束. (一个 CPU 核处理多个任务)在多线程编程中, 线程的个数往往多于 CPU 的个数, 所以一般称之为 并发编程.并发编程可以提高系统性能, 提高吞吐量.2 线程安全问题共享资源: 多个线程都可以访问的资源. 或者说, 多个线程共享的资源.线程安全问题是指:当多个线程同时 读写 一个 共享资源 并且没有采取同步措施时, 导致出现 脏数据

2021-10-03 00:56:29 183

原创 Java Thread 类学习-1

在上一篇博客中介绍了 由 Object 提供的 线程通知与等待 功能.这篇博客, 探索一下 Thread 提供的控制线程(运行)的方法.1 汇合子线程结果的 join 方法join 翻译为中文是 “结合, 汇合, 连接, 参加…”;Thread 里的 join 的含义就是 汇合 的意思. 主线程 调用了 子线程的 join 方法后, 主线程会阻塞直到 子线程执行完毕; 这可以理解为 主线程要汇合子线程的结果.Thread 类中提供了 3 个 join 方法, 方法签名如下:// 等待 [mill

2021-10-02 19:06:46 88

原创 Java 线程通知与等待

Java 中的 java.lang.Object 类是所有类的父类.Java 把所有类都需要的方法放到了 Object 类里面, Object 类里的非private的方法有:getClasshashCodeequalsclonetoStringnotify 系列(包含 notify, notifyAll)wait 系列finalizeJava 线程的 “通知-等待” 就是通过 notify 系列 和 wait 系列 的方法实现的.1 wait 系列方法1.1 wait(long

2021-10-02 14:58:25 337

原创 Java集合框架概述

主要参考 Collections Framework Overview 这个文档.翻译水平有限, 如有错误, 恳请指正, 不胜感激????.1 简介集合是一个 表示一组对象 的对象(A collection is an object that represents a group of objects).Java 平台包含一个 集合框架(collections framework).集合框架 是一个 表示和操作集合的 统一体系结构(unified architecture), 使集合能够独立于实现

2021-09-28 00:13:06 127

原创 用 ZooKeeper 搭建一个集群

Zookeeper 官网的 Overview 部分有对 Zookeeper 的概述.下面是一些我学习 zookeeper 的笔记, 内容不在乎全面, 而在乎精简.Zookeeper 简介Zookeeper 是一个开源的, 用于 分布式应用 的 分布式协调服务.(A Distributed Coordination Service for Distributed Applications).Zookeeper 的 数据模型(Data model) 是 层次的命名空间(the hierarchical

2021-09-25 22:23:50 118

原创 Chrome 快捷键

1. Open new tabCommand + T.For PC, Ctrl +T.2. Close current tabCommand + W.For PC, Ctrl + W.3. Reopen last tab closedCommand + Shift + T.For PC, Ctrl + Shift + T.ReopenLastTab-01.png4. View next/previous tabCommand + Option + right/left arrow.F

2021-09-19 11:04:55 109

原创 Decorator Pattern

1 设计原则开放-关闭原则: 对扩展开发, 对修改关闭.2 装饰者模式动态地将 功能/责任 附加到对象上.想要扩展功能, 装饰者提供有别于继承的另一种选择.

2021-09-19 00:13:03 43

原创 Maven 常用命令和依赖介绍

运行 Maven 的语法:mvn [options] [<goal(s)>] [<phase(s)>]

2021-09-18 23:46:18 1332

翻译 Apache Maven 简介

以下内容翻译自 Apache Maven 官网.1 Welcome to Apache MavenMaven 是一个软件项目管理工具. 基于 项目对象模型(project object model, POM), Maven 可以 通过一块中央信息 来 管理项目的 构建(build), 报告(reporting) 和 文档(documentation)....

2021-09-17 23:51:32 1830

原创 Observer Pattern

1 设计原则为交互对象之间的 松耦合设计 而努力.2 观察者模式在对象之间定义 一对多 的依赖, 当一个对象改变状态时, 依赖它的对象都会收到通知, 并执行自己的逻辑.使用观察者模式时, 有人在实例化观察者时 传入 subject 对象, 并把当前的观察者对象注册到 subject 中, 比如示例1 和 示例2.也有人在实例化观察者时 不传入 subject 对象, 只是单纯的实例化一个观察者, 然后再通过 subject 的 register() (或 add()) 方法注册到 subject

2021-09-17 00:05:58 44

原创 Strategy Pattern

策略模式(Strategy Pattern) 是一个非常常用的设计模式. 只要是 面向对象编程(Object-oriented programming) 就少不了策略模式的身影.1 设计原则封装变化.多用组合(composition), 少用继承(inheritance).针对接口编程(多态), 不针对实现编程.2 策略模式定义一个算法接口;把不同的算法封装起来;各个算法之间可以相互替换;算法的调用者 不用了解 算法的细节 和 算法的变化.参考 <Head First 设计模式&g

2021-09-16 23:10:54 58

原创 动态规划(Dynamic Programming)

Dynamic programming, like the divide-and-conquer method, solves problems bycombining the solutions to subproblems. (“Programming” in this context refersto a tabular method, not to writing computer code.)动态规划 和 分治法 相似, 都是通过 组合子问题的解 来 求解原问题. (“programing”

2021-09-15 01:04:23 76

原创 算法基础-快速排序

与 归并排序 一样, 快速排序 也使用了 分治思想(divide-and-conquer paradigm).对于包含n个元素的数组来说, 快速排序是一种 最坏情况时间复杂度 O(n2), 平均时间复杂度 O(n*lgn).1 快速排序描述下面是对一个子数组 A[p..r] 进行快速排序的分治过程:分解: 数组 A[p..r] 被划分为两个(可能为空)子数组 A[p..q-1] 和 A[q+1..r] , 使得 A[p..q-1] 中的每一个元素都小于等于 A[q] , 而 A[q] 也小于等于 A

2021-09-14 00:56:11 202

原创 算法基础-堆排序

堆排序(heapsort) 和 归并排序 一样, 它的时间复杂度也是 O(nlgn).回忆一下, 归并排序 使用的 算法设计方法: 分治法.而 堆排序 使用另一种算法设计技术: 使用 堆(heap) 的数据结构进行信息管理.虽然 堆 这一词源自 堆排序, 但是目前它已经被引申为 “垃圾收集存储机制”, 比如 Java 中内存模型的 堆 结构.1 堆在介绍堆之前, 需要了解 树 的基础知识. 若已了解, 直接看 1.2. 1.1 树的基础知识对于一棵有根树 T(根为r) 中的 结点x, x 的

2021-09-13 23:44:16 131

原创 算法基础-归并排序

在介绍 归并排序(merge sort) 算法之前, 我们先学习一下 分治法 .

2021-09-12 18:47:55 170

原创 算法基础-排序

很多计算机科学家认为 排序 是 算法研究中最基础的问题[1].如果输入数组中仅有 常数 个元素需要在排序过程中存储在数组之外, 则称排序算法是 原址的(in place).比较排序: 在排序的最终结果中, 各元素的次序依赖于它们之间的 比较.非比较排序(运算排序): 用 运算 而不是比较来确定排序顺序.下表总结了常见的比较算法:算法特性描述最坏情况运行时间平均情况运行时间冒泡排序原址, 比较O(n2)O(n2)梳排序原址, 比较O(n2)O(n2/2p)

2021-09-12 18:25:34 78

原创 算法导论12章-二叉搜索树(Binary Search Trees)

这是我的第一篇 算法导论(Introduction to Algorithms, Third Edition) 读书笔记. 旨在记录重点, 强化自己对算法的学习效果.这里不会像书本那样详细, 给出复杂的推理证明, 这里只是一点学习心得.我看到是 算法导论(中文版) 的书, 这里有原著(提取码:cz4v)(英文版PDF) 可以对照阅读.1 什么是二叉搜索树一棵 二叉搜索树(BST) 是以一棵 二叉树 来组织的.二叉搜索树 可以使用一个 链表数据结构(linked data structure ) 表

2021-09-12 00:44:50 702

原创 LeetCode95: Unique Binary Search Trees II

1 问题问题描述:Given an integer n, return all the structurally unique BST’s (binary search trees), which has exactly n nodes of unique values from 1 to n. Return the answer in any order.Example 1:Input: n = 3Output: [[1,null,2,null,3],[1,null,3,2],[2,1,3],

2021-09-11 12:08:06 90

原创 Singleton Pattern

1 单例模式单例模式(Singleton Pattern) 属于 创建型模式. 它提供了一种创建对象的方法.为什么需要单例模式?避免一个全局使用的类频繁地创建实例并销毁.单例模式的关键点:只创建一个实例.实例被 static 关键字修饰(Java).类的构造方法是私有的.实现单例模式主要有3种方法: 饿汉式, 双重检查加锁, 懒汉式.2 饿汉式饿汉式 是使用较多的一种方式. 在类加载时就初始化实例.因为通常我们实例化一个对象都会使用它, 所以提前实例化和使用时再实例化没有什么区别.

2021-09-11 00:23:51 51

原创 设计模式简介

1994年, 四位作者Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides 出版了一本名为 “Design Patterns - Elements of Reusable Object-Oriented Software”(译作 “设计模式-可重用面向对象软件的基础”)的书, 该书开创了软件开发中设计模式的概念.这些作者统称为四人帮(GOF). 根据这些作者的观点, 设计模式主要基于以下面向对象设计原则:Program to an interf

2021-09-09 01:22:44 99

原创 Linux基础备忘单

正确查看方式: Ctrl + F0 Linux目录名称这里列举一些常见的:/ 虚拟目录的根目录, 通常这里不会存储文件./bin 二进制目录, 存放用户级的命令./sbin 系统二进制目录, 存放管理员级的命令./boot 存放系统启动相关的文件./dev 设备目录./etc 系统配置文件目录./lib 库目录, 存放系统和应用的库文件./mnt 挂载目录, 放在挂载点文件./opt 可选目录, 存放第三方软件包和数据./proc 进程目录, 放硬件和当前进程相关的文件./sys

2021-09-08 23:45:15 78

原创 gawk进阶

如果对 gawk 不了解, 先阅读 初识gawk 这篇博客.1 使用变量gawk 编程语言支持两种不同类型的变量:内建变量自定义变量1.1 内建变量(built-in variables)查看 gawk 的所有内建变量, 可以通过 man gawk 然后搜索 Built-in Variables.这里列举一些常用的内建变量:变量描述FIELDWIDTHS由空格分隔的一列数字, 定义了每个数据字段的确切宽度(field widths)FS输入字段分隔符(inp

2021-09-08 21:20:46 243

原创 初识gawk

shell 脚本最常见的用途之一是处理文本文件.检查日志文件, 读取配置文件, shell 脚本可以帮助我们将一下日常处理任务自动化. sed 和 gawk 工具可以极大简化文本数据处理任务.sed 是 流编辑器(stream editor).普通的交互式文本编辑器(如vim): 用键盘命令交互地插入, 删除, 替换文本;流编辑器: 在编辑器处理数据基于 预先提供的一组规则.sed 虽然功能强大, 但是今天我们不介绍它.因为我们要介绍一个更强大的 gawk.1 gawk 简介gawk 是 U

2021-09-07 22:51:24 384

原创 呈现数据-重定向

前面有 一篇 blog 简单介绍过重定向, 当时介绍的很浅, 现在让我们深入了解 重定向.1 标准文件描述符Linux 用 文件描述符(file descriptor) 来标识每个文件对象.文件描述符 是一个非负整数, 可以唯一标识 会话 打开的文件. 每个 进程 一次最多可以有 9 个 文件描述符.bash shell 保留了前三个文件描述符( 0, 1, 2 ):文件描述符缩写描述0STDIN标准输入1STDOUT标准输出2STDERR标准错误

2021-09-07 00:02:17 260

原创 shell 脚本处理用户输入

bash shell 脚本提供了3种从 用户处 获取数据的方法:命令行参数(添加在命令后的数据)命令行选项直接从键盘读取输入1 命令行参数像 shell 脚本传递数据的最基本方法是使用 命令行参数.示例:./add.sh 10 20本例向脚本 add.sh 传递了两个 命令行参数(10 和 20).1.1 读取命令行参数bash shell 中有一些特殊变量, 被称为 位置参数(positional parameter).位置参数的标准数字是:$0 是程序名;$1 是第一个参

2021-09-05 23:29:05 2740

原创 Linux结构化命令之循环语句

1 for 命令for 命令的基本格式:for var in listdo commandsdone在 list 参数中, 需要提供迭代中要用到的 一系列值.每次迭代, 变量 $var 会包含 list 的当前值.do 和 done 语句之间是每次迭代需要执行的命令(组).for 命令读取列表中的值:$ cat temp.sh#!/bin/bashfor var in hello world; do echo value: $vardone$ ./temp.sh

2021-09-05 12:54:58 489

空空如也

空空如也

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

TA关注的人

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