自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(116)
  • 收藏
  • 关注

原创 JVM基础知识之垃圾回收

一 可达性分析方法在Java虚拟机中定义了一些不会被回收的对象,叫做GcRoots,从GcRoot中出发,标记可以到达的对象,如果对象可以被标记,这个对象就还是存活的,否则就是需要被回收的1.1GCRoots的分类虚拟机栈中的对象本地方法栈中的对象方法区中常量引用的对象方法区中静态属性引用的对象被同步锁持有的对象临时性加入的对象1.2 引用的分类强引用: 被new出来的对象,在内存不够的时候也不会被回收,而是抛出异常软引用: 一些有用但是非必须的对象,在内存不够的时候会把这些对象放入到

2020-06-11 08:51:01 144

原创 207. 课程表

(1)从队列中取出课程0,将count加1,现在count = 4。(2)课程0没有邻接课程,队列变为空。

2024-03-09 23:56:21 459 1

原创 【分治算法】运算的优先级

解决上述算法题利用了分治思想,以每个运算符作为分割点,把复杂问题分解成小的子问题,递归求解子问题,然后再通过子问题的结果计算出原问题的结果。

2023-12-18 23:31:45 379

原创 【算法题】前缀树

一 概念前缀树刚开始就有一个头节点,遍历每一个字符串,构建出来头节点向每一个节点的路径。end表示这个节点是否是尾巴节点,count表示经过这个节点的字符个数。二 实现TreeNode结构Class TrieNode{ public int pass; public int end; public TrieNode[] nexts; public TrieNode(){ pass = 0; end = 0; nexts = new TrieNode[26]; }}

2022-05-01 23:25:41 168

原创 【算法题】并查集

一 概念先开始只有a,b,c等多个集合,对外提供两个操作boolean isSameSet(a,b)//判断a和b是否是一个集合void union(a,b) //将两个集合合并为同一个集合底层的数据结构: 链表查询的时候:1、找到节点a对应初始的node2、找到节点b对应的初始node3、如果节点a和节点b初始化节点不一致,则a节点和b节点不是一个集合,否则就是一个集合。并集的时候:1、找到a、b的初始节点,将某一个初始节点挂在另一个初始节点下。二 代码Class Node

2022-05-01 21:39:23 719

原创 【redis】持久化相关

一 配置redis持久化机制分为两个模块,RDB和AOF两个模块,RDB是对Redis中的数据快照的存储,AOF是对命令的记录。redis aop的配置appendonly yes //开启AOF配置appendfsync Always //每一个命令写完后,不仅写入AOF文件的缓冲区,还写入到磁盘中appendfsync No // 每一个命令写完,只写入到AOF文件的缓冲区,什么时候放入到磁盘由操作系统决定appendfsync everysecond //每一次命令写完,只写入A

2022-04-18 00:33:51 197

原创 【网络】网络相关知识

一 TCP协议分层从上到下,分为四层:应用层传输层网络层数据链路层物理层二 TCP协议可靠的原因2.1 滑动窗口机制和超时重传机制2.1 拥塞控制2.2 超时重试三 TCP协议握手3.1 握手流程3.2 为什么要三次握手(1)两次握手无法保证服务端的发送是正常的,从服务端的角度看,服务端要知道我发送功能是正常的,这个功能只能是服务端发送数据,客户端接收后进行ACK后,服务端才能确保我本身发送功能是正常的。(2)防止已经失效的请求建立链接。四 TCP挥手

2022-04-17 23:36:05 80

转载 海量数据的处理

一 背景所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/trie树。针对空间,无非就一个办法:大而化小,分而治之(hash映射)。二 数据结构BitMap(1)布隆过滤器、BItMap如果一个数据不再布隆过滤器里面,则一定不存在。如果一个数组判断在布隆过

2022-04-17 21:45:28 639

原创 【redis】redis的数据结构

