自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 常用数据结构与算法总结(含例题和完整代码)

一、位运算● ^ 可理解为不进位相加● a^a=0● a^0=a题目一一组数中,只有一个数出现的次数是奇数,其他数字出现的次数都为偶数,找出这个出现次数为奇数的数。public static void printOddTimesNum1(int[] arr) { int eor = 0; for (int i : arr) { eor ^= i; } System.out.println(eor);}题目二一组数中,只有两个数出现的次数是奇

2022-04-23 10:28:36 5796 4

原创 常见的设计模式详解

设计模式的类型模式可以分为三大类:创建型模式、结构型模式、行为型模式。GoF的23种设计模式:设计模式的七大原则1、开闭原则(Open Close Principle)开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。2、里氏代换原则(Liskov Substitution Principle)里氏代换

2022-03-06 13:43:01 958 1

原创 juc--并发编程的核心问题总结③

接上篇 juc–并发编程的核心问题总结②一、异步回调1. 什么是异步回调我们平时最常见的是同步回调,同步回调是会阻塞的,单个的线程需要等待结果的返回才能继续执行。假设有两个任务A和B,A任务中需要使用B任务计算成果,有两种方法实现:A和B在同一个线程中顺序执行。即先执行B,得到返回结果之后再执行A。A和B并行执行。当A需要B的计算结果时如果B还没有执行完,A可以先做其他的工作,避免阻塞,过一段时间后再询问一次B。我们可以直接在A中写一个方法对B处理完的结果进行处理,然后B处理完之

2021-11-18 14:39:07 721

原创 Fork/Join的使用与原理解析

一、什么是ForkJoinJava 7开始引入了一种新的Fork/Join线程池,它可以把一个大任务拆成多个小任务并行执行,然后汇总每个小任务的执行结果得到这个大任务的最终结果。Fork/Join任务的原理:判断一个任务是否足够小,如果足够小则直接计算,否则,就分拆成几个小任务分别计算。fork():在当前线程运行的线程池中创建一个子任务;join():模块子任务完成的时候返回任务结果;二、工作窃取大任务被分割为独立的子任务,并且子任务分别放到不同的队列里,并为每个队列创建一个线程来执行队列里

2021-11-18 08:52:08 658

原创 juc--并发编程的核心问题总结②

接上篇 juc–并发编程的核心问题总结①一、读写锁ReadWriteLock

2021-11-16 17:57:41 651

原创 juc--并发编程的核心问题总结①

文章中表明星号的地方说明是需要重点掌握的一、juc基础知识1. 什么是jucjava.util.concurrent (juc是包名的简写)在并发编程中使用的工具类,是关于并发编程的API。2. 线程和进程线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。线程上下文切换比进程上下文切换要快得多。进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源,某进程.

2021-11-15 12:48:20 1027 2

原创 深入理解java中volatile的特性

一、 对volatile的理解1. volatile是java虚拟机提供的轻量级的同步机制。保证可见性不保证原子性禁止指令重排保证可见性什么是可见性?JMM(java内存模型)JMM是一个抽象的概念本身不存在,它描述的是一组规范,通过这组规范定义了程序中各个变量的访问方式。可见性原子性有序性由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所有变量都存储在主内存,

2021-09-15 11:17:48 271 1

原创 java集合源码分析②----LinkedList添加元素的过程

LinkedList底层是一个双向链表由下图源码看看出LinkedList实现了Deque接口,所以LinkedList还可以作为队列和栈来使用。静态内部类Node,表示双向链表的结点:LinkedList添加元素的过程(add过程)final Node l = last; //当前节点的最后一个节点final Node newNode = new Node<>(l, e, null); 定义新节点示例: LinkedList<String> list =

2021-08-12 11:41:27 431

原创 java集合源码分析①----ArrayList

ArrayList集合ArrayList底层就是一个长度可以动态调整的Object数组有一个记录数组长度的size字段数组是默认长度是10,还准备有一个空的数组。ArrayList有一个父类,并实现了List等多个接口(RandomAccess, Cloneable, java.io.Serializable接口中一个方法也没有)无参创建:ArrayList list = new ArrayList();JDK1.7中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度

2021-08-08 13:57:55 139

原创 JAVA中的集合都是线程安全的吗?

2021-07-24 09:56:30 254

原创 JUC---线程间定制化通信

此博客案例来自尚硅谷JUC视频一、线程间的通信实现两个线程(AA、BB),使得AA线程+1,BB线程-1package com.jess.sync;/** * @program: JUC * @description: 线程间的通信 * @author: Jess * @create: 2021-07-23 13:48 **///第一步 创建资源类,定义属性和操作方法class Share { //初始值 private int number = 0; //.

2021-07-23 14:33:16 208

