自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 实验室设备管理需求分析

实验室设备管理系统需求分析

2022-12-15 16:00:45 868 1

原创 数据库-事务

什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。⭐事务的四大特性(ACID)原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部

2022-04-23 17:45:08 348

原创 Lock锁

先看官方文档:实现类有可重入锁、读锁和写锁,可重入锁最常用。可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。可以看到,ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁。公平锁:十分的公平,先来后到。非公平锁:十分不公平,可以插队。默认实现的是非公平锁。它的整个逻辑就是:加锁,在try里写业务代码,在finally里解锁。import java.util.concurrent.loc

2022-04-21 12:20:38 1100

原创 volatile 关键字(详细讲解)

我认为volatile 关键字有两个作用:第一个,它是可以去保证多线程环境下对于共享变量的可见性。第二个,是可以通过增加内存屏障去防止多个指令之间的一个重排序。我理解的可见性呢,是指当一个线程对于共享变量的修改,其他线程可以立刻看到修改之后的一个值。其实这个可见性问题我认为本质上是由几方面造成的:首先是CPU层面的告诉缓存,在CPU里面设计了三级缓存去解决CPU运算效率和内存IO效率的问题,但是他也带来了就是缓存一致性问题,而在多线程并行执行的情况下,缓存一致性就会导致可见性问题。所以对于增加

2022-04-16 16:34:07 951

原创 jvm-堆

堆:Heap,一个jvm只有一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,将什么东西放到了堆中呢?类、方法、常量、变量、保存我们所有引用类型的真实对象;堆内存还要细分为三个区域:新生区(伊甸园区):伊甸园区、幸存0区、幸存1区养老区永久区堆的内存模型:垃圾回收分为两种:轻量级垃圾回收(轻GC)、重量级垃圾回收(重GC);垃圾回收主要在新生区(细分就是新生区的伊甸园区)和养老区假设内存满了,就会报一个OOM错,其实就是堆内存不够了。在jdk8以后,永久存储区改了

2022-03-31 18:14:06 454

原创 CentOS系统安装Java

CentOS安装Java

2022-03-28 15:23:31 575 1

原创 native关键字(涉及本地方法栈)

native:凡是带了native关键字的,说明Java的作用范围达不到了,需要调用底层C语言的库。凡是带了native关键字会进入本地方法栈,会调用本地方法接口(JNI),JNI的作用是扩展Java的使用,使Java可以融合不同的编程语言为Java所用。历史:在Java诞生的时候,C和C++横行,Java想要立足就必须要有调用C、C++的程序,于是在内存区域中专门开辟了一块标记区域:本地方法栈;登记native方法,在最终执行的时候,通过JNI加载本地方法库中的方法。使用场景:使用Java操作

2022-03-20 17:47:26 1315

