自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 IOC和AOP的含义

Spring的优点轻量,基本版本大约2MB。通过控制反转和依赖注入实现松耦合。支持面向切面的编程,并且把应用业务逻辑和系统服务分开。方便集成各种优秀框架。内部提供了对各种优秀框架的直接支持(如:Hibernate、MyBatis等)。方便程序的测试。Spring支持Junit4,添加注解便可以测试Spring程序。IOC1、什么是IOC  IOC翻译过来是控制反转。“反转”指的是对象的创建由以前开发人员new出来的,现在交由Spring容器进行管理。通过反射实现对其他对象的控制,包括初始

2021-10-28 21:35:07 348

原创 什么是依赖注入

什么是依赖注入?依赖注入指的是在Spring创建对象的过程中,把对象依赖的属性注入到对象中。依赖注入的方式主要包括:基于 set 方式注入,也即属性注入。基于构造器方式的注入。p命名空间注入(对应属性注入)。c命名空间注入(对应构造器注入)。p命名空间注入和c命名空间注入都需要导入xml约束。第一种注入方式:使用 set 方法进行注入//(1)创建类,定义属性和对应的 set 方法public class Book { //创建属性 private String bname; pr

2021-10-28 21:30:16 5691 1

原创 事务、事务的四大特性ACID、并发访问的问题、四种隔离级别

事务事务是一组命令的集合,它是一个整体,所有的SQL语句都必须执行成功。如果其中一条SQL语句出现异常,则所有的SQL语句都要回滚,整个事务执行失败。事务的四大特性ACID原子性(Atomicity):每个事务都是一个整体,不可再拆分。事务中所有的SQL语句要么全部执行成功,要么全都不执行。一致性(Consistency):事务在执行前数据库的状态与执行后数据库的状态保持一致。比如:转账前2个人的总金额是2000,转账后2个人的总金额也是2000.隔离性(Isolation):事务与事务之间不应

2021-10-28 20:51:19 191

转载 Java中Collection和Collections的区别

Collectionjava.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。CollectionsCollections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。...

2021-10-22 22:45:17 107

原创 交换机Exchange的4种类型

directdirect交换机会将消息路由到binding key 和 routing key完全匹配的队列中。它是完全匹配、单播的模式。fanout所有发到 fanout 类型交换机的消息都会路由到所有与该交换机绑定的队列上去。fanout 类型转发消息是最快的。topictopic交换机使用routing key和binding key进行模糊匹配,匹配成功则将消息发送到相应的队列。routing key和binding key都是句点号“. ”分隔的字符串,binding key中可以存

2021-10-22 18:10:55 791

原创 什么是覆盖索引

