自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HashMap 1.8 源码分析

HashMap 1.8 源码分析一、红黑树一、性质:每个结点不是红色就是黑色不可能有连在一起的红色结点根结点都是黑色叶子结点的(NIL),一定是黑色任意一个结点到其叶子结点的(NIL)的路径上黑色结点数相同二、HashMap JDK 1.8源码分析一、简介2、存储流程3、基础参数 /** * 主要参数 同 JDK 1.7 * 即:容量、加载因子、扩容阈值(要求、范围均相同) */ // 1. 容量(capacity): 必须

2021-09-01 00:28:38 161

原创 设计模式 之 建造者模式

建造者模式盖房项目需求需要建房子:这一过程为打桩、砌墙、封顶房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.通过以上需求,我们可以采用如下方式进行设计抽象房子Housepublic abstract class AbstractHouse { private String baise; private String wall; private String roofed; public void setBaise(String bais

2021-08-31 00:33:04 75

原创 设计模式 之 原型模式

原型设计介绍:原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。下面,我们通过业务需求来讲解原型设计,需求如下:现在有一只羊tom,姓名为:

2021-08-30 10:50:06 115

原创 设计模式 之 工厂模式

工厂模式首先来看传统的设计模式现在有一个需求:生产 小米手机手机接口//手机接口public interface Phone { void make();}小米手机类//小米手机类public class MiPhone implements Phone { public MiPhone() { this.make(); } @Override public void make() { // TODO Auto-ge

2021-08-28 12:12:32 110

原创 设计模式 之 单例模式

单例模式定义:所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。例如:比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象。SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这是就会使用到单例模式。单例模式有八种方式:加粗表示推荐使用(饿汉式虽然可能造成内存浪费,但是不存在线程安全问题)

2021-08-27 10:38:35 120

原创 线程安全集合类概述

线程安全集合类概述遗留的安全集合:HashtableVector修饰的安全集合:使用 Collections 装饰的线程安全集合Collections.synchronizedCollectionCollections.synchronizedListCollections.synchronizedMapCollections.synchronizedSetCollections.synchronizedNavigableMapCollections.synchroniz

2021-08-26 22:50:48 120

原创 CyclicBarrier

CyclicBarrier定义 :​ 循环栅栏,用来进行线程协作,等待线程满足某个计数。构造时设置『计数个数』,每个线程执行到某个需要“同步”的时刻调用 await() 方法进行等待,当等待的线程数满足『计数个数』时,继续执行CyclicBarrier cb = new CyclicBarrier(2); // 个数为2时才会继续执行new Thread(()->{ System.out.println("线程1开始.."+new Date()); t

2021-08-26 22:31:01 74

原创 CountDownLatch

CountDownLatch作用:允许一个或多个线程等待其他线程完成操作构造:​ CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。使用:​ 当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的

2021-08-26 22:04:54 220

原创 数据结构小记

数据结构数组固定长度一旦申请完毕 长度固定索引从0开始连续无论从逻辑上还是物理上都是连续随机存取指的是数组的可以通过下标索引直接方位对应元素链表由节点组成在物理上可以不连续删除 插入 是很快的双向链表 和 单项链表不具备随机存取单链表成环单链表反转栈先进后出队列先进先出双栈实现一个队列package CeShi;import java.util.Stack;/** * @author muzi * @descr

2021-08-26 20:14:59 88

原创 1、HashMap put 一个元素会引起什么

1、HashMap put 一个元素会引起什么JDK1.7中:创建HashMap时并不为table数组初始化(即创建时table是空数组),在第一次进行put操作的时候,才会进行初始化过程分为如下几个阶段:table初始化:第一次进入put方法,如果table = {} (即数组还没有初始化),那么进行初始化操作key判NULL:如果key为null,那么调用putForNullKey(value)方法,找到遍历table[0]寻找key = null,替换value值,如果找不到,就在该桶

2021-08-26 20:12:33 186

原创 StampedLock

StampedLock优点戳 stamp校验戳乐观读缺点不支持条件变量不支持重入应用限流资源数与线程数相同的时候(数据库连接池)原理acquire:执行try方法 执行一次 state–;如果state = 0,下一次再try就会阻塞放入阻塞队列;release:执行tryrelease方法将state++;如果成功 调用doreleaseShared方法唤醒阻塞结点,如果try成功,从阻塞队列取出,同时唤醒后继share结点,但是如果后继结点try失败,还是

2021-08-26 20:11:55 58

原创 ReentrantReadWriteLock读写锁

ReentrantReadWriteLock读写锁使用读-读不互斥读-写,写-读,写-写都互斥注意事项读锁不支持条件变量重入时锁升级不支持(读锁后加写锁)重入时锁降级支持(写锁后加读锁)应用缓存问题分析HashMap线程不安全多线程同时读取操作,任然会多次读取数据库多线程修改数据库时,可能会造成脏数据(要先修改数据库,再清空缓存)但是仍然会有可能出现脏数据,但是再读一次就是正确的数据了实现使用读写锁给写的方法添加写锁给读的方法在读取的时候添加读锁,在查

2021-08-26 20:11:21 69

原创 Java:手把手带你源码分析HashMap 1.7

HashMap源码分析JDK1.71、简介2、数据结构2.1 具体描述2.2 示意图2.3 存储流程2.4 数组元素 & 链表结点的 实现类3、基础知识:HashMap中的重要参数(变量)5、源码分析步骤1:HashMap类构造函数步骤2:向HashMap添加数据(成对 放入 键 - 值对)分析1:初始化哈希表分析2:当 key ==null时,将该 key-value 的存储位置规定为数组table 中的第1个位置,即table [0]分析3:计算存放数组 table 中的位置(即 数组下

2021-08-20 22:16:42 186 1

原创 为什么需要两个幸存区

JVM堆新生代幸存区为什么需要幸存区?为什么一个幸存区不行?两个幸存区是如何工作的?为什么需要幸存区?先不去想为什么有两个Survivor区,第一个问题是,设置Survivor区的意义在哪里?首先:如果没有Survivor(幸存区),Eden区每进行一次Minor GC,存活的对象就会被送到老年代。其次:随着Minor GC的次数增加,老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)。最终:由于老年代的内存空间远大于新生代,进行

2021-08-18 21:03:29 441 1

原创 JVM四种引用

JVM四种引用概述详解一、强引用(Strong Reference)二、软引用(Soft Reference)三、弱引用(Weak Reference)四、虚引用(Phantom Reference)引言在 JDK1.2 版之后,Java 对引用的概念进行了扩充,将引用分为:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)这 4 种引用强度依次逐渐减弱。除强引用外,其他 3

2021-08-17 00:24:48 758

原创 final finally finalize 区别及用法

final finally finalize 区别及用法区别一、性质不同二、作用三、简单区别四、中等区别五、详细区别区别一、性质不同1、final为关键字2、finalize()为方法3、finally为区块标志,用于try-catch-finally语句二、作用(1)final为用于标识常量的关键字,final标识的关键字存储在常量池中(在这里final常量的具体用法将在下面进行介绍);(2)finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对对

2021-08-16 21:12:57 436

原创 大白话详谈Java代理

大白话谈Java代理引言一、静态代理1、目标接口2、目标类3、代理类4、执行结果二、动态代理1、JDK动态代理代理类执行结果2、CGLIB动态代理代理类执行结果三、Spring Aop 代理探究1、切面类2、目标接口3、目标类4、xml文件5、CGLIB动态代理执行结果6、JDK动态代理执行结果引言代理是什么?为什么要使用代理代理模式(Proxy)是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,如添加权限,访问控制和审计等功能。相当于现在有一个目标类和一些目标方法,但是规定了你不

2021-08-13 22:17:19 141

原创 大白话谈Java反射

大白话谈Java反射一、正射二、反射三、常用反射API1、通过反射获取Class对象2、通过反射创建类对象3、通过反射获取类属性、方法、构造器一、正射反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。 A a = new A(); a.setA("muzi");上面这样子进行类对象的初始化,我们可以理解为「正」。二、反射而反射则是一开始并不知

2021-08-13 20:37:09 161

原创 Java类加载的顺序

Java类加载的顺序类加载优于类实例化对象类加载:程序从上到下,加载静态的初始化语句,初始化块和构造方法类创建对象:程序从上到下,加载非静态的初始化语句,初始化块和构造方法类初始化变量初始值类初始化变量的默认值如下: byte、short、int :0 long :0L float :0.0f double :0.0d char :空字符(即:/u0000) boolean :false 引用类型 :null代码示例public cla

2021-08-12 23:25:12 156

原创 “equals“和“==“的区别

"equals"和"=="的区别为什么说重写equals方法就要重写hashCode方法Object类 equals方法实际是调用的 "=="方法,即比较Object对象的hashCode值public boolean equals(Object obj) { return (this == obj); }如果是基本数据类型,那么"=="比较的就是值,如果是引用类型,那么引用类型的对象内存放的值实际上是引用的地址,所以比较的就是地址所以在定义一个类的时候,如果需要

2021-08-12 22:46:38 64

原创 Java动态绑定和静态绑定

Java动态绑定和静态绑定程序绑定静态绑定动态绑定程序绑定程序绑定:一个方法的调用与方法所在的类(方法主题)关联起来,即计算机要明确最终执行的方法是谁的方法。对Java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定静态绑定在程序执行前方法已经被绑定(在编译过程中就已经明确这个方法是哪个类的方法),此时,由编译器或其它连接程序实现。注意:Java中只有 final,static,private修饰的方法和构造方法是前期绑定的。关于final,static,private和

2021-08-12 21:41:34 447

原创 奥运金牌旁行榜

奥运金牌旁行榜我的算法比较简单的做法Arrays.sort自定义排序规则我的算法比较低效率的一种方法二维数组{{1,2,3},{2,3,1}}三次外层循环从最后一位开始循环排序,排序内部(如果后面比前面大,才交换) static void test(int [][] data){ int[] sign = new int[data.length]; for (int j = 2;j>=0;j--){ for (int i = 0;

2021-08-12 20:15:06 50

原创 今日算法随手记

一、相邻数之和public static int test1(int a){ List<String> ss = new ArrayList<>(); String result = ""; int num = 1; System.out.println(a + "=" + a); for (int i = 1;i < a;i++){ String tmp = "" + a

2021-08-12 20:01:39 39

原创 Java值传递

Java值传递方法参数Java值传递方法参数方法都在栈中开辟空间,方法的参数是根据实参拷贝的副本,在栈中另外开辟空间,在方法内部的操作都是对这个参数副本进行的操作,在方法结束后,该参数副本的空间会释放掉,因此,如果方法内部是对对象本身的改变则不会影响原对象,如果是对对象的属性进行修改,那么原对象也会做相应改变。Java值传递值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递(pass by r

2021-08-12 00:13:57 98

原创 128陷阱

128陷阱Integer源码分析Integer源码分析IntegerCache//Integer内部的一个静态内部类//在加载这个Integer类的时候,会加载这个静态内部类,从而生成了cache[256],//这里这么写的原因应该是为了频繁使用Integer常用值[-128~127]的时候减轻内存的消耗private static class IntegerCache { static final int low = -128; static final i

2021-08-11 23:40:28 59

原创 HTML页面 三步引用Echarts

简单引用Echarts一、下载echart.js二、创建HTML页面三、引用echarts图一、下载echart.jsecharts官网下载二、创建HTML页面创建html页面,并且引用上面加载的echarts.js<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content=

2021-08-11 11:22:57 9144 5

原创 自己编写的-微信对账程序

微信对账下载微信对账单下载系统平台账单对账程序下载微信对账单@Override public PayResultData<WxPayBillAllModel> downloadBill(String billDate) { if(StringUtils.isBlank(billDate)){ logger.error("下载对账单的日期"); return PayResultData.fail("下载对账单的日期");

2021-08-10 21:07:35 435

原创 巧妙交换变量-很简单

不借助第三个变量交换两个变量的方法//方式一:加减@Testpublic void fun1(){ int a = 10, b = 100; a = a + b; b = a - b; a = a - b; System.out.println("a: "+ a +" || " + "b: " +b);}//方式二:乘除@Testpublic void fun2(){ int a = 10, b = 100; a = a * b;

2021-08-10 20:39:31 60

原创 Redis 重复提交验证

AOP+Redis重复提交验证利用注解实现重复提交验证一、RedisUtil二、注解类三、AOP配置类五、重复提交验证异常处理四、使用方法利用注解实现重复提交验证一、RedisUtil这里只使用了RedisString 如果涉及到List、Map等操作、可以去我的另一篇博客查看 RedisUtil.package com.qcby.teach.help.util;import org.springframework.beans.factory.annotation.Autowired;i

2021-08-07 10:00:46 501

原创 Spring boot 多环境配置

Spring boot 多环境配置为什么要使用多环境配置多环境配置的作用如何使用多环境配置一、创建yml文件二、配置yml文件内容三、创建配置类四、创建测试类五、指定开发环境(修改application.yml)六、执行查看控制台为什么要使用多环境配置一个项目的研发有不同阶段(开发,测试,预发布,发布)在不同阶段可能对应不同的配置(数据库配置,Redis配置,微信扫码授权配置,微信支付配置等等)在开发的时候,我们一般用开发数据库;而在发布环境的时候,我们是用正式的数据多个环境之间的配置互不影响。

2021-08-05 10:59:45 242 1

原创 Redis

Redis的引用RedisConfigRedisUtil配置连接Redis使用RedisUtilRedisConfig向Spring容器中注入RedisTemplate(操作redis的最底层工具)package com.qcby.teach.help.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;imp

2021-07-29 15:58:01 113 1

原创 PAT-写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10​100​​。输出格式:在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。输入样例:1234567890987654321123456789输出样例:yi san wu...

2019-07-20 09:36:57 128

原创 PAT-我要通过

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。得到“答案正确”的条件是:字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;如果 aPbTc...

2019-07-20 09:30:12 354

原创 PAT-3n+1

卡拉兹(Callatz)猜想:对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数...

2019-07-19 10:10:23 136

原创 PAT-单身狗

PAT=单身狗#include <iostream>#include <cstdio>#include<algorithm>#include<cstring>#include <iomanip>using namespace std;// 单身狗int result[100100];int ma[100010];int...

2019-07-19 09:50:46 305

空空如也

空空如也

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

TA关注的人

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