一 压缩列表压缩列表是List、Hash、SortSet的底层实现。如果我们要查找定位第一个元素和最后一个元素,可以通过表头三个字段的长度直接定位,复杂度是 O(1)。而查找其他元素时,就没有这么高效了,只能逐个查找,此时的复杂度就是 O(N) 了。二 跳跃表跳表在链表的基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位,如下图所示:这个查找过程就是在多级索引上跳来跳去,最后定位到元素。这也正好符合“跳”表的叫法。当数据量很大时,跳表的查找复杂度就是 O(logN)。Has.

2022-04-17 20:00:35 527

原创 【redis】redis的架构

一文件事件处理器二 redisIO多路复用2.1 IO类型同步阻塞: 调用方阻塞在缓冲区中同步非阻塞(IO多路复用): 查询缓冲区是否有数据,如果没有数据,直接返回。异步非阻塞: 缓冲区如果有数据,会调用调用方留下的接口通知调用方。select函数在Linux中,我们可以使用select函数实现I/O端口的复用,传递给select函数的参数会告诉内核:我们所关心的文件描述符对于每一个文件描述符,我们所关心的状态我们要等待多长时间从select函数返回后,内核告诉我们下面信息

2022-04-17 19:39:48 756 1

原创 【MySQL】慢查询优化

一 SQL的执行过程1、首先查询缓存(这一步骤新版本MYSQL已经不用了)2、解析器进行解析3、优化器进行优化4、执行语句二 慢查询2.1 慢查询的危害慢查询–>连接池打满–>超时异常–>操作失败–>用户重试–>情况继续恶化–>MySQL继续恶化2.2 索引的结构1、每一个数据页都是16K,仅仅叶子节点存储数据。2、多叉树,减少层高,减少IO的次数。3、叶子节点之间是双向链表。B+树的优点:1、减少了层高,减少了IO次数。2.3 慢查询的优化

2022-04-17 15:18:41 865

原创 【数据库和缓存】数据库和缓存一致性的保证

一 方案一 缓存不设置失效期写入: 先写入数据库,发送MQ,缓存监听MQ更新缓存。读取: 只读取缓存。二 缓存和数据库操作的解析缓存可以更新、删除、数据库只能更新。所以一共有四个方案:(1)更新数据库、更新缓存(2)更新缓存、更新数据库(3)删除缓存、更新数据库(4)更新数据库、删除缓存二 方案二 先更新缓存、更新数据库(错误方案)线程A更新缓存–>线程B更新缓存–>线程B更新数据库–>线程A更新数据库。这种情况下会导致数据库被错误覆盖。三 方案三 先删除缓存、在

2022-04-16 19:48:36 466

原创 【系统设计】数据库和Kafka保证一致性

一 背景写DB后发消息,如何保证两者的一致性性?二 方案2.1 事务(错误方案)写DB和发消息通过事务保证,发消息失败后,数据库进行回滚。这种情况下,如果发消息超时、但是发送成功了,会导致数据库进行回滚、但是消息发送成功了。2.2 引入binlog机制核心思想是将分布式事务简化为本地事务+重试+下游调用方幂等。步骤1、DB写入,写入消息记录表。2、监听消息记录表的binlog,发送数据。3、如果数据发送成功,更新消息记录表。4、定时拉取消息记录表中的数据,发送消息。消息记录表C

2022-04-15 10:56:44 2464

原创 JVM之内存模型

一 内存模型堆: 存放new出来的对象堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成。静态变量(class static variables)以及运行时常量池(runtime constant pool)在堆中存储方法区: 存放对应Class对象,方法区市一个概念,实际存

2022-04-11 00:38:08 252

原创 【Java基础】线程阻塞的方法

Thread.sleep()和Object.wait()的区别(1)Thread.sleep()不会释放占有的锁,Object.wait()会释放占有的锁;(2)Thread.sleep()必须传入时间,Object.wait()可传可不传,不传表示一直阻塞下去;(3)Thread.sleep()到时间了会自动唤醒,然后继续执行;(4)Object.wait()不带时间的,需要另一个线程使用Object.notify()唤醒;(5)Object.wait()带时间的,假如没有被notify,到时间

