自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 资源 (1)
  • 收藏
  • 关注

原创 Mybatis - 常见面试题

因为SQL语句在程序运行前已经进行了预编译,在使用参数化查询时,数据库不会将参数的内容视为SQL的一部分来处理,而是在数据库完成SQL指令编译后,才套用参数运行,即使参数里有敏感字符如 or ‘1=1’,数据库会作为一个字段的属性值来处理而不会作为一个SQL指令。sql注入攻击就是输入参数未经过滤,直接拼接到sql语句中,解析执行,达到预想之外的行为,即执行恶意SQL语句。上例中,若第一个if 为真,则把该 if 中的 and 去掉,若上述红色存在,则出现错误,需要用trim标签。mappers(映射器)

2024-04-25 15:11:47 909

原创 mybatis - 延迟、缓存

当用户发起查询时,根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入Local Cache,最后返回结果给用户。通常为每个单表创建单独的映射文件,由于MyBatis的二级缓存是基于namespace的,多表查询语句所在的namspace无法感应到其他namespace中的语句对多表查询中涉及的表进行的修改,引发脏数据问题。ii) 侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。

2024-04-25 14:50:10 648

原创 Mybatis - 标签、注解

在 MyBatis 中,“parameterType” 用于指定传递给 SQL 语句的参数类型。它告诉 MyBatis 应该将哪种类型的对象传递给 SQL 语句,以便在语句中使用。: 可以直接指定 Java 中的基本数据类型或其包装类作为 “parameterType”。: 可以指定一个 Java 对象作为 “parameterType”,MyBatis 将会把该对象传递给 SQL 语句。

2024-04-22 13:39:30 1096

原创 Mybatis -配置文件

自己定义的 TypeHandler ,都需要实现 TypeHandler 接口,并声明其泛型,即要处理的目标类型。TypeHandler 接口中定义了 4 个方法,大面上分两类:当 mapper.xml 中定义的 statement 中出现指定泛型类型的参数时,如何对 PreparedStatement 操作;查询动作封装结果集时,对于实体类中出现的指定泛型类型的属性时,应该如何从 ResultSet 中取到数据,并转换为指定类型。

2024-04-11 21:12:40 854

原创 容器 - ConcurrentHashMap

两者的区别主要体现在实现线程安全的方式上不同。首先将数据分段存储,然后给每个分段数据配一把锁,当一个线程锁访问其中一个段数据时,其他段也能被其他线程访问。ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。Segment 继承自 ReentrantLock, 是一种可重入锁,并发度与 Segment 数量相等。HashEntry是内部类,用于存储键值对数据。其成员变量value,和 HashEntry<K,V> next都由volatile修饰。

2024-04-11 20:50:38 930

原创 容器 - 跳跃表

跳表的本质是同时维护了多个链表,并且链表是分层的,最低层的链表维护了跳表内所有的元素,每上面一层链表都是下面一层的子集。跳表内的所有链表的元素都是排序的。当在跳表中插入数据的时候,同时将这个数据插入到部分索引层中,如何选择索引层,可以通过一个随机函数来决定这个节点插入到哪几级索引中,比如随机生成了k,那么就将这个索引加入到,第一级到第k级索引中。的思想,通过构建多级索引来提高查询效率,实现基于链表的“二分查找”,跳表是一种动态的数据结构,支持快速的查找、插入和删除操作,时间复杂度是 O(logn)。

2024-04-11 20:31:19 398

原创 容器 - LinkedList源码

LinkedList是一个实现了List接口和Deque接口的双端链表。LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性;LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以调用静态类Collections类中的synchronizedList方法:Node类:LinkedList的私有内部类,用以表示一个链表节点。E item;//节点值//后继节点//前驱节点。

2024-04-11 20:20:07 202

原创 容器 - ArrayList源码解析

【代码】容器 - ArrayList源码解析。

2024-04-11 19:42:02 273

原创 数据结构 - 背包问题