原创 类加载器以及双亲委派模型

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。自JDK1.2以来,Java一直保持着三层类加载器、双亲委派的类加载架构。一.存放位置1.启动类加载器(Bootstrap Class Loader):存放在jre\lib 目录下的 rt.jar,启动类加载器无法被Java程序直接引用。2.扩展类加载器(Extension Class Loade..

2022-03-20 15:32:45 451

原创 抗并发的两种策略

一种是数据库操作:做分库策略,另外,为了保证它的稳定性,我们可以做主从容灾。另一种是加缓存:可以把那些读的频率高且不常修改的数据预先存到缓存中,下次直接去缓存中查找,而频繁变动的数据不适合缓存我们就使用分库操作。对于那些访问频率特别高而且变动频率很低的,将他们放入缓存,比如Redis数据库;对那些经常需要变动的数据,没办法缓存,我们在数据库确实一台扛不住,我们就加了多台数据库进行了分库策略。分库策略:比如说数据库中有一百个表,我们在每台服务器上存放20个表,更新的时候去对应的服务器上进行操作。每台服

2022-03-19 13:28:38 794

原创 synchronized锁

对于普通方法:锁是当前实例对象。对于静态方法:锁是当前类的Class对象。也叫类锁。对于方法块:锁是Synchronized括号里配置的对象。也叫对象锁。当我们不加锁的时候,两个线程互不影响,说不定谁先执行Person类:public class Person { public void m1(String s){ System.out.println(s + "开始执行m1"); try { Thread.sleep(3000);

2022-03-19 13:04:12 740

原创 垃圾回收算法

从如何判定对象消亡的角度,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称为“直接垃圾收集”和“间接垃圾收集”,现在主流的Java虚拟机都采用的是追踪式垃圾收集算法。追踪式垃圾回收算法的策略并非是寻找垃圾本身,而是先寻找哪些对象存活,然后反过来判断其余所有的对象为垃圾对象。追踪式回收算法包括标记-清除(Mark-Sweep)算法、标记-复制(Mark-Copy)算法、标记-整理(Mark-Compac

2022-03-18 09:44:40 3010

原创 对象已死?及其判断算法

在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就 是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。下面是判断对象是否“已死”的两种算法。一.引用计数算法:1.原理:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加一;当引用失效时,计数器的值就减一;任何时刻计数器为零的对象就是不可再被使用的。举例(假设下面代码使用引用计数器):String p = new String("abc");p

2022-03-17 23:32:13 408

原创 JVM内存模型

Java虚拟机所管理的内存包括:虚拟机栈、本地方法栈、堆、方法区、程序计数器五块。方法区、堆是所有线程共享的数据区;虚拟机栈、本地方法栈、程序计数器是线程私有的数据区。1.程序计数器:是线程私有的;程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,字节码解释器就是通过改变这个计数器的来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。2.Java虚拟机栈:虚拟机栈就是我们平常说的堆栈的那

2022-03-16 13:52:56 1477 2

原创 Java值传递的问题

class Test{ String name; int age; public Test(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Test{" + "name='" + name + '\'' +

2022-03-09 23:17:03 250

原创 7. 整数反转

题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−2 ^ 31, 2 ^ 31 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-integer题解:以123 为例,将123 % 10 得到3,之后将123 / 10 得到 12将12 % 10 得到2,之后将12

2022-03-02 15:40:26 216

原创 题:==比较题

==是做一个判断的:对于基本数据类型而言是判断两个基本数据的值(value)是否相等;对于引用数据类型而言是判断两个引用数据的地址(address)是否相等。题解:(1)int a == Integer a1:int类型的a 和 Integer类型的a1使用 == 比较的话,Integer 的a1会自动拆箱,所以a 和 a1 比较的值。为true。(2)int a == new Integer(a1)a是基本数据类型int类型,那么== 右侧的就会自动拆箱,比较的是二者的值,所以为true。(.

2022-01-17 16:57:22 69

原创 为什么Byte类型的运算结果要用int类型来接收

今天写程序的时候发现byte类型的数值进行运算无法用byte接收,必须是int类型的。为什么Byte类型的运算结果要用int类型来接收?我们给他编译一把:javac Add.javajavap -v Add.class就是因为加法运算导致的,加法运算的指令是iadd,会使运算结果变为int类型。...

2022-01-17 11:28:19 499

原创 Field userManageService in com....

在Service层的实现类未加@Service注解

2022-01-08 01:14:03 1754

原创 git基础使用

这里以gitlab为例:1.创建远程仓库:2.给项目添加新成员3.创建本地仓库:(1)新建一个文件夹,使用如下命令://初始化仓库,这样就会产生一个.git的隐藏文件夹git init//本地仓库与远程仓库产生关联git remote add origin [email protected]:dubao/test000.git当前分支第一次向远程仓库提交的时候,他会提示你:我们复制一下提示的命令并且执行,作用是推送当前分支到远程对应的分支,同时建立关联,如果远程对应的分支不存在

2022-01-05 21:22:14 120

原创 34. 在排序数组中查找元素的第一个和最后一个位置

题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array思路:数组是个有序并且升序的数组,所以我们可以使用二分法来实现。有以下三种情况:(1)target在没有在给

2021-12-28 16:37:27 257

原创 Java基础--多态

一、概述:什么是多态?在 java 程序设计中,对象变量是多态的,多态是同一个行为具有多个不同表现形式或形态的能力。也是 OOP (Object Oriented Programming)中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只由在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。多态是同一个行为具有多个不同表现形式或形态的能力。二、多态实现的必要条件使用手机扫描二维码支付时,二维码并不知道客户是通过何种方式进行支付,只有

2021-12-13 10:28:11 662

原创 Java基础---继承

继承的基本作用是:代码的复用。默认所有的类都继承与Object类一、概念:继承是java面向对象编程的基石,继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。public class Person { public void run() { System.out.println("任何人都可以跑。。。"); }}class Student extends Person{ private void e

2021-12-11 11:36:39 422

原创 22. 括号生成

题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。方法一:暴力法public List<String> generateParenthesis(int n) { List<String> combinations = new ArrayList<String>(); generateAll(new char[2 * n], 0, combinations); return

2021-12-08 22:45:02 76

原创 SpringBoot常用注解以及作用

1.@SpringBootApplication这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上。@SpringBootApplication 是 @Configuration 、@EnableAutoConfiguration、@ComponentScan注解的集合。@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制@ComponentScan: 扫描被@Component (@Service,@Co

2021-12-08 18:03:32 2173

原创 UML类图

UML:统一建模语言,是用来设计软件的可视化建模语言,它的特点是简单、统一、图形化、能表达软件设计的动态与静态信息。UML从目标的不同角度出发,定义了例图、类图、对象图、状态图、活动图、时序图、协作图、构建图、部署图等9种图。类图:概述:类图是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及他们与其他类的关系图等。类图不显示暂时的信息、类图是面向对象建模的主要组成部分。作用:在软件工程中,类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化人们对系统的理解;类图

2021-12-07 22:22:02 124

原创 Redis-hash

Redis中hash的存储就是一个key-map的方式!本质和String类型没有太大区别,还是一个key-value形式!常用api:(实例中所用的myhash指的是key)1.增添:存储单个key-value数据:hset myhash field db##################################################存储多个key-value数据:hmset myhash field1 hello field2 world2.获取:hmset myha

2021-12-07 17:46:02 1417

原创 初始设计模式

1.设计模式:是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码的可复用性、可维护性、可读性、稳健性以及安全性的解决方案。2.来源:1995年,GoF(Gang of Four, 四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了23种设计模式,从此树立了软件设计模式领域的里程碑,人称GoF设计模式或GoF23。3.学习设计模式的意义:设计模式的本质是面向对象设计原则的实际应用,是对类的封装性、继承性和多态性以及类的关联关系和组合

2021-12-06 15:16:02 301

原创 SQL63 刷题通过的题目排名

题目:在牛客刷题有一个通过题目个数的(passing_number)表,id是主键第1行表示id为1的用户通过了4个题目;请你根据上表,输出通过的题目的排名,通过题目个数相同的,排名相同,此时按照id升序排列,数据如下:id为5的用户通过了5个排名第1,id为1和id为6的都通过了4个,并列第2题解:row_number()对应唯一排序:1、2、3、4dense_rank()对应相同次序可重复,但不跳过下一个次序值:1、2、2、3rank()对应相同次序可重复,并且跳过下一个次序值:1、

2021-12-05 17:04:12 109

原创 redis key/value 前面出现\xac\xed\x00\x05t\x00\x06 已解决

最近写项目时遇到的一个问题,当我向 redis 中 set 数据的时候 key 和 value出现\xac\xed\x00\x05t\x00\x06这些乱码,问题如图:原因:spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化。解决方法:在RedisUtil工具类中(redisTemplate所在类上)加上@Autowired(required = false

2021-12-04 23:28:00 1519

原创 3. 无重复字符的最长子串

题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。使用滑动窗口:滑动窗口不断向前,当前元素不在set中 就加入set 然后更新最大长度,i++继续下一轮循环,set中有重复元素不断让j++ 并删除窗口之外的元素 直到滑动窗口内没有重复的元素复杂度:时间复杂度O(n),n是字符串的长度。空间复杂度是O(n),即set的空间,最差的情况是O(n)public int lengthOfLongestSubstring(String s) { Set<Cha

2021-12-04 10:22:26 328

原创 ip、子网掩码、默认网关以及传输过程

IP:IP地址:由网络部分 和 本机部分 组成比如IP地址为 192.168.3.12 对应的二进制为 11000000 10101000 00000011 00001100子网掩码:子网掩码:将IP地址的网络部分和本机部分做区分比如子网掩码为 255.255.255.0 对应的二进制为 11111111 11111111 11111111 00000000子网掩码为1的部分为IP地址的网络部分,为0的部分为IP地址的本机部分默认网关:默认网关:数据从计算机网卡当中发送到网络

2021-11-30 21:30:49 2729

原创 mybatis批量删除和插入

批量删除:.xml<delete id="deleteByIds" parameterType="java.lang.Long" > delete from student where id in <foreach collection="idList" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach>&lt

2021-11-29 22:34:55 138

原创 876. 链表的中间结点

题目:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。解法一:单指针遍历两次,第一次遍历得到链表长度N,第二次遍历到N/2处返回该元素。public ListNode middleNode(ListNode head) { int n = 0; ListNode curr = head; while (curr != null){ ++ n; cu

2021-11-25 14:01:43 176

原创 StringBuffer和StringBuilder总结

1.什么是字符串常量池?JVM为了减少字符串对象的重复创建,其维护了一块特殊的内存,这段内存被称为字符串常量池(存储在方法区中)。当代码中出现字符串时,JVM首先会对其进行检查。如果字符串常量池中存在相同内容的字符串对象,如果有,则不再创建,直接返回这个对象的地址返回。如果字符串常量池中不存在相同内容的字符串对象,则创建一个新的字符串对象并放入常量池,并返回新创建的字符串的引用地址。new String(“str”)时,首先也会去检查常量池是否存在“str”(存在则不创建、不存在则在常量池先创建一个

2021-11-24 12:40:41 384

原创 344. 反转字符串

题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-string使用双指针,一个指针指从0向后遍历,一个指针从结尾向前遍历,然后进行元素的交换:public void reverseString(char[] s) { int n

2021-11-24 09:59:09 273

原创 189. 轮转数组

题目:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。规律:当翻转数组后,数组原位置i的元素到了(i + k)% n 的位置。我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i + k) mod n 的位置,最后将新数组拷贝至原数组即可。System.arraycopy的使用方法:public static void arraycopy(Object src, int srcPos, Ob

2021-11-22 21:37:30 255

原创 977. 有序数组的平方

题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。解法一:新建一个新数组来接受原数组平方后的值,然后对新数组进行排序:public int[] sortedSquares(int[] nums) { int[] arr = new int[nums.length]; for (int i = 0; i < nums.length; i ++){ arr[i] = num

2021-11-22 15:55:53 671

原创 mybatis模糊查找

<select id="showShop" resultType="com.qcby.demo1107.entity.Shop"> select * from shop <where> <if test="shop.shopName"> shop_name like CONCAT('%',#{shop.shopName},'%') </if>

2021-11-21 19:09:51 171

原创 二级菜单树的实现

1.实体类SysMenu:@Data@AllArgsConstructor@NoArgsConstructorpublic class SysMenu { @TableId(type = IdType.AUTO) private Long id; @TableField(value = "menu_name") private String menuName; @TableField(value = "menu_permission") priva

2021-11-21 14:10:37 163

原创 线程通信:生产者消费者问题

1.应用场景:假设仓库中只能放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走。如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,知道仓库中的产品被消费者取走为止。如果仓库中放有产品,则消费者将产品取走消费,否则停止消费并等待,知道仓库中再次放入产品为止。2.问题分析:这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件。对于生产者,没有生产产品之前,要通知消费者等待,而生产了产品之后,又需要通知消费者消费。对于消费者,在

2021-11-19 18:00:53 241 3

空空如也

空空如也

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

TA关注的人

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