2022-04-10 22:46:54 2199

原创 【Java基础知识】Future的实现

一 线程池的提交方式在向线程池提交线程的时候,有两个方法,一个是executor(Runnable runnable)方法,另一个是submit(Runnable runnable)方法, Future<Integer> result = executor.submit(task); //有返回值 executor.executor(task) //没有返回值二 Runnable、Callable、FutureTask的使用(1) Runnable是一个任务的概念,这个任务

2022-04-10 22:42:25 1050

原创 【Java基础知识】ThreadLocal

一 Java中的引用关系Java中的引用分为了强引用、弱引用、软引用、虚引用强引用: 垃圾回收的时候,如果内存不足也不会进行垃圾回收,会报out-of-memory异常弱引用: 垃圾回收的时候,如果内存不够,则数据被回收.软引用: 垃圾回收的时候,软引用会立刻进行回收虚引用: 垃圾回收的时候,软引用会立刻进行回收二 ThreadLocal代码实现ThreadLocal是线程本地变量,存储在ThreadLocal里面的数据都是线程安全的.一般ThreadLocal适用的场景多是各个线程间没

2022-04-10 17:42:31 1652 2

原创 JDK8中的HashMap

一 二叉树1.1 二叉查找树(BST)二叉查找树是一种支持数据快速查找的数据结构,结构如下图查询的效率为O(lgn),但是在极端情况下查询的效率会退化为O(n),如下图所示,二叉查找树已经退化为了链表1.2 红黑树二叉查找树存在不平衡的问题,学者提出通过树节点的自动旋转和调整,让二叉树始终保持基本平衡的状态,就能保持二叉查找树的最佳查找性能了红黑树,这是一颗会自动调整树形态的树结构,比如当二叉树处于一个不平衡状态时,红黑树就会自动左旋右旋节点以及节点变色,调整树的形态,使其保持基本的平衡状态

2020-10-12 00:49:03 166

原创 搜索算法之DFS和BFS