用到的dp[ j - w[i]]是第i次循环计算出来的值, 相当于在执行:dp[ i ][ j ] = max{ dp[i - 1][ j ], dp[ i ][ j - w[i] ] };(注意是dp[ i ][ j - w[i]] )因为 dp[j-w] 表示 dp[i-1][j-w],因此不能先求 dp[i][j-w],防止将 dp[i-1][j-w] 覆盖。必须保证,在计算dp[ j ]的时候,dp[ j - w[i]]依然等于dp[i -1][ j - w[i] ]。

2024-04-03 20:27:53 2265

原创 数据结构 - 前中后序遍历

方法三:莫里斯遍历:在第二次到达时,然后逆序打印左子树的右边界,最后打印整棵树的右边界。如果cur有左孩子,找到cur左子树上最右的节点,记为mostRight。如果一个节点有左子树,可以到达两次,而且在第二次到达时,其左子树遍历完毕。如果cur无左孩子,cur向右移动, cur = cur.right。在介绍具体代码之前,先简述一下 莫里斯遍历 相关内容。若没有左子树,则只能到达一次。来到当前节点,记为cur。:不使用任何辅助空间。

2024-04-03 19:58:16 252

原创 并发 - 常见面试题

当多个线程同时访问一段同步代码时,首先会进入 _EntryList 集合,当线程获取到对象的monitor 后进入 _Owner 区域并把monitor中的owner变量设置为当前线程,同时monitor中的计数器count加1,若线程调用 wait() 方法,将释放当前持有的monitor,owner变量恢复为null,count自减1,同时该线程进入 _WaitSet集合中等待被唤醒。偏向锁状态:当一个线程访问一个没有竞争的锁时,会将对象头中的标记位设置为偏向锁状态,并将线程ID记录在对象头中。

2024-04-03 16:14:08 1040

原创 并发 - 锁机制

乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源是否被其它线程修改了。一般使用版本号机制或 CAS 算法,在 Java 中java.util.concurrent.atomic包下面的原子变量类(比如AtomicInteger、LongAdder)就是使用了乐观锁的一种实现方式 CAS 实现的。版本号机制。

2024-04-03 16:01:45 955

原创 分布式 - redis分布式锁

第一,这个方案必须要求要操作的「共享资源服务器」有拒绝「旧 token」的能力,例如,要操作 MySQL,从锁服务拿到一个递增数字的 token,然后客户端要带着这个 token 去改 MySQL 的某一行,这就需要利用 MySQL 的「事物隔离性」来做。多个 Redis 实例一起来用,其实就组成了一个「分布式系统」,总会出现「异常节点」,这是一个分布式系统「容错」问题,如果只存在「故障」节点,只要大多数节点正常,那么整个系统依旧是可以提供正确服务的。大部分要操作的资源服务器,都是没有这种互斥能力的。

2024-04-02 22:21:32 1047

原创 分布式 - 全局id

test_tag在第一台 Leaf 机器上是1-1000的号段,当这个号段用完时,会去加载另一个长度为step=1000的号段,假设另外两台号段都没有更新,这时第一台机器新加载的号段就应该是3001-4000。Leaf 取号段的时机是在号段消耗完的时候进行的,号段临界点的ID下发时间取决于下一次从DB取回号段的时间,并且在这期间进来的请求也会因为DB号段没有取回来,导致线程阻塞。使用redis实现;因为这种方案依赖时间,如果机器的时钟发生了回拨,那么就会有可能生成重复的ID号,需要解决时钟回退的问题。

2024-04-02 21:46:46 701

原创 数据库 - buffer pool

Buffer Pool本质是InnoDB向操作系统申请的一块连续的内存空间,在多线程环境下,访问Buffer Pool中的各种链表都需要加锁处理,所以在Buffer Pool特别大时,可以把它们拆分成若干个小的Buffer Pool,每个Buffer Pool都称为一个实例,它们都是独立的,独立的去申请内存空间,独立的管理各种链表,在多线程并发访问时并不会相互影响,从而提高并发处理能力。当需要访问某个页的数据时,把完整的页的数据全部加载到内存中,即使只访问一个页的一条记录,也要把整个页的数据加载到内存。

