自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LinkedHashMap

LinkedHashMapHashMap和双向链表合二为一即是LinkedHashMap。LinkedHashMap继承自HashMap,它的多种操作都是建立在HashMap操作的基础上的。同HashMap不同的是,LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry中的顺序。LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序

2021-04-06 10:33:25 396 1

原创 几种排序算法

冒泡排序public static void sortPlus(int[] arr){ if(arr != null && arr.length > 1){ for(int i = 0; i < arr.length - 1; i++){ // 初始化一个布尔值 boolean flag = true; for(int j = 0; j < arr.length - i - .

2021-03-30 11:55:31 112

原创 AOP五种增强(下)

3.返回增强(又称返回通知)返回增强(又称返回通知):在目标方法正常结束后执行,可以获取目标方法的执行结果 @AfterReturning(value="execution(int mul(..))",returning="a") public void afterReturning(JoinPoint jp,Object a) { Object object = jp.getTarget(); String name= jp.getSignature().getName(); Syste

2021-03-04 21:12:02 202 1

原创 AOP五种增强(上)

概念:AOP,面向切面编程,就是当你已经完成,或者更加注意一些核心功能的时候。需要使用的编程过程,这个使用,你会发现,一个核心的业务,是由一个核心功能,和若干个额外服务类型的功能,统一组成的,比如数据验证,再比如日志的记录。其实在场景中,我们的核心功能是针对数据库的操作,可能是增删过程。而服务类功能,比如记录日志,或者输入内容的验证过程。其实不是非有不可。没有这个功能,核心功能也能正常执行。spring-AOP 的实现:切点(pointcut) 在某些个核心方法之前,之后等位置切点表达式:poi

2021-03-03 21:15:03 320 1

原创 闭锁,珊栏,信号量

闭锁(CountDownLatch):多线程并发的时候,设置计数器,当计数器的值没有减到0的时候,调用await()方法的线程会阻塞。countDownLatch():用来计数,每执行一次,计数器的值减去1await():用来阻塞当前线程,当计数器中的值没有减为0的时候,await()方法让当前线程阻塞设置计数器线程:import java.util.concurrent.CountDownLatch;//设置计数器线程public class Thread1 implements Run

2021-03-01 20:39:23 92

原创 TCP三握和四挥

三次握手:首先,服务器打开一个端口,变成监听状态。客户端发送一个请求SYN = x,客户端此时状态为SYN-sent状态。当服务器的监听端口收到客户端发过来的SYN请求后,向客户端回一个SYN = y,ACK = x + 1,这个ACK表明服务器已经收到了客户端发过来的请求,这个SYN是为了确认客户端是否真的要和自己建立连接,发送完成之后,服务器的状态变为SYN-RCVD(SYN收到状态)。当客户端受到服务器发送来的请求之后,端口变成建立连接状态,然后给服务器回一个ACK = y + 1,表明确

2021-03-01 20:35:26 102

原创 单例模式

全局只存在唯一一个对象,该类负责创建自己的对象,同时确保只有一个对象被创建,分别为懒汉式、饿汉式、双重检查锁模式。单例类只能有一个实例(构造方法私有)单例类必须自己创建自己的唯一实例(类中有方法来创建对象)单例类必须给所有其他对象提供这一实例(必须提供访问单例对象的方法)饿汉式(线程安全)这种方式在类加载时就完成了初始化,导致类加载的速度变慢,但是这种方式天生就是线程安全的。public class Demo1 { private static Demo1 demo1 = new

2021-02-26 20:25:14 72

原创 rehash过程

rehashredis哈希表结构 使用链地址方法来解决键冲突的,冲突后追加到链表后面。redis中有两个哈希表,其中一个时正常使用的 ht[0],另一个是在扩容或者收缩时才需要的ht[1],一般为空redis中的哈希表也是有 负载因子的负载因子 = 哈希表已保存节点数量 / 哈希表大小(桶的数量) load factor = ht[0].used / ht[0].sizeredis扩容时机:1. 服务器未执行BGSAVE / BAREWRITEAOF 时,哈希表的负载因子 >= 1 2

2021-02-26 20:20:26 1037

原创 父子容器

Spring父子容器我们之前将所有的容器创建过程都放在了一个配置文件中(一个配置文件中整合了SpringMVC、Mybatis等等)这样做太凌乱了。如果有一个过程出错了,整个容器都会出错,这时就引入了父子容器,在启动的时候先启动除了Controller以外的所有的其他的类型对象,而在真正Servlet启动的时候只把Controller和Intercepter加载出来就行了。(所有的Handle都是Spring体系下的东西)。Controller层属于Spring体系,Service层属于SpringM

2021-02-22 20:27:50 132

原创 Servlet和SpringMVC对比

Servlet实现登录配置web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://

2021-02-22 20:19:39 691

原创 多线程(三)

线程的生命周期新建:当一个Thread类或其子类的对象被声明或创建时,新生的线程对象处于创建状态就绪:处于创建状态的线程被start()后,将进入线程队列等待CPU时间片,此时他已具备了运行的条件,只是没分配到CPU资源运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run()方法定义了线程的操作和功能阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态死亡:线程完成了他的全部工作或线程被提前强制地终止或出现异常导致结束阻塞状态:

2021-02-18 16:27:05 67

原创 多线程(二)

多线程的创建方式二:实现Runable接口创建一个实现了Runnable接口实现类去实现Runnable中的抽象类方法:run()创建实现类的对象将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象通过Thread类的对象调用start()/** * 多线程的创建:方式二:实现Runable接口 * * @author ZAQ * @create 2020-02-05 17:01 *///1. 创建一个实现了Runnable接口class MThread

2021-02-18 16:10:01 67

原创 多线程(一)

多线程程序、进程、线程程序:一段静态的代码进程:是程序的一次执行过程。或是正在运行的一个程序。是一个动态的过程 。进程作为资源分配的单位线程:进程可进一步细化为线程,是一个程序内部的一条执行路径 。线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器。一个线程中的多个线程共享相同的内存单元/内存地址空间–>他们从同一堆中分配对象,可以访问相同的变量和对象。使得线程间通信更简洁,高效。但多线程操作可能会带来安全隐患多线程的创建创建一个继承于Thread类的子类重写Threa

2021-02-14 23:42:54 95

原创 几种设计模式(单例、代理、工厂、建造者)

单例设计模式(SingIton)1.饿汉式(线程安全)私有化类的构造器内部创建类的对象要求此对象也必须声明为静态的提供公共的静态的方法,返回类的对象public class SingletonTest1 { public static void main(String[] args) { Bank1 bank1 = Bank1.getInstance(); Bank1 bank2 = Bank1.getInstance(); Syste

2021-02-10 19:29:45 227

原创 偏向锁、轻量级锁、自旋锁、重量级锁的区别与锁膨胀

区别偏向锁:当一个线程访问对象时,它会偏向这个线程,此时对象持有偏向锁。偏向此时访问它的第一个线程,这个线程将对象头中的ThreadID改为自己的ID,之后再次访问这个对象的时候,只需要对比ID,不需要再使用CAS再进行操作轻量锁:当一个对象此时为偏向锁的时候,另一个线程访问这个对象,因为偏向锁不会主动释放,所以第二个线程可以看到对象此时的偏向锁状态。这时对象已经存在竞争了,此时检查原来持有该对象锁的线程是否依然存活,如果挂了,则可以将对象变为无锁状态,然后重新偏向新的线程,如果原来的线程依然存活,而

2021-02-08 18:23:16 1397

原创 Spring的IOC和DI

Bean:是一种JAVA语言写成的可重用组件。写成Bean,类必须是具体的和公共的,并且具有无参数的构造器,即java类,通常把需要进行控制反转的类叫做Bean。

2021-02-08 18:13:23 62

原创 回溯算法

回溯当在递归的过程中,如果某一个条件不满足,则向上面调用它的方法返回一个值,然后调用它的方法继续寻找能满足自己想要条件的结果集。迷宫问题如何求出小球的运动路径,小球运动的规则:走的顺序一定是 下->右->上->左。public class 迷宫问题 { public static void main(String[] args) { //创建地图 int[][] map = new int[8][7]; //将墙设置为

2021-02-07 17:09:40 70

原创 排序算法-----快排和希尔

1.快排原理快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。public class KuaiPai { public static void main(String[] args) { int[] array = {6,5,7,3,8,1,0,2,9,4}; quickSort(array, 0, array.length-1); System.out.print

2021-02-07 17:04:06 69

原创 Mysql数据库:索引的底层实现B树和B+树简单理解

什么是索引索引是一bai种单独的、物理du的对数据库表中一zhi列或多列的值dao进行排序zhuan的一种存储结构shu,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。索引的作用快速取数据。实现表与表之间的参照完整性可以减少排序和分组的时间。索引的类型FULLTEXT即为全文索引,目前只有MyIS

2020-12-05 16:16:29 413

原创 java中的fail-fast(快速失败)和fail-safe(安全失败)

快速失败(fail—fast)在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。原理:假设有两个线程(线程A,线程B),其中线程A负责遍历list、线程B修改list。在使用迭代器遍历时,AbstractList类的内部类Itr中定义了变量expectedModCount,初始值为集合的modCount值。在线程A在遍历list过程中,线程启动,同时线程B增加一个元素,这时modCoun

2020-11-25 20:34:09 159

原创 CopyOnWriteArrayList简单讲解

前言CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有一个容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只发生读取的操作)同一个容器中的数据,所以这样大家读到的数据都是唯一、一致、安全的,但是后来有人往里面增加了一个数据,这个时候CopyOnWriteArrayList 底层实现添加的原理是先copy出一个容器(可以简称副本),再往新的容器里添加这个新的数据,最后把新的容器

2020-11-25 20:16:45 354 1

原创 ConcurrentHashMap底层简单讲解

前言HashMap在多线程情况下,在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。HashTable,它是线程安全的,它在所有涉及到多线程操作的都加上了synchronized关键字来锁住整个table,这就意味着所有的线

2020-11-25 20:09:08 201

原创 JAVA的AQS,CAS和Reentrantlock简单讲解

AQS 中维护了一个锁状态字段 state,由 volatile 进行修饰,其中 0 表示未被获取,1 表示已被获取, 大于 1 表示重入数

2020-11-24 20:36:27 452

原创 Java进程和线程简单讲解

1.进程进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序,数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志特征:动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;并发性:任何进程都可以同其

2020-11-23 20:07:43 70

原创 HashMap底层源码简单讲解及红黑树

前言HashMa是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构。数组随机读取效率很高随机访问性强,查找速度快),插入和删除数据效率低。链表插入删除速度快,内存利用率高,查询效率低。HashMap特点HashMap是java中使用最为频繁的map类型,其读写效率较高,但是因为其是非同步的,即读写等操作都是没有锁保护的,所以在多线程场景下是不安全的,容易出现数据不一致的问题。在单线程场景下非常推荐使用。源码讲解1.创建 HashMap 时未指定

2020-11-16 20:44:29 178

原创 ArrayList底层源码

ArrayList底层源码可以和简解一起看:ArrayList的一些操作方法和底层源码简单讲解package java.util;import java.util.function.Consumer;import java.util.function.Predicate;import java.util.function.UnaryOperator;import sun.misc.SharedSecrets;/** * Resizable-array implementation of

2020-11-09 20:42:53 78

原创 ArrayList的一些操作方法和底层源码简单讲解

ArrayList的一些操作方法和底层源码简单讲解1.什么是ArrayListArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处2.操作方法(1)arr.add();是在集合的尾部添加数据; arr.add(0,"")是在指定位置添加数据,(0,"")不是覆盖0下标的数据而是插在0下标的前面添加数据,包括boolean addAll(Collection<? ext

2020-11-09 20:27:38 312

空空如也

空空如也

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

TA关注的人

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