一 常见的搜索算法1.1 广度优先搜索概念以根节点为起点,访问和根节点相关的节点,然后依次访问根节点引入的节点的相关的节点上图广度优先搜索的顺序分别是(1,2,3,4,5,6,7,8,9,10)代码1.2 深度优选搜索概念从根节点开始,选择一个路径进行遍历,直到当前路径被遍历完成后,再去选择另一个路径代码1.3 常见算法题1.3.1 二叉树的层级遍历(1) BFS方式class Solution { public List<List<Integer&gt

2020-10-10 08:36:46 172

原创 MySQL中的锁事

一 并发带来的问题脏读一个事物A读取到了一个事物B没有提交的数据不可重复读一个事物读取一个数据,过一个时间段后再读取这个数据,发现读取的数据的值发生了变化幻读一个事物按照相同的数据查询,读取到被另一个事物写入满足条件的数据到数据库中的数据二 事物的隔离级别读未提交读已提交可重复读串行化三 事物的隔离级别的实现数据库事物的隔离级别的实现,分为两类加锁:读取数据之前,对其加上锁,防止另外数据读取MVCC: 不加任何锁,采用多版本并发控制3.1 数据库锁3.1.1 数

2020-06-29 08:58:05 143

转载 MySQL锁分析之可重复读级别

一 可重复读和可已提交的隔离级别区别可重复读最主要的是解决了幻读的问题,幻读的解决是使用的GAP锁二 锁分析的主要内容2.1 使用主键进行等值查询(1)使用SELECT … LOCK IN SHARE MODE来为记录加锁SELECT * FROM hero WHERE number = 8 LOCK IN SHARE MODE;主键具有唯一性质,所以不存在幻读的问题,所以只需要添加一个行锁就行如果需要查询主键不存在的记录,比如说SELECT * FROM hero WHERE numbe

2020-06-26 00:43:54 1402

原创 MySQL锁分析读已提交级别下的锁分析

一 事前准备CREATE TABLE hero ( number INT, name VARCHAR(100), country varchar(100), PRIMARY KEY (number), KEY idx_name (name)) Engine=InnoDB CHARSET=utf8;建立一个表,其中人员编号是主建

2020-06-25 21:18:43 2254

原创 Java中的线程安全

当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的一 线程安全的实现方法互斥同步互斥同步(Mutual Exclusion & Synchronization)是一种最常见也是最主要的并发正确性保障手段。同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一条(或者是一些,当使用信号量的时候)线程使用.在Java里面,最基

2020-06-17 01:39:26 162

原创 Java内存模型

一 Java内存模型Java内存模型是为了让Java程序在各个平台下都可以达到一致的内存访问效果,之前的c语言和c++语言直接使用物理硬件和操作系统的内存模型,可能会导致程序在一套平台上并发正常,在另一个平台上并发异常1.1 主内存和工作内存Java规定了全部线程共享的变量存放在主内存中,但是Java线程都有一个工作内存,线程对变量的操作都必须在工作内存中执行1.2 内存之间的交互操作Java规定了从工作内存到主内存的操作流程,一共有8个操作,每一个操作都是原子性的lock(锁定)作用在主

2020-06-16 08:42:18 190

原创 JVM中类的加载机制

一 类加载的时机一个类被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载,验证,准备,解析,初始化,使用和卸载七个阶段对类必须进行初始化的几个操作1.new一个对象或者调用对象的静态方法时候2.反射调用时候3.对类初始化的时候,如果父类没有初始化,需要对父类进行初始化4.定义了JDK8新加入的默认方法,如果有这个接口实现类发生了初始化,那么这个接口需要在其之前被初始化,在一个类进行初始化的时候,要求弗雷...

2020-06-14 21:52:22 71

原创 多线程设计模式基础

不变模式一个类的内部状态创建后,在整个生命周期都不会发生变化,就是不变类不变模式不需要同步public final class Product{ //确保无子类 private final String no; //私有属性,不会被其他对象获取 private final String name; //final属性保证不会被两次赋值 priva

2017-10-02 20:58:01 215

原创 锁的优化

减少锁持有时间public synchronized void syncMethod(){ othercode1(); mutextMethod(); othercode2();}上述代码中,只有第二个方法需要同步,所以需要将锁加载第二个方法中中去public void syncMethod2(){ othercode1(); synchronized(t

2017-10-02 13:21:44 182

原创 线程池的基本使用

简单线程池的实现ThreadPool实现package six;import java.util.List;import java.util.Vector;public class ThreadPool { private static ThreadPool instance = null; //空闲的线程队列 private List<Worker> idleThreads

2017-09-30 18:45:42 860

原创 JDK并发包委婉

ReentrantLock 重入锁 可中断 可限时: tryLock(等待的时间,时间的大小) 公平锁:ReentrantLock(boolean fair)Condition await(),线程等待 signal(),唤醒线程Semaphore() 允许多个线程同时进行操作package dayfirst;import java.util.concurrent

2017-09-30 13:51:27 330

原创 JAVA内存模型和线程安全

原子性 一个或者一组连续的操作,不可间断的。有序性 计算机真实执行代码的时候,不一定会按照书写的语序进行。 指定重排:不会破坏语义,但是可以使得流水线更加流畅。可见性问题 可见性指的当一个线程修改了某一个共享变量,其他线程能够立即知道这个修改。Happen-Before程序顺序原则 一个线程内保证语义的串行性 volatile规则 volatile变量的写,先发生于读锁

2017-09-29 22:05:11 277

原创 多线程基础

重排序对多线程的总结package ReorderExample;public class RecordExample { int a = 0; boolean flag = false; public void write() { a = 1; //1 flag = true; //2 } public void reader

2017-09-28 21:24:54 169

原创 Java反射总结

反射获取Class的对象的方法 Class类中的静态方法 Class.forName(类的全限定名) Class类包含: 子段:Field 成员方法:Method 构造方法:Constroctor利用构造方法构造对象 第一步:利用·Class,forName()方法得到Class对象 第二步:利用Class对象得到构造器对象Constructor对象 第三部:

2017-09-15 07:41:34 273

原创 注释的总结

DAO层@Parampackage Mapper; public interface Mapper { @Select("select s_id id,s_name name,class_id classid from student where s_name= #{aaaa} and class_id = #{bbbb}") public Student select(@Param(

2017-09-02 18:27:35 262

原创 字典树

字典树又叫做单词查找树,是一种树形结构,是一种哈希树的变种,典型应用于统计,排序,和保存大量的字符串,所以常被搜索引擎用于文本词的统计。它的优点是利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较,查询效率比哈希树高。性质它有三个基本性质根节点不包含字符除了根节点外的每一个节点都包含一个字符; 从根节点到某一个节点,路径上的字符连接起来,为该节点对应的字符串 每个节点的所有子节点

2017-09-02 16:10:26 271

转载 HashMap代码解析

Map先看一下jdk中map的定义public interface Map<K,V>{ int size(); boolean isEmpty(); boolean containsValue(Object value); V get(Object key); V put(K key, V value); void putAll(Map<? exten

2017-08-20 15:29:59 247

原创 Java常见的辅助函数使用

成员函数的使用Random 产生随机数的类构造方法: public Random();//没有给种子,用的是默认种子,当前时间的毫秒值 public Random(long seed);//给出指定的种子 给定种子后每次得到的随机数相同成员方法 public int nextInt();//返回的是int类型的随机数 public int nextInt(int n

2017-08-16 10:10:09 633

原创 java遇到的问题总结

编译错误 解决方式: http://blog.csdn.net/qq_27093465/article/details/52795186在IDEA中产生不能找到xml文件的方式解决方式一 在Resource文件中建立xml问价(这种方式测试没有成功) 解决方式二 在pom配置文件中添加如下 <resources> <resource>

2017-08-16 07:14:33 341

转载 Java集合框架

Java集合工具在Java.util包下,包含了很多常见的数据结构。可以分为List集合, Set集合,Map映射,迭代器和工具类(Arrays,Collections).Java集合的框架可以显示如下 从上图中可以看出,集合主要分为两大类:Collection和Map。Collection是List和Set高度抽象出来的接口,包含了这些集合的基本操作。List接口通常表示为一个列表(数组,队列等

2017-08-14 08:58:16 197

原创 水管工游戏

游戏规则 一块矩形土地被分隔N*M的单位正方形,现在这块土地上已经埋设一些水管,水管将从坐标(1,1)的矩形土地的左上角左部边缘,延伸到坐标(N,M)的矩形土地的右下角边缘。水管只有两种。一种弯的,一种直的。 每种管道将占据一个单位正方形土地。你现在可以旋转这些管道,使得其构成一个管道系统。标有树木的方格表示这里没有管道。 输入的第一行为两个整数N和M,接下来输入N行,每行有

2017-07-26 05:05:15 391

原创 广度优先搜索解决迷宫问题

依旧是用一个二维数组来存储这个迷宫。最开始的时候小哼在迷宫的(1,1)处,它可以往右走或者往下走。深度优先是一直往右(下)走,直到走不通的时候回到这里。可以使用下面的方法: 通过”一层一层”扩展的方法来找到小哈。扩展的时候发现一个点就将这个点加入到队列中,直到走到小哈的位置(p,q)停下。用一个结构体实现队列struct note{ int x;//横坐标 int y;//

2017-07-26 02:23:41 779

空空如也

空空如也

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

TA关注的人

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