2024-04-02 21:28:46 639

原创 数据库-事务

如果开启了一个事务,并且已经敲了很多语句,忽然发现上一条语句有点问题,只好使用ROLLBACK语句来让数据库状态恢复到事务执行之前的样子,为避免一切从头再来,Mysql提出了一个保存点(英文:savepoint)的概念,在事务对应的数据库语句中打几个点,在调用ROLLBACK语句时可以指定会滚到哪个点,而不是回到最初的原点。可以看到默认值为ON,即如果不显式的使用START TRANSACTION或者BEGIN语句开启一个事务,那么每一条语句都算是一个独立的事务,这种特性称之为事务的自动提交。

2024-04-02 20:48:23 635

原创 java常见基础点

1. 重载与重写重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法的返回值和访问修饰符可以不同。重写:子类对父类允许访问的方法重新编写,方法名参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,修饰符范围大于等于父类,若父类方法为private,子类不能重写。注:构造器不能被重写,重写意味着发生了继承,子类重写父类的方法,然而构造器的方法名必须与类名相同,显而易见的是,子类和父类的类名一定不相同,所以构造器不可被重写。2. final修饰的类,为最终

2020-07-06 22:10:54 136

原创 java基础 -- 正则表达式

在Java中,不管是String.split(),还是正则表达式,有一些特殊字符需要转义,( [ { / ^ - $ ¦ } ] ) ? * . (点号) + \转义方法为字符前面加上"\",这样在split、replaceAll时就不会报错了;注意:String.contains()方法不需要转义。常见实例...

2020-07-06 20:56:05 140

原创 数据库 -- 锁分析

