![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
菠萝y
发上等愿,结中等缘,享下等福;择高处立,寻平处住,向宽处行。
展开
-
设计模式之桥接模式
在开始学java的时候老师讲到继承的时候,总是喜欢用一个例子来讲解,那就是画图,这里有一个画笔,可以画正方形、长方形、圆形(这个大家都知道怎么做吧,我就不解释了)。但是现在我们需要给这些形状进行上色,这里有三种颜色:白色、灰色、黑色。这里我们可以画出3*3=9中图形:白色正方形、白色长方形、白色圆形。。。。。。到这里了我们几乎到知道了这里存在两种解决方案:我们我们采用方案一来实现的话,我们是不是也可以这样来理解呢?为每种颜色都提供各种形状的版本呢?这个是完全的可以的。如下:对于中两个图形,我们都会很清楚转载 2022-06-15 20:52:53 · 316 阅读 · 0 评论 -
MoneyUtil-钱处理工具类
import java.math.BigDecimal;import java.math.RoundingMode;/** * 人民币转化工具类 */public class MoneyUtil { /** * 分转元 * @param money long */ public static String fenToYuan(long money) { return fenToYuan(BigDecimal.valueOf(mon.原创 2022-03-08 16:08:02 · 583 阅读 · 0 评论 -
IpUtils-IP工具类
import com.google.gson.Gson;import com.shuidihuzhu.razor.client.utils.json.GsonUtils;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.slf4j.MDC;import javax.servlet.http.HttpServletRequest;import java.util.Enu.原创 2022-03-08 15:31:05 · 667 阅读 · 0 评论 -
版本号比较-工具类
/** * @author zhangbo */public class VersionUtil { /** * 比较APP版本号的大小 * <p> * 1、前者大则返回一个正数 * 2、后者大返回一个负数 * 3、相等则返回0 * * @param version1 app版本号 * @param version2 app版本号 * @return int */ publ.原创 2022-03-08 15:29:24 · 519 阅读 · 0 评论 -
工作日时间处理-工具类
import lombok.Getter;import lombok.Setter;/** * @author yuechao * @date 2022/3/5 */@Getter@Setterpublic class Pair <L, R> { private L left; private R right; public Pair() { } public Pair(L l, R r) { this.left =.原创 2022-03-08 15:26:19 · 247 阅读 · 0 评论 -
DateUtil-时间处理类
package com.shuidihuzhu.razor.client.utils.date;import com.shuidihuzhu.razor.client.utils.ValueWidget;import jodd.util.StringUtil;import org.apache.commons.lang3.time.DateUtils;import org.joda.time.DateTime;import java.text.ParseException;import ja原创 2022-03-08 15:23:07 · 585 阅读 · 0 评论 -
DateUtil8-时间工具类
import com.google.common.collect.Lists;import java.time.DayOfWeek;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;import java.time.MonthDay;import java.time.Period;import java.time.format.DateTimeFormatter;im..原创 2022-03-08 15:22:17 · 161 阅读 · 0 评论 -
HttpClientUtil-网络请求工具类
import com.google.gson.Gson;import com.shuidihuzhu.razor.client.utils.json.GsonUtils;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.apache.http.NameValuePair;import org.apache.http.client.ResponseHandler;impo.原创 2022-03-08 15:16:46 · 411 阅读 · 0 评论 -
图片合成工具类
工具类package com.shuidihuzhu.razor.client.utils;import lombok.extern.slf4j.Slf4j;import javax.imageio.ImageIO;import java.awt.*;import java.awt.geom.AffineTransform;import java.awt.geom.Ellipse2D;import java.awt.geom.RoundRectangle2D;import java.aw原创 2022-03-08 14:45:45 · 314 阅读 · 0 评论 -
下载图片工具类
import com.shuidihuzhu.common.web.util.http.HttpResponseModel;import com.shuidihuzhu.common.web.util.http.HttpUtil;import lombok.extern.slf4j.Slf4j;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;/** * * @date 2021.原创 2022-03-08 14:42:35 · 500 阅读 · 0 评论 -
SpringMVC中ControllerAdvice 注解的三种使用场景
SpringMVC 中 @ControllerAdvice 注解的三种使用场景!@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:全局异常处理全局数据绑定全局数据预处理灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分别来看。全局异常处理转载 2021-11-29 15:08:05 · 125 阅读 · 0 评论 -
java 驼峰字符和下划线字符相互转换工具类
此工具类需要依赖谷歌的java开发工具包guava,这个工具包里面具备了很多功能具体的可以参考并发编程网关于guava的系列教程[ 快捷入口 ]:CaseFomat提供的枚举常量的说明SN 枚举常量 说明1 LOWER_HYPHEN 连字符的变量命名规范如lower-hyphen2 LOWER_UNDERSCORE c++变量命名规范如lower_underscore3 LOWER_CAMEL java变量命名规范如lowerCamel4 UPPER_CAMEL java和c++类的命名规范如U转载 2021-09-10 14:24:45 · 835 阅读 · 0 评论 -
策略工厂模式实践
策略工厂模式替代Java中多个if-else 判断一、主handler/** * 主handler **/public interface SearchDetailHandler { /** * @param id 详情id主键 * @return 搜索详情结果 */ SearchContentDetailRes handler(Long id);}二、策略工厂import com.google.common.collect.Maps;原创 2021-08-23 23:03:49 · 1353 阅读 · 1 评论 -
@PostConstruct和@PreDestroy执行解释
最近开发中需要一个启动时调用方法将其数据加入缓存的需求,本来想写个监听器或者过滤器的 但是发现网上说两个注解可以实现,便试了一试,@PostConstruct和@PreDestroy那这两个注解到底是干什么用的了 今天我们来讨论一下,又说的不多的地方还望不吝赐教。从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式:@PostConstruc转载 2021-08-23 21:16:02 · 306 阅读 · 0 评论 -
Spring中的InitializingBean接口的使用
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。测试,如下:import org.springframework.beans.factory.InitializingBean;public class TestInitializingBean implements InitializingBean{ @Override public void afterPr转载 2021-08-23 20:47:11 · 179 阅读 · 0 评论 -
分布式自增ID生成算法 - 雪花算法(SnowFlake)
一、概述1、SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:● 1位,不用。二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0● 41位,用来记录时间戳(毫秒)。○ 41位可以表示241−12^{41}-1241−1个数字,○ 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 241−12^{41}-1241−1,减1是因为可表示的数值范围是从0开始算的,而不是1。○ 也就是说41位可以表示24转载 2020-11-28 23:08:04 · 492 阅读 · 0 评论 -
八、JDK1.8中HashMap扩容机制
导读前面文章一、深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二、Jdk1.7和1.8中HashMap数据结构及源码分析 、三、JDK1.7和1.8HashMap数据结构及源码分析-续 中我们分别对JDK1.7和JDK1.8中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法做了深入的讲解和源码分析。四、深入理解Java中的HashMap「网易面试快答」文章中主要针对面试中常见的面试问题进行简单解答。五、深入理解JDK1.7中H原创 2020-10-12 16:29:11 · 7674 阅读 · 3 评论 -
七、JDK1.7中HashMap扩容机制
导读前面文章一、深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二、Jdk1.7和1.8中HashMap数据结构及源码分析 、三、JDK1.7和1.8HashMap数据结构及源码分析-续 中我们分别对JDK1.7和JDK1.8中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法做了深入的讲解和源码分析。四、深入理解Java中的HashMap「网易面试快答」文章中主要针对面试中常见的面试问题进行简单解答。五、深入理解JDK1.7中H原创 2020-10-10 11:05:14 · 3964 阅读 · 4 评论 -
六、深入理解JDK1.8中HashMap哈希冲突解决方案
导读前面文章一、深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二、Jdk1.7和1.8中HashMap数据结构及源码分析 、三、JDK1.7和1.8HashMap数据结构及源码分析-续 中我们分别对JDK1.7和JDK1.8中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法做了深入的讲解和源码分析。四、深入理解Java中的HashMap「网易面试快答」文章中主要针对面试中常见的面试问题进行简单解答。五、深入理解JDK1.7中H原创 2020-09-29 15:22:52 · 2160 阅读 · 0 评论 -
五、深入理解JDK1.7中HashMap哈希冲突解决方案
导读前面文章一、深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二、Jdk1.7和1.8中HashMap数据结构及源码分析 、三、JDK1.7和1.8HashMap数据结构及源码分析-续 中我们分别对JDK1.7和JDK1.8中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法做了深入的讲解和源码分析。 四、深入理解Java中的HashMap「网易面试快答」文章中主要针对面试中常见的面试问题进行简单解答。本篇文章我们将要对JDK1.原创 2020-09-29 15:12:13 · 1430 阅读 · 0 评论 -
十七、IO进化过程之EVENT(EPOLL-事件驱动异步模型)
导论前面几篇文章我们分别从一、C10K问题经典问答二、java.nio.ByteBuffer用法小结三、Channel 通道四、Selector选择器五、Centos-Linux安装nc六、windows环境下netcat的安装及使用七、IDEA的maven项目的netty包的导入(其他jar同)八、JAVA IO/NIO九、网络IO原理-创建ServerSocket的过程十、网络IO原理-彻底弄懂IO十一、JAVA中ServerSocket调用Linux系统内核十二、IO进化过程原创 2020-09-28 11:42:51 · 836 阅读 · 0 评论 -
四、深入理解Java中的HashMap「网易面试快答」
导读前面文章一、深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二、Jdk1.7和1.8中HashMap数据结构及源码分析 、三、JDK1.7和1.8HashMap数据结构及源码分析-续 中我们分别对JDK1.7和JDK1.8中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法做了深入的讲解和源码分析。本篇文章是前面几篇文章的后续,主要针对面试中常见问题的解答。如果大家在面试中针对Java集合或者Java中的HashMap大家还有什原创 2020-09-28 10:53:27 · 745 阅读 · 0 评论 -
三、JDK1.7和1.8HashMap数据结构及源码分析-续
导读前面文章一、深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上一篇文章二、Jdk1.7和1.8中HashMap数据结构及源码分析 中我们对JDK1.7中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法做了深入的讲解和分析,本篇文章是上一篇文章的后续。本篇文章我们将要对JDK1.8中HashMap的数据结构、主要声明变量、构造函数、HashMap的put操作方法等做深入讲解,同时通过对源码的分析做进一步了解。简单介绍JDK1.7—》哈希表原创 2020-09-27 17:20:58 · 494 阅读 · 0 评论 -
二、Jdk1.7和1.8中HashMap数据结构及源码分析
导读上篇文章(一、深入理解-Java集合初篇 )中我们对Java的集合体系进行一个简单的分析,本篇我们我们将针对Java集合体系中的HashMap做详细介绍。简单介绍JDK1.7—》哈希表,链表JDK1.8—》哈希表,链表,红黑树— JDK1.8之后,当链表长度超过8使用红黑树。非线程安全0.75的负载因子,扩容必须为原来的两倍。默认大小为16,传入的初始大小必须为2的幂次方的值,如果不为也会变为2的幂次方的值。根据HashCode存储数据。JDK1.7-HashMap数据结构—》数原创 2020-09-27 17:12:22 · 988 阅读 · 2 评论 -
一、深入理解-Java集合初篇
导读:本篇文章开始我们将要开始讲解Java集合,包括List、Set、Map等,也会对HashMap做深入的讲解。通过JDK1.7和JDK1.8两个版本的源码分析一步一步引导大家理解编程思想。同时还会就JDK1.7、JDK1.8两个版本的哈希冲突解决机制、哈希扩容机制等内容做深入的讲解。本篇将先引导大家认识Java集合并就各集合之间的优缺点简单分析。Java集合类图Java集合框架之ListArraylist底层数组实现,有序,可重复,不可为空查找快,增删慢,非线程安全扩容原来的1.5原创 2020-09-25 12:09:44 · 568 阅读 · 0 评论 -
十六、Netty入门服务端代码
导论前面几篇文章我们分别从一、C10K问题经典问答二、java.nio.ByteBuffer用法小结三、Channel 通道四、Selector选择器五、Centos-Linux安装nc六、windows环境下netcat的安装及使用七、IDEA的maven项目的netty包的导入(其他jar同)八、JAVA IO/NIO九、网络IO原理-创建ServerSocket的过程十、网络IO原理-彻底弄懂IO十一、JAVA中ServerSocket调用Linux系统内核十二、IO进化过程原创 2020-09-24 16:05:33 · 448 阅读 · 0 评论 -
JavaIO体系文章目录
JavaIO流体系结构图注意:学习过程中,对于实际的示例案例一定要在看的基础上自己动手写一下,并测试一下,这样更方便深入理解。第一篇文章我们从IO体系中的经典问答引导大家深入了解IO体系,尤其是网络IO问题。一、C10K问题经典问答从第二篇文章开始我们讲解JAVAIO体系中的一些工具及用法。二、java.nio.ByteBuffer用法小结三、Channel 通道四、Selector选择器以下两篇文章是用于在linux系统或者windows系统环境下 安装nc 测试命令的。用于后续的soc原创 2020-09-23 14:00:35 · 137 阅读 · 0 评论 -
十五、使用Selector(多路复用器)实现Netty中Reactor主从模型
导论前面几篇文章我们分别从一、C10K问题经典问答二、java.nio.ByteBuffer用法小结三、Channel 通道四、Selector选择器五、Centos-Linux安装nc六、windows环境下netcat的安装及使用七、IDEA的maven项目的netty包的导入(其他jar同)八、JAVA IO/NIO九、网络IO原理-创建ServerSocket的过程十、网络IO原理-彻底弄懂IO十一、JAVA中ServerSocket调用Linux系统内核十二、IO进化过程原创 2020-09-23 10:39:12 · 1392 阅读 · 1 评论 -
十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型
导论前面几篇文章我们分别从一、C10K问题经典问答二、java.nio.ByteBuffer用法小结三、Channel 通道四、Selector选择器五、Centos-Linux安装nc六、windows环境下netcat的安装及使用七、IDEA的maven项目的netty包的导入(其他jar同)八、JAVA IO/NIO九、网络IO原理-创建ServerSocket的过程十、网络IO原理-彻底弄懂IO十一、JAVA中ServerSocket调用Linux系统内核十二、IO进化过程原创 2020-09-23 10:26:30 · 1232 阅读 · 1 评论 -
十三、Java-IO进化过程之NIO
概述前面几篇文章我们对Java的IO体系做了一个大致的介绍,从本文开始我们将对NIO、SELECTOR、EPOLL、Netty等携带例子做更深入的讲解。如需持续了解请关注后随时查看。解读:非阻塞IO模型:当用户线程发起一个read操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次受到的用户线程的骑牛,那么它马上就将数据拷贝到了用户线程,然后返回。所以事实上,在非阻塞IO模型中,用户原创 2020-09-21 11:54:46 · 288 阅读 · 0 评论 -
十二、IO进化过程之BIO
概述前面几篇文章我们对Java的IO体系做了一个大致的介绍,从本文开始我们将对BIO、NIO、SELECTOR、EPOLL、Netty等携带例子做更深入的讲解。如需持续了解请关注后随时查看。解读阻塞IO模型:最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才接触block状态。典型的阻塞IO原创 2020-09-21 11:23:32 · 457 阅读 · 0 评论 -
十一、JAVA中ServerSocket调用Linux系统内核
前面几篇文章我们对我们分别对JavaIOtixi 及在学习IO过程中需要用到的基础知识做了一些讲解,有兴趣的可以看往期的几篇文章。全图(下面有分解图)图解:释义:1.Linux中可以使用strace命令抓取程序运行时对系统的调用,不只抓取JAVA,任何Linux中程序都可以抓取。strace -ff -o ./ooxx java TestSocket.java2.使用以上命令会当前目录生成一堆线程所需文件,ooxx.***文件后缀为线程ID号3.使用grep命令,查看当面目录哪个文件中原创 2020-09-21 10:39:52 · 527 阅读 · 0 评论 -
十、网络IO原理-彻底弄懂IO
全图(下面有分解图):图解:释义:1.IO的发展历程:操作系统内核-BIO-NIO-SELECTER-EPOLL。2.计算机开机启动,首先进入内存的第一个程序为操作系统的内核。系统内核负责对计算机进行统一管理和分配,同时生成一个GDT(全局描述符表),GDT记录内存空间划分,划分为用户空间、内核空间等。3.用户空间与内核空间的划分是用于保护计算机,用户空间无法修改内核空间数据。4.普通应用需要调用磁盘数据时是存在IO成本的,他必须去调用内核帮他做磁盘及其他硬件的操作。5.如果普通应用想调原创 2020-09-18 17:12:49 · 1273 阅读 · 0 评论 -
九、网络IO原理-创建ServerSocket的过程
示例:创建ServerSocker过程://创建ServerSocket并注册端口号8090 ServerSocket server = new ServerSocket(8090); while (true) {//循环 final Socket socket = server.accept();//获取数据System.out.println("ClientSocket:" + client.getPort()); new Thread(new Runnable() {//如果原创 2020-09-18 17:11:15 · 447 阅读 · 0 评论 -
八、JAVA IO/NIO
JAVA IO/NIOBIO、NIO、AIO 有什么区别?Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.原创 2020-09-18 17:07:48 · 331 阅读 · 0 评论 -
六、windows环境下netcat的安装及使用
windows环境下netcat的安装及使用s小菜鸟 2019-01-03 21:05:51 5080 收藏 141.下载netcat。下载地址:https://eternallybored.org/misc/netcat/2.解压文件3.把nc.exe 复制到C:\Windows\System32的文件夹下4 、 进去黑窗口使用nc开启两个黑窗口第一个执行nc -l -p 9999第二个执行nc localhost 9999执行结果转载地址:https://blog转载 2020-09-18 16:50:44 · 2080 阅读 · 0 评论 -
五、Centos-Linux安装nc
1)netcat(nc)是一个简单而有用的工具,被誉为网络安全界的“瑞士军刀”,不仅可以通过使用TCP或UDP协议的网络连接读写数据,同时还是一个功能强大的网络调试和探测工具,能够建立你需要的几乎所有类型的网络连接。 2)在Linux终端窗口可以直接使用yum工具进行安装:[root@master01 spark]# yum install nc.x86_643)安装完毕后,在终端模式下运行nc -help查看命令是否正常安装[hadoop@master01 spark]$ nc -helpu转载 2020-09-18 16:48:45 · 1192 阅读 · 0 评论 -
四、Selector选择器
接着上一章的那个比喻,如果我们把Buffer缓冲区看做码头,Channel通道看做航道的话,那么Selector选择器可以看做海上的一个调度中心,一个调度中心可以监听多个航道的事件,当然,这需要航道归属在这个调度中心的编制下。创建一个SelectorSelector selector = Selector.open();将Channel注册在某个Selector的管辖范围之下Selector是一个对象,它可以被注册到很多个Channel上,监听各个Channel上发生的事件,并且能够根据事件情况决转载 2020-09-18 16:47:09 · 619 阅读 · 0 评论 -
三、Channel 通道
Channel 通道顾名思义,channel在NIO中扮演着通道的角色,负责传输缓冲区Buffer中的数据块。打个比方,如果说Buffer是码头的话,码头中的一个个集装箱,就是存放在Buffer中的数据块,channel就是航道,运输这些集装箱,就需要走我们的航道,将集装箱送到目的地的码头,具体去哪个码头取集装箱,是由航道决定的,这条航道通往哪里,你就去哪个码头。所以,我们获取集装箱(数据块)是去找码头(Buffer),找码头(Buffer)之前,我先需要通过航道(Channel)把数据块读入运入(读原创 2020-09-18 16:41:43 · 239909 阅读 · 0 评论 -
二、java.nio.ByteBuffer用法小结
java.nio.ByteBuffer用法小结简介在Java的Socket编程中,若使用阻塞式(BIO),则往往通过ServerSocket的accept()方法获取到客户端Socket之后,再使用客户端Socket的InputStream和OutputStream进行读写。Socket.getInputstream.read(byte[] b)和Socket.getOutputStream.write(byte[] b)的方法中的参数都是字节数组。这种阻塞式的Socket编程显然已经远远不能满足目前的转载 2020-09-18 16:38:53 · 1070 阅读 · 0 评论