自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ConcurrentHashMap

ConcurrentHashMap1.ConcurrentHashMap的出现我们最常用的集合框架一定包括HashMap,但是都知道它不是线程安全的。在并发插入元素的时候,有可能出现带环链表,让下一次读操作出现死循环。而想要次避免HashMap的线程安全问题有很多办法,比如改用HashTable或者Collections.synchronizedMap。但是,这两者有着共同的问题:性能。无论读操作还是写操作,它们都会给整个集合加锁,导致同一时间的其他操作为之阻塞。因此,ConcurrentHa

2022-01-13 20:30:27 2266

原创 布隆过滤器

布隆过滤器1.什么是布隆过滤器谈到布隆过滤器,大家可能觉得很陌生,感觉第一次听过,先介绍下什么是布隆过滤器。本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。因此,相比于传统的List、Set、Map等数据结构,它更高效、占用空间少,但是缺点是其返回的结果是概率性的,而不是确切的。2.实现原理2.1.HashMap的问题我们在探究布隆过滤器的原理之前,我们先想想平时我们用来判断元素是否存在用的集合是什么?大概率回

2022-01-12 22:58:42 286

原创 HashMap源码剖析

1.HashMap源码剖析1.1.HashMap的底层实现1.1.1.JDK1.8之前JDK1.8之前HashMap底层是数组和链表结合在一起使用也就是链表散列。HashMap通过key的hashCode经过扰动函数处理过后得到hash值,然后通过(n - 1) & hash判断当前元素存放的位置(这里的n指的是数组的长度),如果当前位置存放元素的话,就判断该元素要与存入的元素的hash值以及key是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。所谓扰动函数指的就是HashM

2022-01-12 15:19:29 247

原创 Java并发机制的底层实现原理

1.Java并发机制的底层实现原理首先,我们都知道,Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转换成汇编指令在CPU上执行。那么我们想一下,我们Java代码中的并发操作是在哪里处理的呢?答案是在JVM的实现和CPU的指令。那我们带着好奇来探索下Java并发机制的底层实现原理。1.1.volatile的应用在我们平时的并发编程中使用的最多应该就是synchronized和volatile。volatile是轻量级的synchronized,它

2022-01-01 15:48:14 439

原创 并发带来的问题

1.并发带来的问题并发编程的目的是为了让程序运行的更快的,但是,是不是启动更多的线程就能让程序最大幅度地并发执行?这个问题值得我们深思。而我们一旦通过多线程去使得程序运行的更快,那么就会遇到几个问题:上下文切换死锁硬件和软件的资源限制那么当我们出现这些问题的时候,该如何去解决或者是避免呢?1.1.上下文切换1.1.1.解释上下文切换并说明其问题首先,想一个问题,为什么当我们使用多个线程并发执行的时候,为什么感觉到像是同时执行呢?通过我们学习的操作系统的知识来看,当进程从就绪到执行状态

2022-01-01 09:41:21 2171

原创 通过git将项目上传至码云

通过git将项目上传至码云1.点击将要上传的文件夹,在右键菜单栏中选择Git Bash Here选项。2.在弹出的Git命令窗口输入 git init3.复制gitee仓库的https链接4.在Git命令窗口输入 git remote add origin+https链接5.输入 git add .(.表示所有文件) 或者 git add + 文件名作用:将这些文件添加到暂存区6.输入git commit -m ‘描述’作用:commit会将暂存区中的文件,提交到本地仓库描述指的

2021-12-23 16:17:56 261

转载 Mybatis的一级缓存与二级缓存