MySQL 中提供了两种封锁粒度:行级锁以及表级锁。应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。但是加锁需要消耗资源,锁的各种操作(包括获取锁、释放锁、以及检查锁状态)都会增加系统开销。因此封锁粒度越小,系统开销就越大。在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。1. 表锁开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低分为两种模式:表读锁(Table Read Lock)表写锁(T

2020-07-06 20:45:13 341 1

原创 数据库 -- explain

查询执行计划:explain + SQL语句以下对每个字段进行分析id: 编号:每出现一个select语句,便分配一个唯一的id值。每个表对应一条记录,若几个表在一个select语句中,则id值相同。注:查询优化器可能对涉及子查询的查询语句进行重写,转换成连接查询,所以如果有子查询,但id值相同,则说明查询优化器将子查询转换成了连接查询。select_type: 查询类型PRIMARY:包含子查询的主查询。SUBQUERY: 包含子查询的子查询,非最外层SIMPLE:简单查询(不包含un

2020-06-05 23:17:50 213 1

原创 数据库 -- 大表优化

性能状态关键指标QPS,Queries Per Second:每秒查询数,一台数据库每秒能够处理的查询次数TPS,Transactions Per Second:每秒处理事务数1. 什么是成本?I/O成本表使用的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当查询表中的记录时,需先把数据或者索引加载到内存中然后再操作。从磁盘到内存这个加载的过程损耗的时间称之为I/O成本。CPU成本读取以及检测记录是否满足搜索条件、对结果集进行排序等操作损耗的时间称之为CPU成本。

2020-06-05 22:39:38 344 1

原创 数据库 -- 常见表操作

数据库操作查看数据库信息 select database();查看所有库 show databases修改库信息 alter database 数据库名 选项信息删除库 drop database 库名选择库 use 库名表的操作创建表create table 表名(字段名 数据类型 [NOT NULL | NULL] [DEFAULT value] [AUTO_INCREMNT] [UNIQUE [KEY] | [PRIMARY] KEY] )表选项:CH

2020-06-05 22:06:16 151

原创 容器 -- 常见面试题

1. list集合的哪一种遍历方式要快一些下面时间是自己测试所得,不同情况时间不一致,但相对大小关系应该不变ArrayList普通for循环:3ms 迭代器:6msLinkedList普通for循环:6295ms 迭代器:28ms原因:接口RandomAccess中内容是空的,只是作为标记用。ArrayList实现了该接口,可随机访问,而LinkedList 没有。利用instanceof 来判断哪个实现了RandomAccess(通过语句 list instanceof Rand.

2020-06-01 15:00:42 548

原创 容器 -- HashMap 源码解析

1. HashMap 简介HashMap 主要用来存放键值对,基于哈希表的Map接口实现,JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表是为了解决哈希冲突。JDK1.8 以后,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)。2. 底层数据结构分析:JDK1.8 之前 HashMap 底层是 数组和链表 结合。HashMap 通过 key

2020-06-01 14:24:27 86 1

原创 数据结构 -- 数组累加和

解题思路:必须以某个位置结尾的情况下,答案一定在其中。1. 给定一个数组,有正有负,求累加和为target的最长子数组解析:计算前缀和数组,sum表示从开始到 i 位置的累加和。Map:key指累加和,value指最早出现的位置。public int maxLength(int[] arr, int k){ if(arr == null || arr.length == 0) return 0; Map<Integer, Integer> map = new HashMap&l

2020-06-01 13:55:04 3112

原创 数据结构 -- 十大排序算法

1. 冒泡排序①、算法描述:比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素做同样的工作,第一轮使尾部值最大,第二轮尾部两个值最大。针对所有的元素重复以上的步骤;②、代码实现: public static void bubbleSort(int[] list) { boolean needswap = true; for(int i = 1; i < list.length && needswap; i++){ needswap =

2020-06-01 13:44:42 120

原创 数据结构 -- 马拉车算法

查找一个字符串的最长回文子串的线性算法。时间复杂度为O(n)1. 原理在原字符串的每个相邻两个字符中间插入一个分隔符,同时在首尾也要添加一个分隔符,分隔符不能在原串中出现,一般情况下可以用#号,使字符串长度变成奇数个。(1)Len数组性质用一个辅助数组Len[i]表示以字符T[i]为中心的最长回文字串半径长度。注:Len[i]-1就是该回文子串在原字符串S中的长度,证明:以T[i]为中心的最长回文字串长度是2*Len[i]-1 ,其中分隔符的数量一定比其他字符的数量多1,即有Len[i]-1个字符

2020-05-27 15:32:18 160

原创 数据结构 -- KMP算法

用来解决字符串查找的问题,可以在一个字符串(S)中查找一个子串(W)出现的位置。KMP 算法把字符匹配的时间复杂度缩小到 O(m+n) ,而空间复杂度也只有O(m)1. 前缀、后缀"前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。模式串: ab aba abab前缀组合: a a、ab a、ab、aba后缀组

2020-05-27 14:55:19 158

原创 数据结构 -- N叉树的序列化与反序列化

1. 二叉树的序列化与反序列化//序列化public String serialize(TreeNode root) { if(root == null) return "#"; return root.val + "!" + serialize(root.left) + "!" + serialize(root.right);} // 反序列化public TreeNode deserialize(String data) { String[] str = da

2020-05-27 14:06:46 1157 1

原创 数据结构 -- 完全/平衡二叉树

1. 完全二叉树若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。它的深度至少是lg(N+1)。最多也不会超过lg(2N)。a) 判断一棵树是否是完全二叉树:按层遍历如果一个结点,左右孩子都不为空,则pop该节点,将其左右孩子入队列;如果一个结点,左为空,右不为空,则该树一定不是完全二叉树;如果一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完

2020-05-27 13:30:41 758

原创 数据结构 -- 6种股票交易

一、穷举框架利用「状态」进行穷举。我们具体到每一天,再找出每个「状态」对应的「选择」。股票问题每天有三种「选择」:买入、卖出、无操作,用 buy, sell, rest 表示这三种选择这个问题的「状态」有三个,第一个是天数,第二个是允许交易的最大次数,第三个是当前的持有状态(即之前说的 rest 的状态,假设 1 表示持有,0 表示没有持有)。dp[i][k][0 or 1]for 0 <= i < n: for 1 <= k <= K: for

2020-05-27 12:48:19 419

原创 数据库 -- InnoDB数据页结构

InnoDB是一个将表中的数据存储到磁盘上的存储引擎,采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16KB。1. File Header一个页只有16KB,可能需要好多页来存放数据,FIL_PAGE_PREV 和 FIL_PAGE_NEXT 这两个属性就分别代表本页的上一个和下一个页的页号。注:并不是所有类型的页都有上一个和下一个...

2020-05-08 13:54:11 165

原创 数据库 -- 索引

一、索引的介绍1、索引分类主键索引:不能重复,不能为null唯一索引:不能重复,可以为null密集索引:每个数据记录都对应一个索引项稀疏索引:只为某些记录建立索引项2、创建索引:方式一:create 索引类型 索引名 on 表(字段)单值:create index id_index on student(id);唯一:create unique index name_...

2020-05-08 13:25:06 216 1

原创 数据库 -- redo log日志

1. 介绍若想让已提交的事务对数据库的修改永久生效,即使系统崩溃,重启后也可把这种修改恢复出来。没有必要在每次事务提交时就把该事务在内存中修改过的全部页面刷新到磁盘,只需要把修改的内容记录下来。称为redo log,好处如下:redo日志占用的空间非常小存储表空间ID、页号、偏移量以及需要更新的值所需的存储空间是很小的。redo日志是顺序写入磁盘的,使用顺序IO执行事务中,每执行一条语...

2020-05-08 12:13:49 5398 1

原创 mybatis -- 工作原理

一、框架设计1. 接口层—和数据库交互的方式:以使用Mapper接口为例将配置文件中的每一个<mapper> 节点抽象为一个 Mapper 接口,这个接口中声明的方法和跟Mapper.xml中的<select|update|delete|insert> 节点项对应,id值对应方法名称,parameterType 值对应方法的入参类型,而resultMap 值则对应返回...

2020-05-08 11:18:26 274

原创 mybatis -- 初始化过程

一、 MyBatis的初始化做了什么加载自己运行时所需要的配置信息MyBatis的XML配置文件信息,会被加载进入MyBatis内部,使用Configuration 对象作为一个所有配置信息的容器,Configuration对象的组织结构和XML配置文件的组织结构几乎完全一样。MyBatis初始化的过程,就是创建 Configuration对象的过程。二、MyBatis基于XML配置文件创...

2020-05-08 11:04:42 431

原创 mybatis -- 事务管理机制

一、概述对数据库的事务而言,具有以下几点:创建、提交、回滚、关闭。对应地,MyBatis将事务抽象成了Transaction接口,接口定义获取了Connection相关功能。MyBatis的事务管理分为两种形式:使用JDBC:利用Connection对象完成对事务的提交commit()、回滚rollback()、关闭close()使用MANAGED:这种机制MyBatis自身不会去实现事...

2020-05-08 10:58:12 409

原创 mybatis -- 数据源与连接池

一、MyBatis数据源DataSource分类MyBatis把数据源DataSource分为三种:UNPOOLED 不使用连接池的数据源POOLED 使用连接池的数据源JNDI 使用JNDI实现的数据源,从tomcat中获取一个内置的数据库连接池MyBatis内部定义了实现java.sql.DataSource接口的Unpoole...

2020-05-08 10:50:15 223

原创 数据结构 -- 二叉树

完全二叉树若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。它的深度至少是lg(N+1)。最多也不会超过lg(2N)。a) 判断一棵树是否是完全二叉树:按层遍历如果一个结点,左右孩子都不为空,则pop该节点,将其左右孩子入队列;如果一个结点,左为空,右不为空,则该树一定不是完全二叉树;如果...

2020-05-06 14:51:58 427 1

原创 数据结构--树的最近公共祖先

情况1:当树是二叉搜索树时首先判断两个节点值与当前节点的大小关系若均大于当前节点值,则递归当前节点的右节点若均小于当前节点值,则递归当前节点的左节点否则,返回当前节点 private TreeNode find(TreeNode node1, TreeNode node2, TreeNode root) { int val=root.value; if(...

2020-05-06 14:48:17 257

空空如也

空空如也

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

TA关注的人

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