自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二叉树遍历

二叉树遍历:先序(根左右)、中序(左根右)、后序(左右根)顺序其实就是:遍历根节点的先后,先遍历根就是先序,中遍历根就是中序,最后遍历根就是后序。

2024-06-13 17:51:53 233

原创 CompletableFuture

CompletableFuture:相关知识点记录。

2024-04-29 14:35:32 71

原创 mysql一些语法记录

group by 对 where过滤后的数据进行分组;(分组字段去重后有几个,结果就有几行数据;分组字段可以有多个,如:group by a,b。函数如:sum(),count()等对分组后的每组数据进行计算 (有几组数据就有几条数据)having: 如果有having条件,having后是对分组计算后的数据进行过滤。count(列名) 符合条件行数排除null;count(*) 符合条件所有行数;

2024-04-21 19:39:26 434

原创 记录一个位计算应用算法

1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素重复,其他均出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

2024-03-01 17:47:35 379

原创 记一次异步编程类CompletableFuture使用案例

下面记录了一次,多线程处理处理一个业务的例子,并且要等待所有异步子线程执行完成后,主线程才能继续往下执行。CompletableFuture 是jdk8进入的一个异步变成工具,可以实现多线程编程。supplyAsync:异步线程有返回值;runAsync:异步线程没返回值。

2023-08-21 10:26:39 145

原创 java对大文件分片上传

这里记录一下,Java对大文件的切分,和后端接口分片上传的实现逻辑正常,前后端分离的项目其实是前端去切分文件,后端接口接收到切分后的分片文件去合并,这里都用java来记录一下。特别说明:我这里用的是zip包的上传,里面是音频文件,如果你的文件是单个文件,切分和合并文件逻辑都是一样的,只是不用后续的解压。

2023-08-15 17:28:32 1731 1

原创 easyExcel实现简单的excel导出/下载功能

【代码】easyExcel实现简单的excel导出/下载功能。

2023-07-31 16:47:54 491

原创 easyExcel实现简单的excel上传功能

3.编写测试控制器Controller。2.定义easyExcel的监听器。

2023-07-27 17:51:05 300

原创 字符流读取文本文件

poi CSV 字符流

2023-07-20 16:04:27 89

原创 记一次excel上传示例

excel poi

2023-07-19 16:35:48 43

原创 文件流的最简单应用

计算机能够存储的最小数据单位是字节,所有的文件数据都是字节,一个文件的所有数据可以看成一个字节数组。UTF-8编码 一个汉字3个字节 一个英文字符1个字节。GBK编码 一个汉字2个字节,一个英文字符1个字节。

2023-05-25 11:51:06 65

原创 支持相同key的Multimap

1. ArrayListMultimapArrayListMultimap可以支持key相同的键值对,并自动将value转为list。例如: Multimap<String, Integer> multimap = ArrayListMultimap.create(); multimap.put("a",1); multimap.put("b",2); multimap.put("c",3); multimap.put("a",4); multimap.put("a",5);

2022-04-29 18:16:49 525

原创 mysql锁

一、按粒度(以下全部以InnoDB引擎为基础)行锁开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;表锁开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。页面锁开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。二、锁的实现模式共享锁(S): 一个事务获取了共享锁,其他事务可以获取共享锁,不能获取排他锁,其他事务可以进行读操作,不能进行写操作。排他锁(X):如果事务T对数据A加上

2021-09-26 18:19:47 117

原创 JAVA8新特性常用的方法简单梳理

1. Stream的filter方法实现对集合元素的过滤List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);Stream<Integer> integerStream = list.stream().filter(a -> a > 3);List<Integer> list1 = integerStream.collect(Collectors.toList());System.out.pr

2021-05-27 10:43:40 199

原创 ElasticSearch的批量操作bulk

