Java
文章平均质量分 51
石硕页
不滞于物,草木竹石均可为剑
展开
-
设计模式在项目中的应用(持续更新)
目前设计模式的介绍已经很多,自己也有一定的了解,但是在代码落地中不够,与业务的结合还比较欠缺。那通过这篇文章记录下:在思考特定的设计模式的时候,如何恰如其分的与我们的业务结合起来,并进行落地。我觉得要思考到这一点,或这个层面的话,也是需要对业务有很深的理解,然后对具体的某个设计模式有深刻的认识,才能将他们结合起来。...原创 2022-01-19 13:45:05 · 3489 阅读 · 0 评论 -
@Transactional 注解详解
spring 的注解 @Transaction 注解很神奇主要在一个方法上面声明的这个注解,那个这个方法在执行时,涉及到数据库的执行就是要么全部成功,要么全部失败1.注解的原理2.@Transaction 的原理3.方法嵌套注解如何使用4.@Transaction 注解的坑5.总结...原创 2021-12-03 12:02:23 · 1425 阅读 · 0 评论 -
maven打jar包 本地包pom引入的2种方式
项目中有些jar包是第三方的,maven官方仓库没有,需要使用mvn install命令打包到本地,然后将其写入到pom.xml的依赖中,maven仓库有的jar包则从maven官网找到对应版本的depdency写入pom文件里面,这样maven打包就可以包含第三方jar包了,否则maven只会打包pom文件里面的,不会包括第三方jar包,程序运行将报错。这里推荐2种打包第三方jar包的方式:第一种:打包第三方jar包到本地仓库,然后在pom.xml中引入例如:将alipay-sdk-abc转载 2021-09-18 11:20:41 · 5591 阅读 · 0 评论 -
补码原理---负数为什么要用补码表示
这是我见过的最为精辟的解释了。阴阳轮回,此消彼长,是谓之道!补码原理——负数为什么要用补码表示转载 2021-07-16 15:42:41 · 207 阅读 · 0 评论 -
Java 开发规范【持续更新】
1.对象在调用方法前一定要判断非空,防止空指针异常;2.编写controller类的方法,一定要加注释和日志;原创 2021-06-02 11:21:31 · 77 阅读 · 0 评论 -
Java 多线程/线程池的使用
参考:Java线程池,阿里为什么不允许使用Executors?为什么阿里发布的Java开发手册强制不允许线程池的创建使用Executors?为什么阿里巴巴要禁用Executors创建线程池?原创 2021-05-27 11:25:24 · 177 阅读 · 0 评论 -
雪花算法的原理
目录SnowFlake 算法SnowFlake 算法的实现代码如下:SnowFlake 算法的优点:SnowFlake 算法的缺点:SnowFlake 算法是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工原创 2021-04-09 16:44:02 · 280 阅读 · 0 评论 -
为什么springboot的jar 可以直接运行?
可以从springboot打包后的项目结构入手,观察jar包的结构原创 2021-03-25 11:34:47 · 226 阅读 · 0 评论 -
Java 小tips
接口中的方法是不需要 public / private / protected 修饰了类中的方法是需要 public / private / protected 修饰的这是为什么?因为接口的方法是不会被直接调用的,要调用,一定要有实现类,通过实现类中方法前面的修饰权限来判断...原创 2021-03-10 11:30:38 · 101 阅读 · 0 评论 -
如果一个服务有定时器任务,能否部署集群
现在遇到一个问题:之前微服务架构,每个服务没有部署集群,都只有一个实例,现在改为集群模式后,很多服务有多个实例,但是如果这个服务有定时器,能否部署集群,会有什么影响?如果部署了集群,一个有定时器的服务部署了多个实例,在定时任务将要执行的时候,有几个实例就会执行几次定时器。直接部署肯定是不行的?那解决的办法主要是有:1.将定时器任务从这个服务剥离出来,之前的业务继续部署集群,不受影响,再单独起一个服务,专门进行业务的定时器执行。但这样一来,这个定时器服务就没法部署集群了,否则还是遇到.原创 2021-02-24 14:33:54 · 611 阅读 · 0 评论 -
深入分析线程池的实现原理
一.概述线程池,顾名思义就是存放线程的池子,池子里存放了很多可以复用的线程。如果不用类似线程池的容器,每当我们需要执行用户任务的时候都去创建新的线程,任务执行完之后线程就被回收了,这样频繁地创建和销毁线程会浪费大量的系统资源。因此,线程池通过线程复用机制,并对线程进行统一管理,具有以下优点:降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗; 提高响应速度。当有任务到达时,无需等待新线程的创建便能立即执行; 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消转载 2021-02-22 16:45:12 · 218 阅读 · 0 评论 -
堆外内存的回收机制分析
目录堆外内存堆外内存的申请和释放堆外内存的回收机制堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代码中还可以使用堆外内存,比如Netty,广泛使用了堆外内存,但是这部分的内存并不归JVM管理,GC算法并不会对它们进行回收,所以在使用堆外内存时,要格外小心,防止内存一直得不到释放,造成线上故障。堆外内存的申请和释放JDK的ByteBuffer类提供了一个接口allocateDirect(int capacity)进行堆外内存的申请,底层通过unsafe.allocate转载 2021-02-20 16:50:40 · 188 阅读 · 0 评论 -
看完这篇垃圾回收,和面试官扯皮没问题了
目录前言JVM 内存区域如何识别垃圾引用计数法可达性算法垃圾回收主要方法标记清除算法复制算法标记整理法分代收集算法垃圾收集器种类新生代收集器老年代收集器总结前言Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员专注于程序本身,不用关心内存回收这些恼人的问题,这也是 Java 能大行其道的重要原因之一,GC 真正让程序员的生产力得到了释放转载 2021-02-20 16:27:45 · 217 阅读 · 0 评论 -
JVM作为实现层,它里面的很多数据结构都有“两面性”
引自第3篇文章的一段:java 虚拟机的实现,本身就是其他语言的一种实现,可以是C/C++ ,也可以是java ,也可以是javascript;是其他语言实现的一种应用程序。从Java 语言实现的角度上看,分配在stack中的数据,而在虚拟机实现的角度上看,则可以分配在heap中题主所说的来自JVM规范描述JVM Stacks的一段:Because the Java Virtual Machine stack is never manipulated directly except原创 2021-02-19 19:30:15 · 184 阅读 · 0 评论 -
Cognitive Complexity of methods should not be too high
Cognitive Complexity of methods should not be too highsquid:S3776Cognitive Complexity is a measure of how hard the control flow of a method is to understand. Methods with high Cognitive Complexity will be difficult to maintain>>>>>>&g原创 2021-01-29 14:37:45 · 15312 阅读 · 0 评论 -
CPU100%,内存100%,tcp连接数突增,线程连接数突增如何处理
1.CPU 100% 如何处理?2.内存 100% 如何处理?3.tcp 建立连接数 突增如何处理?4.线程连接数 很多如何处理?原创 2020-10-28 14:18:22 · 1045 阅读 · 0 评论 -
JDK8 函数式编程
目录1.概述1.1函数式编程简介1.2Lambda 表达式简介2.Lambda 表达式2.1Lambda表达式的形式2.2闭包2.3函数接口3.集合处理3.1Stream简介3.2Stream常用操作3.2.1collect(toList())3.2.2map3.2.3filter3.2.4flatMap3.2.5min和max3.2.6reduce3.3数据并行化操作3.4其他3.4.1收集器3.4.2元素顺序3.4...转载 2020-10-23 16:51:28 · 689 阅读 · 0 评论 -
java byte 运算时会被转为int
b5 ,b6 被声明成final ,就是常量,所以被赋值给b4的时候,就是10b1 ,b2 都是byte 在进行+运算的时候,会被提升为int 整形,然后再赋值给byte 的时候就是类型不匹配了。可以自己强转byte。这里强转可能会有精度损失总结:被final修饰的变量就是常量,在赋值的时候,就已初始化好了。...原创 2020-10-23 14:52:05 · 919 阅读 · 0 评论 -
【墙裂推荐】JVM史上最最最完整深入解析(12000字噢)【面试神器】
目录Java运行时数据区:JMM Java内存模型:堆的内存划分:GC垃圾回收:HotSpot 虚拟机详解:JVM优化:类加载机制:工作之余,总结一下JVM相关知识。Java运行时数据区:Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图:1转载 2020-10-21 17:24:22 · 162 阅读 · 0 评论 -
迄今为止最好理解的ZooKeeper入门文章
目录边界的产生与突破计算机相关的边界产生与突破ZooKeeper的数据模型ZooKeeper应该具备的能力边界的产生与突破不觉间孩子已经上小学了,前段时间还参加了一次家长会,那就以学校和开会来说吧,这大家都很熟悉。如果一个班要想开班会,那随时开都行,不需要提前安排与通知,因为一个班级从内部看就是一个整体,在班级内,同学之间以及与老师之间都可以随意交流,没有任何隔阂与阻碍。一个班级从外部看就是一个独立的个体,因为班级与班级之间是完全独立的,因此一个班级的学生和老师都不会随便跑到转载 2020-10-15 16:10:20 · 199 阅读 · 0 评论 -
线程安全的AtomicLong使用
看一个计数的类:public class Counter { private static long counter = 0; public static long addOne(){ return ++counter; }}初看感觉没啥问题,但这个类在多线程的环境下就会有问题了。假如开多个线程都来使用这个计数类,它会表现的“不稳定”。public static void main(String[] args) { for(int i=0;i<100;i++){转载 2020-10-14 14:25:10 · 1226 阅读 · 0 评论 -
RPC 与 RMI
RPC:remote procedure call 远程过程调用rpc 与操作系统和开发语言无关,就是通过网络的方式实现不同服务间的调用。RMI:remote method invocation 远程方法调用rmi 只能在jvm 里面使用,在客户端和服务端实际有相同的类和方法,达到的效果是客户端引用服务端的类和方法,实际上还是客户端调用客户端的类和方法,通过stub和skeleton机制,网络实现的调用。可以理解为rmi 就是rpc 在java 中一种实现方式。...原创 2020-10-14 11:28:40 · 322 阅读 · 0 评论 -
涂鸦智能Java saas 方向面试总结
国庆前一天收到了涂鸦的面试,主要的问题总结如下:重点是关于数据库mysql:1.数据库的binlog日志?2.数据库的redo log日志?3.数据库的索引?关于多线程:1.多线程的实现方式有哪些?2.具体讲一下ExecutorService 原理?GC算法相关:1.主要的GC算法有哪些?各有什么优势?...原创 2020-10-09 10:01:54 · 1542 阅读 · 0 评论 -
Java 正则表达式
目录1.字母:匹配单个字符2.一组字符:任意匹配里面的一个单个字符3.边界匹配:在以后编写JavaScript的时候使用正则中用到4.简写表达式:每一位出现的简写标记也只表示一位5.数量表示:之前所有的正则都只是表示一位,如果要表示多位,则就需要数量表示6.逻辑表示:与、或、非1.字母:匹配单个字符(1)A:表示匹配字母A(2)\\:匹配转义字符“\”(3)...转载 2019-11-19 14:42:33 · 129 阅读 · 0 评论 -
理解http的幂等性
目录理解http的幂等性幂等性的定义分布式事务 VS 幂等设计http的幂等性总结理解http的幂等性 基于HTTP 协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么Web API如此流行呢?我认为很大程度上应归功于简单有效的HTTP协议...转载 2019-10-14 10:33:06 · 235 阅读 · 0 评论 -
Java 中如何避免循环引用,解决相互依赖的问题
spring中通过依赖注入的方法来解决类的相互依赖问题!!!spring中通过依赖注入的方法来解决类的相互依赖问题!!!spring中通过依赖注入的方法来解决类的相互依赖问题!!!只要不是构造函数注入就不会产生循环引用的问题。这是因为:spring 容器对构造函数配置Bean 进行实例化的时候,有一个前提,即 Bean 构造函数入参引用的对象必须已经准备就绪。由于这个机...原创 2019-10-12 17:28:03 · 6724 阅读 · 0 评论 -
什么时候用静态方法?什么时候用单例模式?(推荐)
目录一、静态方法常驻内存,非静态方法只有使用的时候才分配内存?二、静态方法和非静态方法的区别?三、为什么要有非静态方法?从这三点我们得出的结论如下:一、 什么时候用静态方法,什么时候使用非静态方法?二、 为什么使用单例模式而不用静态方法?三、 其他我们在编程中最常用的模式就是单例模式了,然而单例模式都用在什么场合?为什么不用静态方法而要用单例模式呢?要搞清这些问...转载 2019-10-12 16:35:11 · 4507 阅读 · 3 评论 -
RestTemplate详解
RestTemplate与httpClient类似,都是java中可以模拟http请求的封装。httpClient的使用,已经在另一篇文章中有所论述,但是RestTemplate比httpClient更优雅,它是spring中的一个封装功能。原创 2018-06-20 19:12:07 · 5476 阅读 · 0 评论 -
java连接数据库的操作(3):spring data jpa
上一篇文章中写到的jpa连接数据库的方式,完全是java项目的实现。而jpa是一个标准,有很多基于jpa的实现,对jpa进行了更好的封装,比如hibernate,spring data jpa。后者也是我们这篇文章的主要内容。spring对jpa的支持使用spring支持jpa与上一篇直接java项目中使用jpa的在于:1.增加spring配置文件applicationContext.xml<...原创 2018-04-10 16:28:57 · 465 阅读 · 0 评论 -
java连接数据库的操作(2):jpa
什么是jpajpa(Java Persistence API) ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。旨在规范、简化Java对象的持久化工作。JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术。JPA的主要API都定义在javax.persistence包中。jpa的主要特征1. ORM映射元数据,JPA支持XML和JDK 5.0注解...原创 2018-04-10 15:03:42 · 468 阅读 · 0 评论 -
java连接数据库的操作(1):jdbc
什么是jdbc?jdbc (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库(比如mysql,oracle等)。jdbc规范采用接口和实现分离的设计思想。接口包含在java.sql及javax.sql包中,其中java.sql属于JavaSE,javax....原创 2018-04-09 20:51:37 · 180 阅读 · 0 评论 -
java7新特性总结
在2011年7月28日,Oracle正式发布了Java 7。总结的这些新特性,都是自己觉得在开发中实际用得上的。1 switch中使用String java7以前在switch中只能使用number或enum。 现在可以使用string了。示例: String s = "a"; switch (s) { case "a": System.out.pr...原创 2018-03-27 20:31:56 · 7020 阅读 · 1 评论 -
JAVA Future类详解
在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback接口,并用Future可以来接收多线程的执行结果。原创 2018-06-06 17:24:24 · 210082 阅读 · 52 评论 -
定时器不执行问题
今天在替换代码的时候,对定时器进行了修改,怎么都不执行.@Componentpublic class Scheduler { @Scheduled(cron="0 30 2 * * ?") public void handleDayBill() { dosomething(); } }代码中@Component注解也加上了,在...原创 2018-05-29 02:38:54 · 4875 阅读 · 0 评论 -
post、get请求容量
get请求 因为get请求的请求参数是拼接在请求url后面,所以判断get请求的参数大小,就是看请求url的容量。在http协议中,不管对get请求还是post请求,都没有对请求的url长度进行限制。但是,因为浏览器的不同,和服务器的差异,会有所限制。比如对于IE浏览器,限制url的长度是2083字符,谷歌浏览器限制请求的url长度是8182个字符。对服务器而言,在请求的url长度超...原创 2018-05-27 15:51:29 · 3765 阅读 · 0 评论 -
异步回调与同步回调
同步回调 我们常用的一些请求都是同步回调的,同步回调是阻塞的,单个的线程需要等待结果的返回才能继续执行。异步回调 有的时候,我们不希望程序在某个执行方法上一直阻塞,需要先执行后续的方法,那就是这里的异步回调。我们在调用一个方法时,如果执行时间比较长,我们可以传入一个回调的方法,当方法执行完时,让被调用者执行给定的回调方法。异步回调java实现democlient接口pu...原创 2018-05-22 19:13:35 · 19471 阅读 · 4 评论 -
httpClient发送https请求
前言 我们知道现在的http请求应用的越来越广泛,最常见的场景就是浏览器作为http请求的客户端,请求http服务端。在浏览器发送请求时,会封装请求行,请求头,请求体信息,那我们在用java代码模拟时,也需要带上http请求的这些相关信息。java自带的java.net包是关于java的网络方面的包,但是没有完全的封装好的方法,而org.apache.httpcomponents下的...原创 2018-05-22 16:11:27 · 13277 阅读 · 0 评论 -
cloud not read json :no suitable constructor found for type[simple type,class ]
在使用redis,将查询出的对象反序列为java bean 时,提示如下错误redis中的对象是:[ "com.damai.test_redis.pojo.User", { "id": 8, "name": "xl", "age": "25", "addr": "beijing" }]user对象的代码是原创 2018-05-09 10:26:34 · 1414 阅读 · 1 评论 -
http响应报文详解
http响应报文的组成http响应报文由响应行,响应头,响应体三部分组成。响应行主要包括 响应协议,这个与请求协议对应,比如http, 状态码200 状态码的描述OK响应头就是一些常见的响应名对应的响应值响应参数就是我们真正需要的从数据库中取出的数据常见的响应头属性下面是摘自www.baidu.com和一个示例网站的请求头(1) Accept-Ranges...原创 2018-04-12 21:24:56 · 17286 阅读 · 0 评论 -
http请求报文详解
http请求报文的组成http请求报文由请求行,请求头,请求体三部分组成。请求行主要包括: 请求的方法,最常用的主要是GET,POST,OPTIONS表示查询web服务器的性能。 请求的url,比如/person/getById, HTTP协议:http1.1请求头就是我们常说的头部信息,比如Content-Type,Host,Origin等请求体就是请求...原创 2018-04-12 20:56:25 · 2119 阅读 · 0 评论