覆盖索引  select 的数据列只用从索引中就能够取得,不需要回表进行二次查询,也就是说查询列要被所使用的索引覆盖。对于 InnoDB 表的二级索引,如果索引能覆盖到查询的列,那么就可以避免对主键索引的二次查询。  不是所有类型的索引都可以成为覆盖索引。覆盖索引要存储索引列的值,而哈希索引、全文索引不存储索引列的值,所以MySQL使用B+树索引做覆盖索引。  对于使用了覆盖索引的查询,在查询前面使用explain,输出的extra列会显示为using index。比如有个用户订单表,组合索引为 (

2021-10-22 15:26:24 3289 1

原创 索引什么时候会失效

对于组合索引,未使用组合索引最左边的字段,则不会使用索引。以%开头的like查询如%abc,无法使用索引;非%开头的like查询如abc%,相当于范围查询,会使用索引。查询条件中列类型是字符串,但是没有使用引号,可能会因为类型不同发生隐式转换,使索引失效。MySQL在使用不等于号(!=或者<>)的时候无法使用索引会导致全表扫描。is null、is not null 也无法使用索引。对索引列进行运算。查询条件使用or连接,也会导致索引失效。...

2021-10-22 12:33:47 671

原创 缓存穿透、缓存击穿、缓存雪崩

缓存穿透  指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,可能导致数据库挂掉。解决方案:1、查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短。2、布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对数据库的查询。缓存击穿  对于设置了过期时间的 key,缓存在某个时间点过期的时候,恰好这时间点对这个 Key 有大量的并发请求过来,这

2021-10-22 10:41:11 53

原创 Java中反射机制

反射概述Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,如果通过反射获取到该类的字节码文件,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。获取某类字节码文件对象的3种方式:1、源文件阶段 Person.javaClass clazz = Class.forName("全类名(包名.类名)");作用:读取配置文件。2、字节码阶段 Person.classClass claz

2021-10-21 18:06:58 74

原创 重载和重写的区别

重载  重载:首先它是位于一个类之中或者其子类中。可以表现类的多态性。重载具有相同的方法名,但是方法的参数一定不同,可以设置 “参数数目不同”、“参数类型不同” 或者 “参数顺序不同”。访问修饰符和返回值类型可以相同也可以不同。重写  重写发生在父类与子类之间,在任意子类中定义了重名和同样的参数列表就构成方法重写。重写的特征为:方法名必须相同,返回值类型必须相同。参数列表必须相同。被重写的方法的访问权限不能比父类中对应的方法的访问权限低。比如,如果父类的一个方法被声明为public,那么在子

2021-10-20 23:00:35 187

原创 where和having的区别

where在分组之前过滤数据,即先过滤再分组;where后面不可以使用聚合函数。having在分组之后过滤数据,即先分组再过滤;having后面可以使用聚合函数。

2021-10-20 14:20:06 105

原创 Redis单线程为什么需要加锁

首先需要说明一点的是:我们一直在强调 redis 是单线程,只是在处理我们的网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的。为什么redis是单线程的?  官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。为什么redis需要加锁?  我们需要注意的是:redis是单线程这是毋庸置疑的。red

2021-10-19 22:51:07 4199 2

原创 Minor GC的过程

Minor GC的过程:复制->清空->交换1、Eden、SurvivorFrom复制到SurvivorTo,年龄+1  首先,当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到SurvivorFrom区。当Eden区再次触发GC的时候会扫描Eden区和From区域,对这两个区域进行垃圾回收。经过这次回收后还存活的对象则直接复制到To区域,同时把这些对象的年龄+1(如果有对象的年龄已经达到了老年的标准,则复制到老年代)。2、清空Eden、SurvivorFrom  然后,清空E

2021-10-10 12:26:45 595

转载 垃圾回收算法

典型的垃圾回收算法有哪些?1、标记-清除算法  标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。  标记-清除算法实现起来比较容易,但是有一个比较严重的问题就是容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。2、复制算法  它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面

2021-10-09 22:37:37 1034

原创 类文件结构

Class 文件结构如下:ClassFile { u4 magic; //Class 文件的标志 u2 minor_version;//Class 的小版本号 u2 major_version;//Class 的大版本号 u2 constant_pool_count;//常量池的数量 cp_info constant_pool[constant_pool_c

2021-10-09 22:03:47 64

原创 堆栈的区别

说一下堆栈的区别?1、物理地址  堆的物理地址分配对对象是不连续的。在GC的时候需要考虑到不连续的分配,性能较慢。  栈使用的是数据结构中的栈,先进后出的原则,物理地址分配是连续的。性能快。2、存放的内容  堆存放的是对象的实例和数组。  栈存放:局部变量,操作数栈,返回结果。3、程序的可见度  堆对于整个应用程序都是共享、可见的。  栈只对于线程是可见的,线程私有。...

2021-10-09 21:53:31 279

原创 如何判断一个对象是否存活?

堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不能再被任何途径使用的对象)。判断对象是否存活有两种方法:引用计数法和可达性分析。1、引用计数法  给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。  但是这种方法很难解决对象之间相互循环引用的问题。2、可达性分析  通过GC Root对象为起点,从这些节点向下搜索,搜索所走过的路径叫引用链,当一个对象到GC Root没有任

2021-10-09 21:48:00 878

原创 双亲委派模型及其实现

双亲委派模型  一个类加载器收到一个类的加载请求时,它首先不会自己尝试去加载它,而是把这个请求委派给父类加载器去完成,这样层层委派,因此所有的加载请求最终都会传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。  双亲委派模型的好处:可以防止内存中出现多份同样的字节码。如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,多个类加载器都去加载这个类到内存中,系统中将会

2021-10-09 21:29:56 116

原创 类实例化的顺序

Java中类实例化的顺序:1、静态属性初始化,静态代码块初始化(静态代码块先于主方法执行,且只执行一次)2、普通属性初始化,普通代码块初始化(构造代码块初始化)3、构造方法初始化class Student { static { System.out.println("Student静态代码块"); } { System.out.println("Student构造代码块"); } public Student() {

2021-10-09 20:56:30 278

转载 JVM可以调优的参数选项

JVM调优参数-Xmx4g (最大堆内存大小)-Xms4g (初始化堆内存大小)-Xmn1200m-Xss512k (线程的堆栈大小)-XX:NewSize (新生代大小)-XX:NewRatio=4 (新生代和老生代占比)-XX:SurvivorRatio=8 (伊甸园空间和幸存者空间的占比)-XX:PermSize=100m-XX:MaxPermSize=256m-XX:MaxTenuringThreshold=15 (对象在年轻代存活时间)如果是堆内存不够:尝试调整

2021-10-09 18:35:12 140

原创 多线程的实现方式

多线程的实现方式1、继承Thread类   (1)定义一个类继承Thread,重写run()方法;   (2)创建Thread类的子类对象;   (3)调用start()开启新线程。//主线程和自定义线程并发执行public class thread { public static void main(String[] args) { //2、创建Thread类的子类对象 MyThread myThread = new MyThread();

2021-10-09 17:55:14 103

原创 TCP的拥塞控制

TCP的拥塞控制   TCP模块为了防止过多的数据注入网络,是网络中的路由器或链路不致于过载。以此提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性而采取的控制手段。拥塞控制包含四部分内容:慢启动、拥塞避免、快速重传和快速恢复。慢启动   网络传输刚开始时,并不知道网络的实际情况,所以采取一种试探的方式控制数据的发送速率。   慢启动阶段,数据的发送速率以指数方式增长,即拥塞窗口的增长,每次都是收到确认报文段数量的2倍。可以看出慢启动并不慢,拥塞窗口增长的速度很快。所以为其设置了一个慢启

2021-10-08 10:49:50 107

原创 抽象类和常用类的区别

抽象类和常用类的区别抽象类的特点:抽象类和抽象方法必须用 abstract 关键字修饰;抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口;抽象类不能实例化,要由其子类来实例化;抽象类的子类要么是抽象类,要么重写抽象类中的所有抽象方法。抽象类的成员特点:成员变量:既可以是变量,也可以是常量。(abstract不能修饰成员变量)构造方法:有构造方法,用于子类访问父类数据的初始化;成员方法:既可以是抽象的,也可以是非抽象的。抽象的成员方法非抽象子类必须重写,非抽象的成员方法可以

2021-09-30 22:49:50 187

原创 StringBuilder实现栈

StringBuilder实现栈StringBuilder中的方法reverse()   返回值类型:StringBuildertoString()   返回值类型:String1、添加元素append(Object obj)   返回值类型:StringBuilderinsert(int offset, Object obj)   返回值类型:StringBuilder2、查找元素charAt(int index)   返回值类型:char3、删除元素delete(int

2021-09-28 18:14:31 106

原创 Integer与String互相转换

Integer转String1、Integer类的静态方法toString()Integer a = 10;String str = Integer.toString(a);2、Integer类的成员方法toString()Integer a = 10;String str = a.toString();3、String类的静态方法valueOf()Integer a = 10;String str = String.valueOf(a);String转IntegerString

2021-09-27 22:58:57 2116

原创 用LinkedList实现栈和队列的方法

LinkedList实现栈Deque<Character > queue = new LinkedList<>();LinkedList实现队列Deque<Character > stack= new LinkedList<>();1、将栈/队列中的元素转化为字符串toString()    返回值类型:String2、获取栈/队列中元素个数size()   返回值类型:int3、向栈/队列中直接添加集合addAll(Collection&l

2021-09-27 22:17:52 1119

原创 B树和B+树的区别

B树B+树B树和B+树的区别:B树的非叶子节点中存储了关键字和记录,还有指向下一个节点的指针;叶子节点存储了关键字和数据记录。而B+树只在非叶子节点中存储了关键字和指向下一个节点的索引,并没有存储数据记录,数据记录全部存储在叶子节点中,且B+树的叶子节点使用指针连接在一起。在B树中,越靠近根节点的记录查找时间越快,只要找到关键字即可确定记录的存在;而B+树中每个记录的查找时间基本上是一样的,都需要从根节点走到叶子节点,而且在叶子节点中还要再比较关键字。从这个角度看B树的性能好像要比B+树好,而在

2021-09-24 18:05:24 561

原创 InnoDB存储引擎的主要优点

InnoDB是一种可靠性高的高性能MySQL数据库存储引擎,主要优点包括:它遵循ACID模式设计,具有与事务(Transactions)、回滚和保护用户数据的崩溃恢复能力。InnoDB引擎在主内存中维护了一个buffer pool,用来缓存表和索引,频繁访问的数据会直接在内存中操作。如果缓存中或者磁盘中的数据有损坏,MySQL的数据校验机制会在你使用它之前提醒你。设计表时为每个表添加了主键,会自动优化涉及列的操作。也就是说基于主键的查询、排序、聚合性能会很高。InnoDB提供行级锁,拥有与Ora

2021-09-23 12:37:10 2327

转载 MyISAM与InnoDB 的区别(9个不同点)

区别:InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查

2021-09-23 12:12:03 3137

原创 InnoDB为什么推荐使用自增ID作为主键?

  InnoDB中,表中的数据是直接存储在主键聚簇索引的叶子节点上的,每插入一条记录,其实都是增加一个叶子结点,如果主键是顺序的,只需要把新增的一条记录存储在上一条记录的后面。当页达到最大填充因子的时候,下一条记录就会写入新的页中,这种情况下,主键页就会近似于被顺序的记录填满。  若表的主键不是顺序的id,而是无规律数据,比如字符串,InnoDB无法简单的把一行记录插入到索引的最后,而是需要找一个合适的位置(已有数据的中间位置),甚至产生大量的页分裂并且移动大量数据;在寻找合适位置进行插入时,目标页可能不

2021-09-23 11:56:05 719

原创 String、StringBuffer、StringBuilder的区别

String  String是字符串常量,final修饰,不可被继承,当创建之后就不能更改。区别1:线程安全StringBuffer自JDK1.0起就已经出现,StringBuilder自JDK1.5起开始出现。StringBuffer是线程安全的,StringBuilder是线程不安全的。因为StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder并没有synchronized修饰。区别2:缓冲区StringBuffer每次获取toString都会直

2021-09-19 13:22:42 47

原创 Redis的三种模式-主从复制、哨兵、Cluster

Redis单机版优点:单机版的Redis也有很多优点,比如实现简单、维护简单、部署简单、维护成本非常低,不需要其它额外的开支。缺点:单点故障问题。一个Redis挂了,所有的请求就会直接打在了DB上。并且一个Redis抗并发数量也是有限的,同时要兼顾读写两种请求,只要访问量一上来,Redis就受不了了。另一方面单机版Redis数据量存储也是有限的,数据量一大,再重启Redis的时候,就会非常的慢,所以局限性也是比较大的。主从模式  一个主数据库,多个从数据库。主数据库(master)可以

2021-09-17 10:15:34 293

原创 TCP的滑动窗口

说一说TCP的滑动窗口?滑动窗口实现了TCP流控制。首先明确滑动窗口的范畴:TCP是双工的协议,会话的双方都可以同时接收和发送数据。TCP会话的双方都各自维护了一个发送窗口和一个接收窗口。各自的接收窗口大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的发送窗口则取决于对端通告的接收窗口,要求相同。滑动窗口解决的是流量控制的问题。所谓流量控制,主要是接收方传递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要的方式就是返回的ACK中会包含自己的接收窗口的大小,并

2021-09-15 16:22:28 296

原创 三次“握手”,四次“挥手”

第一次挥手:Client发送一个FIN报文,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态;第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSED_WAIT状态;第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态;第四次挥手:Client收到FIN后,Client进入TIME_WAIT状

2021-09-15 15:19:58 60

原创 TCP和UDP的区别

TCP和UDP区别总结:TCP是面向连接的,即发送数据之前需要先建立连接;UDP是无连接的,发送数据之前不需要建立连接。TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP是尽最大努力交付,即不保证可靠交付。TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;而UDP是面向报文的。每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。TCP首部开销20字节;UDP的首部开销小,只有8个字节。TCP的逻辑通

2021-09-14 22:53:53 189

转载 Python中使用pip下载安装Python工具包

安装了python后,使用pip命令下载安装第三方库的地址默认是python官网,下载速度慢,且容易超时。为提高下载速度,可以使用国内的一些镜像网站,例如安装TensorFlow:最原始从官网下载:pip install tensorflow从国内镜像网站安装最新版本:pip install tensorflow -i http://pypi.douban.com/simple/或者指定版本号:pip install tensorflow==1.14.0 -i http://pypi.douban.

2020-11-20 10:03:53 392

原创 面试题 10.05、稀疏数组搜索(简单)

class Solution { public int findString(String[] words, String s) { int low = 0, high = words.length - 1; int mid, temp; while (low <= high) { mid = (low + high) >> 1; temp = mid; //.

2020-11-16 17:00:26 128

原创 剑指offer 22、链表中倒数第k个节点(简单)

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode getKthFromEnd(ListNode head, int k) { ListNode preA = head.

2020-11-16 16:57:39 45

原创 剑指offer 16、数值的整数次方(中等)

class Solution { boolean validInput = true; public double myPow(double x, int n) { long N=n; return N>=0? quickMul(x,N) : 1.0/quickMul(x,-N); } public double quickMul(double x,long N){ if(x==0.0 && N.

2020-11-16 16:55:51 43

原创 剑指offer 06、从尾到头打印链表(简单)

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { //用递归的方法来解 int len = 0; //记录链表的长度 int[] res; //返回的数组 int index .

2020-11-16 16:53:11 32

空空如也

空空如也

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

TA关注的人

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