自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL-11:怎么给字符串字段加索引

例如字段email,如果没有在email字段上加索引,就会走全表扫描。在email字段上创建索引的方式: mysql> alter table SUser add index index1(email); 或 mysql> alter table SUser add index index2(email(6));第一种: 索引包含整个email字符串;第二种: 索引只包含email的前6个字节,这个是基于MySQL支持前缀索引。l两种方式存储结构上的区别: 第二种

2020-11-28 00:05:29 10

原创 MySQL-10:MySQL的索引选择

目的: MySQL在执行一个sql时,我们并没有主动指定使用哪个索引,具体的索引选择工作是由MySQL的优化器做的。忘记的可以去看下MySQL的基础架构。第一步: 创建一个表并往里面插入数据,我们插入的数据数量为100000条 CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`),

2020-11-27 00:39:53 12

原创 MySQL-09:普通索引和唯一索引

索引是数据库优化中常用的一种手段,索引有多种种类,有普通索引,唯一索引,主键索引,组合索引,全文索引等,下面主要是来区别普通索引和唯一索引。普通索引的构建: ALTER TABLE `T1` ADD INDEX `k_title` (`title`) USING BTREE ;唯一索引的构建: ALTER TABLE `T2` ADD UNIQUE INDEX `un_index_title` (`title`) USING BTREE ;MySQL的主键不易过长 →追根究底还是非

2020-11-25 00:29:04 12

原创 MySQL-08:事务:可重复读和读提交

事务隔离级别中存在可重复读,在事务启动时会生成一个视图read-view,之后事务中的任何需求数据都会来源于该视图,即使其他事务对某些数据进行了修改,那可重复读隔离又是如何实现的呢?如果一个事务在可重复读隔离级别下,其他事务对某行数据进行了修改,而后当前事务又对那行事务进行修改并读取,那读取的数值还是和事务启动时看见的一样吗?现在,我们就是来来探究这两个问题的,来看图: mysql> CREATE TABLE `t` ( `id` int(11) NOT NULL,

2020-11-24 00:22:50

原创 MySQl-07:行锁

MySQL的行锁是由各个引擎自己实现的,但不是所有引擎都支持,例如MyISAM就不支持行锁,在处理并发性问题的时候就只能使用表锁的方式。InnoDB是支持行锁,这也是它取代MyISAM引擎的原因之一。1.1两阶段锁协议例有如下事务发生,事务A在执行过程中会优先持有id=1和id=2的行锁,等待事务提交的时候才会将持有的行锁释放,事务B才能继续执行,这就是两阶段锁协议。两阶段锁协议: 在事务执行中,会因需请求行锁,请求到锁继续执行,请求不到则阻塞挂起,直到事务提交,再将持有的行锁释放出去。知道上述设

2020-11-21 22:25:13 5

原创 MySQL-06:全局锁和表锁

数据库在处理并发性请求的需要,避免出现并发性问题,需要对数据库资源指定合理的访问规则,锁就是用来实现这些访问规则的数据结构。根据加锁的访问,MySQL中的锁分为全局锁,表级锁,行级锁。1.1全局锁全局锁: 一旦加锁,会对整个数据库实例加锁。MySQL提供加锁命令:Flush tables with read lock (FTWRL),解锁命令:unloack tables或者客户端断开与数据库的连接。在全局加锁的情况下,整个库处于只读的状态下,以下命令都会被阻塞:数据库定义语句(DDL),数据库更

2020-11-20 16:06:46 10 1

原创 MySQL-05:数据库索引(二)

先来看个语句,当前sql语句 select * from T where k between 3 and 5 会执行几次树的搜索操作,会扫描多少行?mysql> create table T ( ID int primary key, k int NOT NULL DEFAULT 0, index k(k))engine=InnoDB;insert into T values(100,1),(200,2),(300,3),(500,5),(600,6),(700,7)

2020-11-19 22:29:00 5

原创 MySQL-04:索引(一)

1、索引索引的出现其实就是为了提高数据查询的效率,实质上就是将存储的数据按数据结构的方式存储起来。对于数据库的表而言,每一张表可能是多个索引实现。2、索引的简单实现索引常见的实现:哈希表,有序数组和搜索树。**哈希表:**哈希表方式,处理哈希碰撞用的是链表法,主要还是说说优缺点:单个数据查询或者新增数据很快,但是要区间查询数据就要遍历全部数据,所以哈希表适用于等值查询。**有序数组:**在进行等值查询和区间查询的时候效率很好,不过新增数据时就要挪动插入位置后面的数据,数组的特性嘛,适用于静态存储

2020-11-19 00:03:42 10

原创 MySQL-03:事务隔离

事务: 一组操作要不成功,要不失败。在MySQL中,事务支持是在引擎层实现的,但并不是所有的引擎都是支持事务的,例如MySQL的原生引擎MyISAM,这也是它被InnoDB引擎取代的重要原因。一提到事务,就必然想到事务的特性:ACID→(原子性,一致性,隔离性,持久性)。当数据库上有多个事务同时执行时,就可能出现脏读,不可重复读,幻读的问题,为了解决该问题,便有了“隔离级别”的概念。脏读:当前事务读到其他事务未提交的数据。不可重复读:在同一个事务内,前后读取记录内容不一致。幻读:在同一个事务内

2020-11-17 23:17:20 9

原创 MySQL-02:日志系统

MySQL在执行update操作时涉及到MySQL的日志系统:redo log和binlog。一条简单的update语句如下:mysql> update table1 set a = a+1 where id =1;update语句的执行流程也会像查询语句的那一套流程:链接器→查询缓存→分析器→优化器→执行器→存储引擎。不过update语句涉及到MySQL的日志模块:redo log(重做日志)和binlog(归档日志)2.1 redo log当一条更新语句过来,InnoDB引擎会先把记

2020-11-16 23:55:36 10

原创 MySQL-01:MySQL的基础架构

先来看下,例有如下语句: mysql> select * from tableName where ID=1;MySQL的基本架构如下,我们来逐个分析:MySQL 可分为 Server 层和存储引擎层两部分 :Server 层:包括连接器、查询缓存、分析器、优化器、执行器五个组件,这些组件涵盖 MySQL 的大多数功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层:它负责数据的存储和提取。其架构

2020-11-15 23:54:31 7

原创 Java集合:Set

Set集合,我们常见的Set有HashSet,TreeSet,LinkedHashSet,我们先来看下HashSet。一、HashSet成员变量: 成员变量只有可怜的两个,一个是装数据的容器,一个类似于标记 private transient HashMap<E,Object> map; private static final Object PRESENT = new Object();数据操作方法: 我们从添加/移除方法可以看出HashMap是以(Key,value

2020-09-02 23:01:50 30

原创 Java集合:Map

一、Map概述一讲到Map,我们就会想到散列表和HashMap,散列表:数组+列表的节点,那就有两个问题了,如何进行存放元素的下标定位和如果出现哈希碰撞了怎么办?散列表详解链接Map常用类:HashMap,LinkedHashMap,TreeMap,ConcurrentHashMap,接下来就是一一来看下它们。HashMap现在我们已知Map的底层结构为散列表,在JDK1.8中,HashMap在决定元素存放下标时,采用HashMap的哈希算法hash(key)&(length-1)。

2020-09-02 22:16:00 41

原创 Java集合:List

一、集合概述在Java中,我们能想到的List接口下的类有那么两个半吧:①ArrayList,②LinkedList,③Vector。ArrayList:底层是数组初始容量为10,每次扩容为1.5倍组的增删改底层由System和Arrays的数组赋值拷贝方法支持LinkedList:底层是双向链表插入/删除操作适合LinkedList,查询操作适合ArrayList,Vector就是线程安全的ArrayList。二、ArrayList这里就直接上源码吧,先来看看成员变量和构造方法

2020-08-30 21:49:42 51

原创 Java并发:线程池

线程目的线程复用,线程的创建与销毁是很消耗资源的。防止出现OOMThreadPoolExecutor直接来看下构造方法,不过一般构造线程池会用Executors这个工具类,且常用的方法有三个,有兴趣可以去看看,就直接上个最长的构造器。 // 可自定义扩展线程池 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,

2020-08-30 16:28:49 43

原创 Java并发:Condition

Condition使用案例:消费模型public class ConditionTest { public static ReentrantLock lock = new ReentrantLock(); public static Condition notEmpty = lock.newCondition(); public static Condition notFull = lock.newCondition(); public static PriorityQue

2020-08-27 22:39:18 44

原创 Java并发:AbstractQueuedSynchronizer

AbstractQueuedSynchronizer:抽象同步队列,简称AQS,它是实现同步器的基础组件,并发包中的锁的底层就是使用AQS实现的。开始正题:成员变量: //队列头结点 private transient volatile Node head; //队列尾节点 private transient volatile Node tail; // 同步器的状态,例如ReentrantLock用作锁是否被占用,锁重入的次数 // CountDownLatc

2020-08-26 21:18:00 46

原创 56:第一个只出现一次的字符

第一个只出现一次的字符字符串中第一个只出现一次的字符在字符串中找出第一个只出现一次的字符,如输入"abaccdeff",输出’b’public class Offer56 { public static void main(String[] args) { new Offer56().firstNotRepeatingChar("abaccdeff"); } // 思路:我们只需要寻找一个数据结构来保存单个字符的次数,如数组,map public void fir

2020-08-21 21:39:39 32

原创 55:丑数

丑数:因子只包含2,3,5的数,1为第一个丑数,2,3,5皆为丑数,请第1500个丑数。public class Offer55 { public static void main(String[] args) { System.out.println(new Offer55().getUglyNumber_solution(5)); } public int getUglyNumber_solution(int index){ if(index

2020-08-20 21:00:20 32

原创 54:最长不含重复字符的子字符串

最长不含重复字符的子字符串public class Offer54 { public static void main(String[] args) { System.out.println(new Offer54().LongestSubStringWithoutDuplication("asfahjfabswr")); } public int LongestSubStringWithoutDuplication(String str) {

2020-08-19 21:41:47 44

原创 53:礼物的最大价值

礼物的最大价值在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值你可以从棋盘的左上角开始拿格子里的礼物,每一次向右或者向下一格,直到右下角public class Offer53 { public static void main(String[] args) { int[][] arr = { {1,10,3,8}, {12,2,9,6}, {5,7,4,11},

2020-08-18 23:30:42 41

原创 52:把数字翻译成字符串

把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串,0翻译成"a",1翻译成"b",…11翻译成"l",25翻译成"z"。例如12258有5中不同的翻译,分别是""bccfi,“bwfi”,…public class Offer52 { public int getTranslationCount(int number) { if(number<0) return 0; //转字符 String sNu

2020-08-17 21:53:08 20

原创 51:把数组排成最小的数

把数组排成最小的数public class Offer51 { //思路:进行一个类似冒泡排序的方法来排序即可 public String PrintMinNumber(int [] numbers) { if(numbers==null || numbers.length<=0) return ""; ArrayList<String> list = new ArrayList<String>();

2020-08-16 21:09:49 27

原创 50:数学序列中某个的数字

数学序列中某个的数字数字以0123456789101112131415161718…的格式序列化到一个字符序列中。在这个序列中,第5位是5,第13位是1,第19位是4。实现一个函数,求任意第n位对应的数字。public class Offer50 { public static void main(String[] args) { int digit = new Offer50().digitAtIndex(13); System.out.println(di

2020-08-13 21:26:29 28

原创 49:1~n整数中1出现的次数

1~n整数中1出现的次数输入一个整数n,求1~n这n整数的十进制表示中1出现的次数。主要还是一个找规律的题目。解题思路传送门public class Offer49 { public static void main(String[] args) { int i = new Offer49().numberOf1Between1AndN(21354); System.out.println(i); } public int numberOf1

2020-08-12 22:14:58 35

原创 48:连续子数组的最大和

连续子数组的最大和输入一个整形数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)public class Offer48 { public static void main(String[] args) { int[] arr = {1,-2,3,10,-4,7,2,-5}; System.out.println(new Offer48().findGreatestSumOfSubArray(arr)

2020-08-11 22:14:05 24

原创 47:数据流中的中位数

数据流中的中位数public class Offer47 { //默认最小堆实现 PriorityQueue<Integer> maxHeap = new PriorityQueue<>(); //实现最大堆需要重写Comparator PriorityQueue<Integer> minHeap = new PriorityQueue<>(10, new Comparator<Integer>() {

2020-08-10 20:35:14 31

原创 46:最小的第K个数

最小的第K个数public class Offer46 { //基于快速排序的基础partition()方法 public void getLeastNumbers(int[] input,int[] output,int k){ if(input==null||input.length==0||output==null||k<0)return ; int start = 0; int end = input.length-1;

2020-08-09 13:48:23 26

原创 45:数组中出现次数超过一半的数字

数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半public class Offer45 { public static void main(String[] args) { int[] data = {1,4,3,2,4,2,5,4,2}; System.out.println(new Offer45().moreThanHalfNum(data)); } //思路:数字出现的次数超过数组的一半,我们如果把该数字的次数和剩余数组的次

2020-08-08 19:53:47 26

原创 44:字符串的排序

字符串的排序输入一个字符串,打印出该字符串中字符的所有排序public class Offer44 { public static void main(String[] args) { String str = "abc"; char[] arr = str.toCharArray(); permutation(arr, 0); } public static void permutation(char[] arr, int begin)

2020-08-07 22:54:30 27

原创 43:序列化二叉树

序列化二叉树请实现两个函数,分别用来序列化和反序列化二叉树序列化:把二叉树转换为字符串 反序列化:把字符串转换为二叉树public class Offer43 { public static void main(String[] args) { TreeNode node = Main.createNode(); String serialize = new Offer43().Serialize(node); System.out.println

2020-08-06 21:51:50 25

原创 42:二叉搜索树与双向链表

二叉搜索树与双向链表输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表public class Offer42 { //Java没有内存指针的概念,所以用了个静态变量 public static TreeNode last = null; public static void main(String[] args) { TreeNode node = Main.createNode(); TreeNode convert = Conve

2020-08-05 23:09:43 31

原创 41:复制复杂链表

复制复杂链表实现函数ComplexListNode(ListNode node)复制一个链表public class Offer41 { public static void main(String[] args) { ComplexListNode node1 = new ComplexListNode(1); ComplexListNode node2 = new ComplexListNode(2); ComplexListNode node3 =

2020-08-04 21:23:14 30

原创 40:二叉树中和为某一值的路径

二叉树中和为某一值的路径输入一颗二叉树和一个整数,打印出二叉树节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径public class Offer40 { public static void main(String[] args) { TreeNode node = Main.createNode(); new Offer40().FindPath(node, 7); } public ArrayList<

2020-08-03 22:42:11 37

原创 39:二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某个二叉搜索树后序遍历结果?public class Offer39 { public static void main(String[] args) { int[] data = {5,7,6,9,11,10,8}; boolean test = test(data, 0, data.length); System.out.println(test); } public

2020-08-02 14:12:46 38

原创 38:之字型打印二叉树

之字型打印二叉树二叉树层次遍历的变种,我们可以使用两个栈来保存待打印数据即可public class Offer38 { public static void main(String[] args) { TreeNode node = Main.createNode(); cengci(node); } public static void cengci(TreeNode root){ if (root==null)return

2020-08-01 15:10:48 40

原创 37:从上到下打印二叉树

从上到下打印二叉树二叉树的层次遍历的变种,使用两个变量记录待打印的数据个数和下次待打印的数据个数即可。public class Offer37 { public static void cengci2(TreeNode root){ if(root==null)return; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root);

2020-07-31 22:14:47 49

原创 36:从上到下打印二叉树

从上到下打印二叉树这个题目也就是二叉树的层次遍历,使用队列来做public class Offer37 { public static void cengci(TreeNode root){ if(root==null)return; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()){

2020-07-31 21:55:19 28

原创 35:包含min函数的栈

包含min函数的栈定义栈的结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1)主要问题点: 再把最小值弹出之后,我们如何知道下一个最小值,所以才需要用到额外的辅助栈。public class Offer36 { Stack<Integer> stack1 = new Stack<>(); Stack<Integer> stack2 = new Stack<>();

2020-07-30 21:10:12 30

原创 34:顺时针打印矩阵

顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。public class Offer35 { public static void main(String[] args) { int[][] data = {{1,2,3,4}, {1,2,3,4}, {1,2,3,4}}; printMatrixInCircle(data); }

2020-07-29 23:38:25 57

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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