- 博客(94)
- 资源 (5)
- 收藏
- 关注
原创 Posgresql macOS安装和基础操作
本文介绍macOS 13-15版本Postgresql-12的安装,pg常用命令。作为笔记记录,后续方便查看。
2024-01-15 23:05:43
1268
原创 SpringBoot基础:一步步创建SpringBoot工程
需要在:File – ProjectStructure – Facets – Spring – Configuration Files – Customize Spring Boot(左下角绿色叶子) – Add custom configuration files(+号) 添加配置文件。否则SpringBoot无法识别配置文件,可能导致启动失败。
2024-01-15 09:57:47
1200
原创 简单工厂、工厂方法、抽象工厂和策略模式
在抽象工厂模式中,可以使用简单工厂模式中的工厂类 + 反射技术,替换简单工厂方法中switch分支语句,再+配置文件,可以将反射需要的变量配置在配置文件中。这种方式解决了工厂类冗余问题,又满足开闭原则。
2023-12-25 11:57:14
1365
原创 Spring开发过程编码风格
规范编码风格:统一异常处理、规范日志打印和国际化、参数定义和参数校验、规范方法返回值、规范接口定义、明确Conroller、Service层负责功能
2023-03-13 13:42:30
288
原创 如何优雅的中断线程?
本文介绍了java中3种线程终止方式。分别是:volatile 标志位、interrupt()方法终止、重写Thread.interrupte()方法终止阻塞的socket。
2022-07-15 18:31:03
637
原创 JAVA单元测试Mock实践
本文介绍了Mock背景,常见的单元测试场景以及对应的测试方法,最后简单介绍了powermockit测试框架。理解本文内容,会带你入门java单元测试,其中第一章、第二章需要重点理解。
2022-07-03 15:58:03
5744
原创 Maven Pom文件详解
Pom全称Project Object Model(工程对象模型)。Pom文件是Maven运行的基础,其中详细描述了一些详细的工程配置信息。Pom文件分类默认Pom文件内容<project> <modelVersion>4.0.0</modelVersion> <repositories> <repository> <id>central</id> <name&
2022-05-21 12:59:58
1441
原创 Maven工具详解
maven是什么?Maven本质上是一种项目管理、部署工具,提供了如下功能:项目构建 文档 报告 依赖处理 SCMs 发布版本 包分发创建mvn工程mvn -B archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4maven工具生命周期验.
2022-05-21 12:04:51
843
原创 java日期格式转换SimpleDateFormat详细介绍
SimpleDateFormat类简介SimpleDataFormat类可用于格式化、解析携带区域的日期,可以将日期格式化为文本,可以将文本解析为日期,还可以进行日期规范化。SimpleDataFormat类支持用户自定义日期格式,同时也提供一些内置的日期格式,例如可通过getTimeInstance、getDateInstance或DateFormat中的getDateTimeIns.
2022-05-19 20:52:19
5716
原创 Kafka数据持久化、高效传输设计原理
一、kafka解决的业务痛点解决大量数据的实时传输问题。例如:可能需要支持高吞吐量的实时日志聚合系统事件流 可能需要支持大量后台日志处理中,离线系统周期加载数据 低延时消息传输这需要kafka系统支持分区,分布式,实时处理接收到的数据。此外,当数据被送到其他服务系统中时,kafka系统在机器出现问题是还必须有容错性保证。从某种程度上理解,kafka系统更像是一个日志数据库。二、kafka持久化存储数据设计kafka强依赖于文件系统和操作系统页缓存,摈弃java堆缓存机制,同时
2022-05-05 16:12:41
982
原创 OS系统中swap分区和虚拟内存关系
物理内存RAM即内存:随机存取存储器(random access memory),是与CPU交换数据的内部存储器。内存和CPU之间还存在L1-L3缓存用于解决CPU处理数据和读写数据之间的差异。虚拟内存基本概念:计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族...
2022-04-28 20:02:03
2872
原创 SpringBoot统一异常处理
来源:Spring Boot - Exception Handlinghttps://www.tutorialspoint.com/spring_boot/spring_boot_exception_handling.htm总体思路使用注解@ControllerAdvice注入统一处理异常的类 使用注解@ExceptionHandler注入处理指定异常的方法 其他地方入controller throw出异常后,该异常对应的ExceptionHandler注解方法会处理抛出的异常异常触发流程
2022-04-01 19:26:26
696
原创 平衡二叉树ALVBinaryTreeList
简介:本文介绍平衡二叉树基本概念,并通过继承AbstractBinaryTree抽象类,java实现ALVBinaryTreeList,主要操作算法有插入和删除。一、平衡二叉树基本概念1.平衡二叉树是什么?平衡二叉树时一种结构平衡的二叉树,即叶节点高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。2.为什么会出现平衡二叉树?1)二叉树插入时存在最坏情况,导致查找的时间复杂度为O(n)。例如:顺序插入1,2,3,...,时,二叉树严重失衡,退化为普通链表,查找时间复杂.
2021-12-23 18:31:28
972
原创 二叉树BinaryTreeList
本文介绍二叉树基本概念,并通过继承java集合List接口,java实现BinaryTreeList操作算法:插入、删除、前中后层次遍历、二叉树深度、最大小宽度等。
2021-12-22 18:26:51
553
原创 8. java并发包--ThreadLocalRandom和原子操作类
ThreadLocalRandom类是JDK7新增的JUC下的随机数生成器,弥补了Random类在多线程情况下的缺陷。1. java.util.Random类存在的问题Random类生成随机数原理:首先根据旧的种子生成新的种子,然后根据新的种子生成随机数。多线程情况下,为了避免多个线程同时根据旧种子生成相同的新种子,导致生成相同的随机数,Random类使用一个原子变量,用于保存初始化时的种子。通过循环CAS操作,以保证只有一个线程拿到旧种子来计算新种子。问题:多个线程通过CAS操作竞争
2021-10-26 08:38:22
181
原创 7.并发编程基本知识和基本原理
1.java中内存可见性问题JMM规定,所有变量都放在内存中,线程使用变量时,从内存中复制一份变量到线程工作空间,线程读写变量都是操作自己工作空间内部变量。由JMM可知,当线程A修改了变量C的值后,只修改了其本地内存的值,此时线程B并不知道线程A修改了变量C的值。导致变量C的值修改后不可见。共享内存不可见原因:与cpu多级缓存命中有关。JMM工作内存对应实际内存:JMM中对应的线程工作内存,对应CPU内部的L1、L2缓存、寄存器。2. 如何解决内存可见性问题?2.
2021-10-14 20:18:46
116
原创 1.kafka基本命令和配置说明
1.基本命令cd /opt/program-files/kafka/kf/bin./kafka-topics.sh --list --zookeeper zk:2181 #查看所以主题./kafka-topics.sh --create --zookeeper zk:2181 --replication-factor 1 --partitions 1 --topic test #创建主题test./kafka-topics.sh --describe --zookeeper zk
2021-09-27 14:41:59
487
原创 5. 线程死锁
1.线程上下文切换缘由:cpu个数小于线程个数,为了让用户觉得所有程序都在并行进行,需要cpu切换时间片。线程A时间片结束后,为了下一次再次运行线程A时知道该从哪里继续运行,需要保存线程A的上下文信息。线程切换时机:线程的cpu时间片使用完毕时,线程被其他线程中断时。2.线程死锁从表现定义死锁:两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象。在无外力干涉情况下,这种情况会持续等待下去。...
2021-09-24 09:05:33
113
原创 4.线程中断
总结:yield方法告知cpu调度器,当前线程请求让出自己的cpu使用。线程让出cpu后处于就绪状态。下次cpu调度还可能有限调度到刚刚让出cpu的线程。和sleep和wait不同的是:sleep方法让出cpu到指定时间,阻塞挂起,但是不释放锁;wait方法让出cpu直到指定时间或被notify,阻塞挂起,同时释放锁资源。而yield方法仅仅是让出cpu,随后进入就绪状态。...
2021-09-17 17:45:20
206
原创 3.线程睡眠的Thread.sleep和让出cpu的Thread.yield静态方法
总结:代码块内调用Thread.sleep方法不会释放监视器等锁资源,被其他线程中断后会抛出中断异常。验证sleep不会释放锁资源代码示例:如果线程A获取了锁资源,睡眠过程中,线程B也想获取锁资源,但是获取失败。这间接验证了Thread.sleep静态方法睡眠过程中不会释放锁资源。private static final Lock LOCK = new ReentrantLock(); public static void main(String[] args) { Thread
2021-09-16 10:00:02
943
原创 2.等待线程终止的Thread.join方法
定义:主线程中执行子线程Thread.join()方法会让主线程等待子线程执行完毕。1.主线程调用子线程的join方法后阻塞自己等待子线程返回代码举例:main主线程首先会在调用threadOne.join()方法后被阻塞,等待threadOne执行完毕后返回。然后主线程调用threadTwo.join()方法后再次被阻塞,等待threadTwo执行完毕后返回。CountDownLatch工具更好用。//等待线程终止的join方法 Thread threadOne
2021-09-15 22:24:04
770
原创 1.并发编程挑战
书行天下(1)上下文切换上下文切换:cpu通过时间片来执行任务,时间片结束后,需要切换线程。任务从保存到再加载的过程就是上下文切换。上下文切换存在的问题:上下文切换存在时间的开销,因此线程个数对系统存在影响。如何减少上下文切换:无锁并发编程、CAS算法、使用最少线程、协程。无锁并发编程 :多线程竞争锁存在线程切换,例如多线程处理数据时,将数据id经过hash算法取模分段到不同线程计算,避免使用锁。 CAS算法:比较、交换、自旋 适当数量的线程 协程:在单线程中实现多任务调度,并在
2021-09-09 22:49:03
123
原创 归并排序以及Tim排序
递归概念:方法自己调用自己。注意需要有返回条件,basecase。归并排序:递归+合并。是分治思想的实践,在递归基础上的一种排序算法。稳定,速度仅次于快速排序。归并排序思想:分解(Divide):将n个元素分成个含n/2个元素的子序列。 解决(Conquer):用合并排序法对两个子序列递归的排序。 合并(Combine):合并两个已排序的子序列已得到排序结果。默认的mergestatic void merge(){ int[] arr = {1,4,7,8,
2021-08-27 21:20:26
404
原创 java输入Scanner基本用法
1.基本介绍java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入,每个next获取输入对应的字符。Scanner sc = new Scanner(System.in);当我们通过 Scanner 类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要 使用hasNext与hasNextLine判断是否还有输入的数据:next() -->hasNext() nextLine() --...
2021-08-24 22:13:49
21165
转载 Linux中profile、bashrc、bash_profile之间的区别和联系
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.此文件类似于/etc/profile,也是需要需要重启才会生效,/etc/profile对所有用户生效,~/.bash_profile只对当前用户生效。~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用
2021-08-24 18:47:19
168
原创 冒泡排序优化算法
和选择排序区别:冒泡排序两两比较大小后都会交换,而选择排序仅仅记录最值的下标,一轮结束后再交换值。思路:重复找子数组中最大数,每次比较后都会交换最大数,最大数逐渐冒泡到顶部。代码思路:数组内值两两比较,符合条件后交换,再用同样的方法作用于子数组。方法1:平均时间复杂度:O(n ^ 2),最好、最坏时间复杂度:O(n ^ 2),两两交换,稳定private void bubbleSort() { int[] arrayRandom = new int[100];
2021-08-22 19:14:04
209
原创 验证排序算法是否稳定
思路:两个连续数字存储在数组中,内存地址是递增的,只需判断两个相同数字内存地址是否还是递增即可。具体方案:需要自定义MyInteger对象,因为对象才可获取内存地址。此外,获取对象内存地址,需要引入jol-core依赖包。代码示例:private boolean isStable(){ MyInteger[] array = new MyInteger[]{new MyInteger(2),new MyInteger(2),new MyInteger(2)};
2021-08-22 19:11:17
275
原创 插入排序优化算法
选择排序、冒泡排序、插入排序区别:选择排序,每次选择最大/小值放到前面合适位置,每轮内层循环交换一次。排好的子数组有序。 冒泡排序,每次两两比较都交换,将最大/小值交换到子数组位置。排好子数组有序。 插入排序,每次插入后子数组都有序,且不是根据最大/最小值排序。思路 :前i个数字有序,第i+1个数字和前面i个数字依次比较并交换顺序插入到前i个数字合适。和最小值冒泡排序有点像。代码思路:从第二个位置开始,和前面有序数字两两比较交换。但是优化后的插入排序,只需要交换1次。时空复杂度:平
2021-08-22 19:09:17
527
原创 选择排序算法优化
1.默认选择排序算法实现思路:记录最小数下标,重复一轮后,调换最小位置和前面位置,重复此过程。 private void selectSort(){ int[] array = {5,4,3,7,8,2,1,9,6}; for (int i = 0;i<array.length - 1;i++){//边界处理 int minPos = i; for (int index = i+1;index <
2021-08-18 15:32:16
637
原创 SpringBoot框架自定义工具类静态方法如何注入Bean
问题来源:工具类一般都是静态方法,静态方法只能调用静态成员,然而通过@Autowired注入的Bean不是静态成员,如何解决?解决方案:利用@PostConstruct注解,代码示例如下: //定义static类型的变量 private static ApplicationEventPublisher thisApplicationEventPublisher; @Autowired private ApplicationEventPublisher applicationEve
2021-08-08 22:15:16
1733
原创 Apache的Map子接口MultiValueMap
包来源:org.apache.commons.collections4.multimap定义:一个key可以对应多个value。和Map不同的时,同一个key存储多个value时,前面的value不会被后者覆盖。数据结构:基于Map、list、set。实际的数据结构包括:数组、链表(红黑树)实现原理:实际上是一个HashMap对象,但是其value是一个list对象。添加对象时,将value放入MultiValueMap的list中。获取对象时,一样通过get(key)方法获取list。贴出Ar
2021-08-08 22:02:55
2594
转载 手撸spring源码--设计模式实现spring容器
# 实现简单的spring容器# 1.背景##(1)spring容器是什么?用于承载对象的容器。对于spring容器来说,bean对象应该以类似零件方式拆解后放到bean定义中,对象解偶操作更有利于spring管理bean。当bean信息被定义后,再由spring统一装配,包括bean初始化、属性填充等,最后得到完整的实例化对象。##(2)hashmaphashmap是一种基于扰动函数、负载因子、红黑树转换等技术,形成的拉链寻址的数据结构,它能让数据更加散列的分布在哈希桶以及碰撞
2021-07-16 13:40:48
445
原创 设计模式六大原则
六大原则简述:单一职责原则:实现类/方法职责单一;开闭原则:要对扩展开放,对修改旧代码关闭。里氏替换原则:不要破坏继承体系;依赖倒置原则:要面向接口编程;接口隔离原则:在设计接口要精简单一;迪米特原则:要降低耦合;六大原则目的:为了构建灵活、可扩展、可维护的软件系统,它的重要性高于设计模式的,设计模式只是它的具体实践。(1)单一职责原则定义:一个类只负责一个功能领域中的相应职责。就一个类而言,应该只有一个引起它变化的原因。问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职
2021-07-15 10:37:06
1451
1
原创 Java Static关键字
1.static静态关键字修饰变量:静态变量是类公有的,所有类的实例化对象共同享有静态变量,多线程修改时非线程安全。但是搭配final使用时,线程安全。修饰方法:静态方法是类公有的,所有类的实例化对象共同公有静态变量,常作为工具类出现。静态方法只能调用静态变量、其他静态方法(调用非静态变量则与静态方法公有矛盾)。修饰块:静态块在类加载器加载对象时,要执行的一组语句,用于初始化静态变量。通常用于类加载的时候创建静态资源。其中,在静态块中不能访问非静态变量。修饰类:不能声明静态外部类/包,但是可
2021-07-08 22:42:49
81
原创 SpringBoot核心接口ApplicationContext
1.SpringBoot核心接口ApplicationContextApplicationContext是一个核心接口:<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> &
2021-06-28 11:35:50
524
mac-postgresql-12
2024-01-15
AmbientGAN: Generative models from lossy measurements--有损测量生成模型
2018-05-18
Alexnet训练mnist和cfar10数据集
2018-04-30
VGG16 & VGG19复现代码与权重
2018-04-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人