原创 redis数据结构与对象--常见问题

文章目录1. redis中5种数据类型的编码方式是什么?2. 为什么redis不共享包含字符串的对象?3. 为什么有序集合需要同时使用跳跃表和字典来实现?4. 有序集合同时使用跳跃表和字典会浪费内存吗?5. redis是怎样实现内存回收的?1. redis中5种数据类型的编码方式是什么?①STRING(字符串对象):int、raw、embstrint 编码:值可以用 long 类型保存的整数raw 编码:值可以用 long double 类型保存的浮点数embstr 编码:(只读,修改时需转化为

2021-04-26 12:16:09 146

原创 MySQL解决并发事务带来的问题--锁--锁的内存结构

上篇:MySQL解决并发事务带来的问题–锁InnoDB锁的内存结构对一条记录加锁的本质就是在内存中创建一个锁结构与之关联,那么是不是一个事务对多条记录加锁,就要创建多个锁结构呢?如果一个事务要获取10000条记录的锁,就要生成10000个这样的结构,开销就太大了。InnoDB在对不同记录加锁时,如果符合下边这些条件,那么这些记录的锁就可以被放到一个锁结构中:在同一个事务中进行加锁操作被加锁的记录在同一个页面中加锁的类型是一样的等待状态是一样的锁所在的事务信息:哪个事务生

2021-04-19 20:28:09 305 1

原创 MySQL解决并发事务带来的问题--锁

事务相关:MySQL事务的隔离级别与MVCC详解一、锁事务并发执行时可能带来的各种问题,并发事务访问相同记录的情况大致可以划分为3种:读-读情况:即并发事务相继读取相同的记录。写-写情况:即并发事务相继对相同的记录做出改动。读-写或 写-读情况:也就是一个事务进行读取操作,另一个进行改动操作。1. 脏写问题在写-写情况下会发生脏写问题,而任何一种隔离级别都不允许这种问题的发生。所以在多个未提交事务相继对一条记录做改动时,需要让它们排队执行,这个排队的过程其实是通过锁来实现的。这个所谓的锁其

2021-04-19 20:09:53 466 1

原创 MySQL事务的隔离级别与MVCC详解

一、事务的隔离级别先创建一个表:#主键命名为number,而不是id,是想和后边要用到的事务id做区别CREATE TABLE hero (number INT,name VARCHAR(100),country varchar(100),PRIMARY KEY (number)) Engine=InnoDB CHARSET=utf8;INSERT INTO hero VALUES(1, '刘备', '蜀');对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上

2021-04-19 17:21:52 330

原创 MySQL调节磁盘和CPU的矛盾--InnoDB的缓存

一、缓存的重要性对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只不过是InnoDB对文件系统上一个或几个实际文件的抽象,也就是说我们的数据说到底还是存储在磁盘上的。InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以进行读写访问

2021-04-18 15:27:13 384 1

原创 Mysql快速查询的秘籍--B+树索引的使用

上篇 Mysql快速查询的秘籍–B+树索引的理解一、索引的代价空间上的代价每建立一个索引都要为它建立一棵 B+ 树,每一棵 B+ 树的每一个节点都是一个数据页,一个页默认会占用 16KB 的存储空间,一棵很大的 B+ 树由许多数据页组成。时间上的代价每次对表中的数据进行增、删、改操作时,都需要去修改各个 B+ 树索引。增、删、改操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行一些记录移位,页面分裂、页面回收等操作来维护好节点和记录的排序。一个表上索引建的越多,就会占用越

2021-04-10 11:58:46 389 1

原创 Mysql快速查询的秘籍--B+树索引的理解

一、没有索引时的查找SELECT [列名列表] FROM 表名 WHERE 列名 = xxx;1. 在一个页中查找假设目前表中的记录比较少,所有的记录都可以被存放到一个页中。可以根据搜索条件的不同分为两种情况:以主键为搜索条件以其他列作为搜索条件2. 在很多页中查找大部分情况下我们表中存放的记录都是非常多的,需要好多的数据页来存储这些记录。在很多页中查找记录的话可以分为两个步骤:定位到记录所在的页。从所在的页内中查找相应的记录。在没有索引的情况下,不论是根据主键列或者其他列的值

2021-04-10 10:09:55 489

原创 Mysql存储引擎---InnoDB数据页结构

一、数据页结构数据页代表的这块 16KB 大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:一个 InnoDB 数据页的存储空间大致被划分成了 7 个部分,有的部分占用的字节数是确定的,有的部分占用的字节数是不确定的。记录的存储在页的7个组成部分中,我们自己存储的记录会按照我们指定的行格式存储到 User Records 部分。但是在一开始生成页的时候,其实并没有 User Records 这个部分,每当我们插入一条记录,都会从 Free Space 部分,也就是尚未使

2021-04-09 12:17:07 191

原创 一次性理清动态规划---例题图解

一、什么是动态规划?给定一个矩形网络,一个机器人从左上角出发,每次可以向下或向右走一步题目A:求有多少种方式走到右下角(√ 可用动态规划求解)题目B:输出所有走到右下角的路径(× 递归)动态规划题目特点1.计数有多少种方式走到右下角在 n 个数中,有多少种方法选出 k 个数使得和为 sum2.求最值从左上角走到右下角路径的最大数字和给定一个序列,求最长上升子序列长度3.存在性取石子游戏,先手是否必胜能不能选出 k 个数使得和为 sum二、常规解题步骤1. 确定状态

2021-04-03 15:18:23 582

转载 深入理解MySQL索引之B+Tree

正确的创建合适的索引,是提升数据库查询性能的基础。在正式讲解之前,对后面举例中使用的表结构先简单看一下: create table user( id bigint not null comment 'id' primary key, name varchar(200) null comment 'name', age bigint null comment 'age', gender i...

2021-04-01 15:00:22 151

原创 Mysql存储引擎---InnoDB的行格式及行溢出问题

一、局部性原理在InnoDB中,数据会存储到磁盘上,在真正处理数据时需要先将数据加载到内存。表中读取某些记录时,InnoDB存储引擎不需要一条一条的把记录从磁盘上读出来,InnoDB采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB,也就是说,当需要从磁盘中读数据时每一次最少将从磁盘中读取16KB的内容到内存中,每一次最少也会把内存中的16KB内容写到磁盘中。二、InnoDB行格式一行记录可以以不同的格式存在InnoDB中,行格式分别是

2021-03-31 20:37:15 565

原创 MySQL逻辑架构

MySQL逻辑架构大致分为三层最上层并不是MySQL独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。第二层架构,大多数MySQL的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有的内置函数。所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。第三层包含了存储引擎,存储引擎负责MySQL中数据的存储和提取。每个存储引擎都有它的优势和劣势。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同的存储引擎之间的差异,使得这些差.

2021-03-31 19:19:35 102

原创 dubbo整合springboot

一、导入相关依赖在项目中(提供者、消费者)导入通用接口:<dependency> <groupId>com.jess.gmall</groupId> <artifactId>gmall-interface</artifactId> <version>0.0.1-SNAPSHOT</version></dependency>dubbo依赖<dependency> <gro

2021-03-13 12:10:55 711

原创 dubbo环境搭建及基础实践

一、分布式基础理论1.1 什么是分布式系统?分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统。分布式系统(distributed system)是建立在网络之上的软件系统。1.2 发展演变单一应用架构:当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。垂直应用架构:当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。分布式服务架构:当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作

2021-03-11 18:42:55 294 1

原创 多线程的安全问题

1、共享带来的问题多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测。临界区一个程序运行多个线程本身是没有问题的问题出在多个线程访问共享资源。在多个线程对共享资源读写操作时发生指令交错,就会出现问题。一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区。static int counter = 0;static void increment()// 临界区{ counter++;}static void decrement()// 临界区{ coun

2021-03-04 16:39:58 429

原创 多线程常见方法及使用

常用方法sleep 与 yieldsleep调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException异常@Slf4j(topic = "c.TestInterrupt")public class TestInterrupt { public static void main(String[] args) thro

2021-03-02 14:58:45 593

原创 Java多线程基础问题

1. 为什么要使用多线程?(1)更多的处理器核心一个单线程程序在运行时只能使用一个处理器核心,那么再多的处理器核心加入也无法显著该程序的执行效率。相反,如果该程序使用多线程技术,将计算逻辑分配到多个处理器核心上,就会显著减少程序的处理时间,并且随着更多处理器核心的加入而变得更有效率。(2)更快的响应时间可以使用多线程技术,将数据一致性不强的操作派发给其他线程处理(也可以使用消息队列)。这样做的好处是响应用户请求的线程能够尽可能快地处理完成,缩短响应时间,提升用户体验。(3)更好的编程模型Java

2021-03-02 11:20:54 140

原创 Java 深入理解及常见易错点整理

1. 什么是java字节码?它是程序的一种低级表示,可以运行在java的虚拟机上。将程序抽象成字节码可以保证java程序员的代码能够运行在各种设备上。2. Math.abs(-2147483648)的返回值是什么?返回值是-2147483648。这是个奇怪的结果,但是是真的,这是一个整数溢出的典型例子。3. 将double变量初始化为无穷大可以使用java的内置常数Double.POSITIVE_INFINITY//或者Double.NEGATIVE_INFINITY4. 变量使用前未进行

2020-11-09 20:41:55 681

原创 DockerFile的构建和使用

一、DockerFile介绍Dockerfile就是用来构建docker镜像的构建文件,是一段命令参数脚本。构建步骤:编写一个dockerfile文件docker build 构建成为一个镜像docker run 运行镜像docker push 发布镜像(DockerHub 、阿里云仓库)很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像。二、DockerFile构建过程基础知识:每个保留关键字(指令)都是必须是大写字母。指令执行从上到下顺序。# 表示注释。每

2020-11-03 09:00:53 526

原创 Docker容器数据卷及使用详解

一、什么是容器数据卷docker理念:将应用和环境打包成一个镜像。那数据保存在哪里呢?如果数据都在容器中,那么我们容器删除,数据就会丢失。(比如在docker中安装了MySQL,如果容器删除了,数据就没了)需求:数据可以持久化且MySQL数据可以存储在本地。容器之间可以有一个数据共享的技术,将Docker容器中产生的数据,同步到本地,这就是卷技术。(其实就是目录的挂载,将我们容器内的目录,挂载到Linux上面)总结:实现容器的持久化和同步操作,且容器间也是可以数据共享的。(多个容器绑定同一个目

2020-11-01 16:33:26 990

原创 Docker镜像详解(分层理解)

镜像是什么?镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。将所有的应用和环境直接打包为docker镜像,就可以直接运行。如何得到镜像?从远程仓库下载通过拷贝获取自己制作一个镜像DockerFile一、Docker镜像加载原理UnionFs (联合文件系统)我们下载的时候看到分层的下载就是联合文件系统UnionFs:是一种分层、轻量级并且高性能的文件系统,他支持对文件系统

2020-10-30 16:34:40 5007 7

原创 Docker中安装Nginx详细步骤

命令 docker search nginx命令docker pull nginx下载(默认最新版)docker images查看是否下载成功运行测试-d 后台运行–name 给容器命名-p 宿主机端口:容器内部端口 (Nginx默认端口80)查看容器docker ps测试curl localhost:6666...

2020-10-28 20:37:22 302 1

原创 Docker的常用指令

一. 帮助命令docker version #显示docker的版本信息。docker info #显示docker的系统信息,包括镜像和容器的数量docker 命令 --help #帮助命令帮助文档的地址:https://docs.docker.com/engine/reference/commandline/build/二. 镜像命令docker images #查看所有本地主机上的镜像 可以使用docker image ls代替docker search 搜索镜像docke

2020-10-28 20:10:17 181

原创 Docker的工作原理

Docker能做什么?比较Docker和虚拟机技术的不同:传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。容器内的应用直接运行在宿主机的上,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了。每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。Docker是怎么工作的?Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。Docker-Server接收到Dock

2020-10-27 20:13:12 4909

原创 JVM--垃圾回收机制--04垃圾回收器详解

文章目录一、GC分类与性能指标二、不同的垃圾回收器概述三、Serial回收器:串行回收四、ParNew回收器:并行回收五、Parallel回收器:吞吐量优先六、CMS回收器:低延迟七、G1回收器:区域化分代式八、垃圾回收器总结九、GC日志分析十、垃圾回收器的新发展一、GC分类与性能指标按线程数分,GC可以分为串行垃圾回收器和并行垃圾回收器。串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如单CPU处理器或者较小的应用内存等硬件

2020-10-27 17:34:16 337

原创 JVM--垃圾回收机制--03相关概念

文章目录一、System.gc()的理解二、内存溢出与内存泄漏三、Stop The World四、垃圾回收的并行与并发并发五、安全点与安全区域六、再谈引用1. 强引用-- 不回收2. 软引用--内存不足即回收3. 弱引用--发现即回收4. 虚引用--对象回收跟踪5. 终结器一、System.gc()的理解在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。Syste

2020-10-13 20:51:27 218

原创 JVM--垃圾回收机制--02相关算法

一、垃圾回收相关算法垃圾标记阶段:对象存活判断在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。1. 标记阶段:引用计数算法(java没有采用)引用计数算法比较简单,对每个对

2020-10-07 16:32:18 220

原创 JVM--垃圾回收机制--01概述

垃圾回收概述1. 什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空 间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。关于垃圾收集有三个经典问题:➢哪些内存需要回收?➢什么时候回收?➢如何回收?2. 为什么需要GC对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一

2020-10-06 15:30:46 249

原创 JVM--字符串常量池--StringTable

一、String是基本特性String声明为final的, 不可被继承。String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小。String在jdk8及以前内部定义了final char[],value用于存储字符串数据。jdk9时改为byte[]。String不用char[] 来存储,改成了byte[] 加上编码标记,节约了一些空间。StringBuffer和StringBuilder也做了一些修改。

2020-10-05 18:07:24 249

空空如也

空空如也

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

TA关注的人

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