批量插入数据同一个index下,不指定_idPOST /gunsIndex/doc/_bulk{"index":{}}{"age":100,"name":"张三","address":"北京市顺义区","birthday":"2020-10-12"}{"index":{}}{"age":121,"name":"张四","address":"北京市顺义区1","birthday":"2020-01-13"}{"index":{}}{"age":122,"name":"王五","addres

2020-12-18 18:05:12 1219

原创 ElasticSearch template索引模板的使用

索引模板预先生成模板,对符合模板中规定的索引名称匹配规则的索引,在建立索引的时候自动使用模板中配置的索引信息如:setting,mapping,别名等。创建模板:PUT /_template/template_gunspoc{ "order": 0, "template": "guns*", "settings": { "number_of_shards": 6, "number_of_replicas": 1, "refresh_interval": "1

2020-12-17 14:28:03 1884

原创 elasticsearch创建索引和mapping

1. 创建索引的同时指定特殊字段的类型PUT /gunspoc{ "mappings": { "doc":{ "properties":{ "name":{ "type":"keyword" }, "age":{ "type": "long" }, "address":{ "type":"text" }, "b

2020-12-09 01:14:41 15105

原创 ElasticSearch的scroll分批查询

项目集成RestHighLeverConfigapplication.yml添加配置参数#ES集群rest接口rest-elasticsearch: ipAndPorts: 192.168.8.23:9200,192.168.8.24:9200,192.168.8.25:9200 schema: http connectTimeOut: 1000 socketTimeOut: 30000 connectionRequestTimeOut: 500 maxConnectNum

2020-12-07 16:48:06 633 1

原创 分布式事务及其CAP和base理论

分布式事务的概念首先来说一下本地事务,它是指我们单体应用单个数据库中的事务,在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,所以基于关系型数据库的事务又被称为本地事务。相对于本地事务来说,分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如用户注册送积分事务、创建订单减库存事务

2020-12-04 01:00:12 381 1

原创 Redisson实现分布式锁

1. 配置RedisCluster参数#redis cluseter 配置信息redisCluster: ipAndPorts: 192.168.8.23:7011,192.168.8.23:7012,192.168.8.24:7013,192.168.8.24:7014,192.168.8.25:7015,192.168.8.25:7016 maxTotal: 10000 timeOut: 100000 maxWait: -1 minIdle: 10 maxIdle: 8

2020-12-03 00:37:09 191

原创 记一次Jmeter需要登录后访问接口

新建线程组线程组下新建http request编辑http request新建请求头(因为此接口是在spring boot内部写的一个测试接口,所以需要登录权限才能访问)编辑http header manager主要是复制浏览器登录后访问后的请求头信息到jmeter中来,实现登录后访问。首先页面登录后,浏览器访问我们要测试的接口:http://localhost:8082/testRed复制此次请求的request header...

2020-11-30 17:10:56 1485

原创 curator实现分布式锁

基于zookeeper的CuratorApache Curator是一个比较完善的ZooKeeper客户端框架,通过封装的一套高级API 简化了ZooKeeper的操作。通过查看官方文档,可以发现Curator主要解决了三类问题:封装ZooKeeper client与ZooKeeper server之间的连接处理提供了一套Fluent风格的操作API提供ZooKeeper各种应用场景(recipe, 比如:分布式锁服务、集群领导选举、共享计数器、缓存机制、分布式队列等)的抽象封装。Curato

2020-11-28 17:39:14 1227

原创 @ControllerAdvice的几个应用

1. 添加全局数据(搭配@ModelAttribute)设置全局数据@ControllerAdvice 是一个全局数据处理组件,因此也可以在 @ControllerAdvice 中配置全局数据,使用 @ModelAttribute 注释进行配置。@ControllerAdvicepublic class MyGlobalExceptionHandler { /** * 添加全局数据 */ @ModelAttribute(value = "msg")

2020-11-18 00:39:19 974

原创 java中的==和equals的区别

1. 用==做比较如果比较的都是基础数据类型,那么比较的就是他们的值。如果比较的是包装类或String类,那么比较的是两个对象的内存地址。如果比较的一个是基础数据类型,一个是包装类,那么包装类会拆箱为基础数据类型进行比较。举例:int a =10;int b = 10;System.out.println(a == b);比较的是a和b的值都是10,所以会输出true;String a = "123";String b = "123";System.out.println(a =

2020-11-15 22:30:57 238

转载 理解零拷贝

前言 磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。 这次,我们就以「文件传输」作为切入点,来分析 I/O 工作方式,以及如何优化传输文件的性能。 正文 为什么要有 DMA 技术? 在没有 DMA 技术前,I/O 的过程是这样的: CPU 发出对应的指令给磁盘控制器,然后返回;磁..

2020-11-14 20:44:17 201

原创 序列化和反序列化

1.概念把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。对象的序列化主要有两种用途:把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;在网络上传送对象的字节序列。在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等

2020-11-11 22:29:16 235

原创 并发工具CountDownLatch和CyclicBarrier

1. 等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。背景:在jdk1.5之前中的join方法可以实现让当前线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远等待。例如:public class Test2 { public static void main(String[] args) throws InterruptedException { Th

2020-10-29 10:09:48 87

原创 jvm垃圾回收机制和回收器简单梳理

1. 哪些对象可以回收?1.1 引用计数法给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效,计数器就减1;任何时候计数器为0的对象就是可被回收的对象。这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其主要的原因是它很难解决对象之间相互循环引用的问题。所谓对象之间的相互引用问题。例如:除了对象objA和objB相互引用着对方之外,这两个对象之间再无任何引用。但是他们因为互相引用对方,导致它们的引用计数器都不为0,于是引用计数算法无法通知GC回收器

2020-10-27 15:16:32 584

转载 深入理解synchronized

使用synchronized的方式synchronized(lockObject){}public synchornized void test(){ //代码}但这里需要指出的是,无论是对一个对象进行加锁还是对一个方法进行加锁,实际上,都是对对象进行加锁。对于synchronized这个关键字,可能之前大家有听过,他是一个重量级锁,开销很大,建议大家少用点。但大家可能也听说过,但到了jdk1.6之后,该关键字被进行了很多的优化,已经不像以前那样不给力了,建议大家多使用。基于

2020-10-19 21:25:49 114

原创 设计模式8-组合模式

1.场景需求编写程序展示一个学校院系结构: 需求是这样, 要在一个页面中展示出学校的院系组成, 一个学校有多个学院,一个学院有多个系2.组合模式介绍组合模式(Composite Pattern) , 又叫部分整体模式, 它创建了对象组的树形结构, 将对象组合成树状结构以表示“整体-部分” 的层次关系。组合模式依据树形结构来组合对象, 用来表示部分以及整体层次。这种类型的设计模式属于结构型模式。组合模式使得用户对单个对象和组合对象的访问具有一致性, 即: 组合能让客户以一致的方式处理个别对象以

2020-05-17 18:01:51 124

原创 设计模式7-装饰者模式

1.装饰者模式定义装饰者模式: 动态的将新功能附加到对象上。 在对象功能扩展方面, 它比继承更有弹性, 装饰者模式也体现了开闭原则(ocp)2. 场景举例星巴克咖啡订单项目:咖啡种类/单品咖啡: Espresso(意大利浓咖啡)、 ShortBlack、LongBlack(美式咖啡)、 Decaf(无因咖啡)调料: Milk、 Soy(豆浆)、 Chocolate要求在扩展新的咖啡种类时, 具有良好的扩展性、 改动方便、 维护方便使用 OO 的来计算不同种类咖啡的费用: 客户可以点单品咖啡,

2020-05-17 00:24:12 145

原创 设计模式6-桥接模式

1.桥接模式介绍基本介绍桥接模式(Bridge 模式)是指: 将实现与抽象放在两个不同的类层次中, 使两个层次可以独立改变。是一种结构型设计模式Bridge 模式基于类的最小设计原则, 通过使用封装、 聚合及继承等行为让不同的类承担不同的职责。 它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来, 从而可以保持各部分的独立性以及应对他们的功能扩展2. 场景举例现在对不同手机类型的不同品牌实现操作编程(比如:开机、 关机、 上网, 打电话等)传统

2020-05-14 00:52:34 91

原创 设计模式5-适配器模式

1.基本介绍适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示, 主的目的是兼容性, 让原本因接口不匹配不能一起工作的两个类可以协同工作。 其别名为包装器(Wrapper)适配器模式属于结构型模式主要分为三类: 类适配器模式、 对象适配器模式、 接口适配器模式2.工作原理适配器模式: 将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容从用户的角度看不到被适配者, 是解耦的用户调用适配器转化出来的目标接口方法, 适配器再调用被适配者的相关

2020-05-12 01:40:02 112

原创 设计模式4-建造者模式

1.业务场景举例需要建房子: 这一过程为打桩、 砌墙、 封顶房子有各种各样的, 比如普通房, 高楼, 别墅, 各种房子的过程虽然一样, 但是要求不要相同的.请编写程序, 完成需求.2.传统方式public abstract class AbstractHouse { //打地基 public abstract void buildBasic(); //砌墙 public abstract void buildWall(); //封顶 publi

2020-05-09 01:21:57 102

原创 设计模式3-原型模式

1.业务场景现在有一只羊 tom, 姓名为: tom, 年龄为: 1, 颜色为: 白色, 请编写程序创建和 tom 羊 属性完全相同的 10只羊。2.传统解决方法实体类:public class Sheep { private String name; private int age; private String color; public Sh...

2020-05-07 02:40:47 145

原创 设计模式2-工厂模式

1.简单工厂模式1.1 传统方法业务场景:不同口味的披萨的制作流程package cn.stylefeng.guns.base.desgin.factorymodel.simpleFactory1;//将Pizza类做抽象public abstract class Pizza { protected String name; //准备原材料,不同的披萨不一样,因此做成...

2020-04-28 02:38:42 86

原创 设计模式1-单例模式

1.概述1.1基本介绍设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验, 模式不是代码, 而是某类问题的通用解决方案, 设计模式(Design pattern) 代表了最佳的实践。 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式的本质提高 软件的维护性, 通用性和扩展性, 并降低软件的复杂度。<<设计模式>> 是...

2020-04-26 00:06:22 171

原创 设计模式-UML类图

1.UML 基本介绍UML——Unified modeling language UML (统一建模语言), 是一种用于软件系统分析和设计的语言工具, 它用于帮助软件开发人员进行思考和记录思路的结果UML 本身是一套符号的规定, 就像数学符号和化学符号一样, 这些符号用于描述软件模型中的各个元素和他们之间的关系, 比如类、 接口、 实现、 泛化、 依赖、 组合、 聚合等, 如右图:...

2020-04-25 18:53:46 264

转载 @Configuration和@Component区别

@Configuration详解一、@Configuration@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Configuration { @AliasFor( annotation = Component...

2020-04-21 00:19:14 221

原创 设计模式-七大原则

1.设计模式的目的设计模式是为了让程序(软件), 具有更好代码重用性 (即: 相同功能的代码, 不用多次编写)可读性 (即: 编程规范性, 便于其他程序员的阅读和理解)可扩展性 (即: 当需要增加新的功能时, 非常的方便, 称为可维护)可靠性 (即: 当我们增加新的功能后, 对原来的功能没有影响)使程序呈现高内聚, 低耦合的特性2.设计模式七大原则单一职责原则接口隔离原则...

2020-04-20 00:18:14 365

空空如也

空空如也

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

TA关注的人

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