1.mybatis一级缓存源码分析1.1.为什么要有一级缓存每当我们使用Mybatis开启一次和数据库的会话,就会创建一个SqlSession对象来表示这个会话。就在这一次会话汇总,我们有可能反复执行完全相同的查询语句,这些相同的查询语句在没有执行过更新的情况下返回的结果是一致的。如果每次都去和数据库进行交互查询的话,就会造成资源浪费。所以,mybatis加入了一级缓存,用来在一次会话中缓存查询结果。总结下一级缓存的存在起到的作用:在同一个会话里面,多次执行相同的sql语句(statementId,参

2021-12-16 15:07:04 217

原创 Spring AOP实现原理

Spring AOP实现原理这里整理了一下AOP实现的几种方式,同时将代理模式也整理了一下。代理模式代理模式模型如下:代理类实现了被代理类的接口,同时与被代理类是组合关系。下来看一下代理模式的实现。静态代理接口类:public interface Person { void speak();}真实实体类:public class Actor implements Person{ @Override public void speak() {

2021-12-09 19:45:00 222

转载 自实现Spring IOC和AOP(下)

1.概述上文实现的IOC和AOP功能很单一,且IOC和AOP两个模块没有整合到一起。IOC在加载bean过程中,AOP不能对bean织入通知。升级版IOC和AOP的功能:1.根据xml配置文件加载相关bean2.对BeanPostProcessor类型的bean提供支持3.对BeanFactoryAware类型的bean提供支持4.实现了基于JDK动态代理的AOP5.整合了IOC和AOP,使得二者可很好的协同工作2.IOC的实现2.1.BeanFactory的生命流程1.BeanFacto

2021-12-08 21:00:40 149

转载 自实现Spring IOC和AOP(上)

1.简单的IOC和AOP实现1.1.简单的IOC最简单的IOC容器只需4步即可实现,如下:1.加载xml配置文件,遍历其中的标签2.获取标签中的id和class属性,加载class属性对应的类,并创建bean3.遍历标签中的标签,获取属性值,并将属性值填充到bean中4.将bean注册到bean容器中代码结构SimpleIOC // IOC的实现类,实现了上面所说的4个步骤SimpleIOCTest // IOC的测试类Car // IOC 测试使用的beanWheel // 同上i

2021-12-08 20:09:30 123

转载 Dubbo

Dubbo1.分布式简要说明Dubbo是用于分布式系统的框架所以我们先要了解什么是分布式分布式系统是若干独立 计算机的集合,这些计算机对于用户来说就像单个相关系统。老式系统(单一应用架构)就是把一个系统,统一放到一个服务器当中然后每一个服务器上放一个系统,如果说要更新代码的话,每一个服务器上的系统都要重新去部署十分的麻烦。而分布式系统就是将一个完整的系统拆分成多个不同的服务,然后再将每一个服务单独的放到一个服务器当中。(三个臭皮匠赛过诸葛亮)1.1.应用架构及发展演变1.2.Dubbo和Sp

2021-09-30 15:50:23 659

原创 Java集合框架源码分析

集合框架Collection(单列)结构图:分析:Collection接口继承了Iterator,而List又继承了Collection,因此实现List的类都具有Iterator和Collection的相关方法。List特点:有序,可重复ArrayList底层:是一个数组分析源码字段 //默认的初始化容量 private static final int DEFAULT_CAPACITY = 10; //空数组 private static final Object[] EM

2021-09-23 14:38:25 346

原创 SSM整理。

1.Mybatis1.1事务凡是涉及查询操作的不需要事务提交,更新操作需要手动事务提交。mybatis中的事务默认是关闭的。可以选择session.commit()或者factory.openSession()时,指定autoCommit为true1.2连接池mybatis连接池提供了3种方式的配置:配置的位置:主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。type属性的取值:POOLED 采用传统的javax.sql

2021-08-09 20:31:39 115

转载 Kafka

Kafka1.Kafka概述1.1 定义Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。1.2 消息队列1.2.1 传统消息队列的应用场景使用消息队列的好处1)解耦允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。2)可恢复性系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。3)缓冲有助于控制和优化数据流过系统的速度,解决生产消

2021-07-07 11:17:04 297

原创 Linux基本指令

4. Linux 基本命令下面只是给出了一些比较常用的命令。推荐一个 Linux 命令快查网站,非常不错,大家如果遗忘某些命令或者对某些命令不理解都可以在这里得到解决。Linux 命令大全:http://man.linuxde.net/4.1. 目录切换命令cd usr: 切换到该目录下 usr 目录cd ..(或cd../): 切换到上一层目录cd /: 切换到系统根目录cd ~: 切换到用户主目录cd -: 切换到上一个操作所在目录4.2. 目录的操作命令(增删改查)mkdir

2021-05-02 09:41:22 106

原创 波士顿房价估计

一、导入模块import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsplt.rcParams['font.sans-serif'] = ['SimHei']二、载入数据from sklearn import datasets# 加载波士顿房价的数据集boston = datasets.load_boston()print(boston)打印结果:# 先要

2021-04-29 22:41:59 526

原创 IO流面试题

NIO1、介绍几个概念同步与异步同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。异步:异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠时间,回调等机制来通知调用者其返回结果。同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通过调用者其返回结果。阻塞和非阻塞阻塞:阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他

2021-04-27 23:26:42 545

原创 四大函数式接口和流式计算

四大函数式接口java.util.function,Java内置核心四大函数式接口,可以使用lambda表达式函数型接口,有一个输入,有一个输出public static void main(String[] args) { //函数式接口,可以改为lambda表达式 //Function<String, Integer> function = new Function<String, Integer>() { //

2021-04-21 11:36:47 148

转载 IO流

IO流IO流的分类根据处理数据类型的不同分为:字符流和字节流根据数据流向不同分为:输入流和输出流输入流和输出流对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流输入流:InputStream(字节流),Reader(字符流)输出流:OutPutStream(字节流),Writer(字符流)这四个类都是抽象类,可以把这四个类想象成四根不同的管道。一端接着你的程序,你可以通过输出管道从数据源里面往外读数据,也可以通过输入管道往数据源里面输入数据,总之

2021-04-06 09:31:29 125

原创 java基础

Java基础三高高可用、高性能、高并发java特性和优势简单性、面向对象、可移植性(跨平台性)、高性能、分布式、动态性、多线程、安全性、健壮性java程序运行机制计算机的高级编程语言类型:编译型、解释型,而java语言是两种类型的结合数据类型...

2021-03-21 22:15:50 98

原创 多线程

多线程死锁的四个条件死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系...

2021-03-18 16:04:38 195

转载 八大排序.

八大排序插入排序public static void insertSort(int[] array) { for (int i = 1; i < array.length; i++) { int temp = array[i]; int j = i - 1; for (; j >= 0 && array[j] > temp; j--) { //将大于temp的值整体后移一个单位

2021-02-27 14:16:48 84

原创 设计模式

23种设计模式策略模式策略模式(Strategy):它定义了算法家庭,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。Strategy类,定义所有支持的算法的公共接口//抽象算法类abstract class Strategy{ //算法方法 public abstract void AlgorithmInterface();}ConcreteStrategy,封装了具体的算法或行为,继承于Strategy//具体算法Aclass Concr

2021-02-24 10:09:29 112

原创 LeetCode热题hot100

LeetCode热题hot100两数之和class Solution { public int[] twoSum(int[] nums, int target) { int n = nums.length; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { if (nums[i] + nums[j] == t

2021-02-10 21:56:46 231

空空如也

空空如也

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

TA关注的人

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