java
文章平均质量分 52
java成神之路的点点滴滴
穿条秋裤到处跑
Wu,Rosen Wanlong
展开
-
记netty本地客户端断线无法自动重连 or 远程客户端自动重连本地服务端
注解去自动注入依赖,handler所需要的依赖,通过此注解自动注入到了netty客户端或者是服务端的bean中,首次启动或重连时,可以注入成功。但第二次就不可重用了。socket长连接能够低延迟的监控到服务端和客户端状态,服务端、客户端在服务重启或网络异常时会断开连接,状态恢复后,由客户端主动发起重连(貌似也可以服务端主动重连客户端,方案上感觉是可行的,但感觉没啥意义)。前段时间发现本地的客户端,在服务端重启后不会自动重连,经debug后,发现起始重连的监听生效的,但是重连的connet方法没有执行成功。原创 2024-06-29 18:57:11 · 396 阅读 · 0 评论 -
记一次rocketMq根据配置文件读取listener consumerGroup异常
的缩进,看着都没啥问题,甚至在安装了idea插件后可以直接通过代码中的变量跳转到配置文件的位置,证明拼写没问题。最后,发现当application的其中一级使用纯数字时,就会有这个注入异常的问题。但我又确确实实有其它代码使用了这种方式来注入变量,且服务启动和使用正常。发现了问题的根源,就好处理了,把变量改成非纯数值的key就行了。突然想到以前发现swagger的啥缺陷来着,也是折磨死人。的配置后,发现服务启动异常,报错的信息大概是。的方式读取配置文件,见鬼了。,检查了变量的拼写,,就会出现这个问题。原创 2024-06-27 20:57:02 · 305 阅读 · 1 评论 -
javax.validation.constraints @Min不生效
我看有些文章说需要引入hibernate-validator,其实是对的,但细心的你会发现,spring-boot-starter-validation已经引入了hibernate-validator的依赖,所以不需要二次引入了。最后需要检测是否使用了@Validated注解,并且该注解需标注在Controller类上,而不是方法或者PathVariable参数上,我测试了只有标注在类上才会生效。首先确认是否引入了spring-boot-starter-validation依赖。原创 2024-05-18 22:54:19 · 423 阅读 · 0 评论 -
关于Java GC,你就只知道一个引用计数法吗?
垃圾回收(Garbage Collection,简称GC)是内存管理的核心组成部分,它负责自动回收不再使用的内存空间。原创 2024-02-24 00:43:28 · 773 阅读 · 1 评论 -
你真的搞懂为何Java String类是不可变的吗?
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。原创 2024-02-21 21:07:51 · 809 阅读 · 0 评论 -
安装JDK: 错误1316.指定的账户已存在
我选择安装了以前比较喜欢使用的Advanced System Care,利用它的卸载组件来卸载掉老的破损的JDK,果然,这种方式是有效的。在执行了某个神秘脚本后,我电脑的很多软件就不可用了,怀疑是注册表被动到了,包括java开发必备的JDK,也无法使用。考虑到这不是一个0到1的项目,想了想还是放弃了,回退了我的IDE版本,挺好。关于JDK重装报这个错误,我也上网查了一下,提供的方法都试了一遍,但每一个奏效的,换句话讲,每一个适合我这种情况的。而这,是我在其他网站上找到的JDK1.8更早的版本。原创 2024-01-18 23:18:30 · 2424 阅读 · 0 评论 -
记一次文件因content-type问题无法打开的经历
简单总结一下,在你我的开发生涯中,总会遇到一个又一个麻烦的问题(对当时的你会是个麻烦),可能你花了一些时间能够处理,并在过程中有所收获,也有可能你直接百度或csdn一搜就有了结果。领导可能在意的是处理了问题的结果,而对你个人成长,更重要的是处理问题的过程。在刚出来工作的第一家公司,我们的一个服务总是会内存溢出,可用性极差。真正处理要处理这个问题可能需要花很多时间去排查测试(因为已经排查过业务代码的逻辑),领导建议做服务自动重启的工作,这样在一定程度能够缓解。对要求不算高的甲方,可能就糊弄过去了。原创 2023-08-16 11:02:18 · 911 阅读 · 0 评论 -
针对流只能消费一次的处理方案
遇到这个问题,第一反应是尝试深拷贝,使用hutool的深拷贝工具,返回的结果实际为null,应该是这个类没有实现Serializable的原因。具体思路为,将InputStream转换为byte数组,再根据byte数据反向生成相同的多个相同的流(对象肯定是不一样的)。Stream流只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。最近在处理文件mimeType有关问题时,因为流只能消费一次的问题,引发了一些bug。在网上搜索了一下,以下方案是可行的,并且亲测可用。原创 2023-08-09 15:51:22 · 252 阅读 · 0 评论 -
java面试题 Arraylist 与 LinkedList比较
是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。);插入和删除是否受元素位置的影响:① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这.原创 2022-01-14 14:16:41 · 168 阅读 · 0 评论 -
入参对象有LocalDateTime类型的参数,swagger该如何传参
swagger提供的默认参数格式大概是下面这个样子2021-11-24T08:41:36.357Z直接传入这个格式的字符串,服务端会报错Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String "2021-11-24T08:41:36.357Z": Failed to deser原创 2021-11-24 16:48:05 · 3425 阅读 · 0 评论 -
java 泛型(generics)使用总结
java泛型,总是朦朦胧胧的,会用,但又总是口数不清起用途,下文结合文章以及部分源码简述自己的理解。简单理解泛型,就是参数化参数。大部分时候我们的方法都是指定了入参类型的,有时候为了这个接口更加通用,可能就涉及到泛型的使用,将这些个参数抽象化,不限定其为具体的某一种类型。另外,通过参数的泛型华,往往在其实现部分,需要结合反射实现更加通用的逻辑。下面看一下泛型比较学术的作用描述第一点,我理解应该是指发兼容性,比如我用一个list,不指定它的类型,这样我是可以添加任何类型的数据进入到容器中的,在从容器中原创 2021-09-26 15:22:26 · 308 阅读 · 0 评论 -
异常:The supplied data appears to be in the Office 2007+ XML
我遇到这个异常时,是在处理excel时,根据字节数组流创建HSSFWorkbook对象时报的错,这个是excel兼容性的问题。处理xls结尾的文件时,用HSSFWorkbook及其相关类型;而处理xlsx结尾的文件时,需要用XSSFWorkbook及其相关类。两种类型其实方法都差不多,但在使用的时候,还是需要注意的。...原创 2021-05-27 19:52:41 · 1340 阅读 · 2 评论 -
关于java通过反射 获取/修改 对象属性值的一些注意事项
getFields()与 getDeclaredFields()前者能够获取所有public字段,包括父类字段;后者可以所有public/protected/private类型的字段,但是不包括父类的字段。使用时根据自己的需求选择即可。如何获取子类和父类的所有字段首先,model对象的所有属性值,即字段,通常都是定义为private,所以,只能通过getDeclaredFields()方法去获取;然后,递归循环每个子类的父类吧,getSuperclass()方法可以做到。反射获取或者..原创 2021-05-22 10:48:04 · 1288 阅读 · 0 评论 -
JAVA提取字符串信息中的数字(包括整数,小数)工具类
提供了两个静态方法,getNumber可以返回数字类型的字符串数组,getIndexNumber可以查询某个位置的字符类型的字符串,支持提供默认值,个人认为这个非常重要,以防一些数据问题带来的异常。如果需要其它方法,可以在getNumber的基础上扩展。public class NumberHelper { private static final Pattern INT_REGEX; private static final Pattern FLOAT_REGEX; st.原创 2021-05-11 16:30:58 · 2215 阅读 · 0 评论 -
前端获取的Long类型数据失真,后端这样处理就行了
数据库表id一边定义为Long类型,对应数据库类型为bigint。我这边的情况是,数据库的id虽然是自增,但一开始因为一些原因,起始值特别特别大,java后端处理过程中没有什么问题,也不会出现失真。但是,前端获取的对应字段,最后两位变成00,失真了两位。我自己通过swagger里面测试查看到的返回值也是如此。但是,在postman里面测试的返回值确实正确的,postman厉害了。对此,想到的肯定是把long类型转换成字符串输出。因为项目用到了DDD领域驱动设计,所以只改输出对象就可以,接受时的DTO和原创 2021-04-22 13:03:49 · 2350 阅读 · 0 评论 -
centos通过yum的方式快速安装jdk1.8
这里几率使用yum的方式安装jdk,需要保证连接外网环境,非常方便,一键配置yum search java|grep jdk 搜索 jdkyum install java-1.8.0-openjdk.x86_64 安装,根据自己的需要选择对应的版本,中途需要提示是否OK,输入y会车即可。java -version 查看版本在/usr/lib/jvm/目录下可查看jdk相关的文件信息...原创 2021-03-15 16:42:22 · 453 阅读 · 0 评论 -
java类注解是否可以通过实现接口或继承父类的方式获得
接口类@Servicepublic interface UserService { public void get();}实现类public class UserServiceImpl implements UserService { @Override public void get() { }}子类public class UserServiceChild extends UserServiceImpl{}测试类@SpringB.原创 2021-02-01 14:40:42 · 1777 阅读 · 0 评论 -
json爬虫获取列表数据不全,已解决
原链接的数据比较多,但是通过jsoup获取的数据差不多只有2000多条。 Document document = Jsoup.connect(url) .timeout(4000) .ignoreContentType(true) .userAgent("Mozilla\" to \"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0)") .method(Connection.Method.PO原创 2020-12-10 22:27:52 · 1053 阅读 · 0 评论 -
java向上向下取整与四舍五入
以float f = 1.65f为例向上取整Math.ceil(f) //2.0向下取整Math.floor(f) //1.0四舍五入Math.rint(f) //2.0当float f = 2.5f时,下面四舍五入的结果与我们希望的有些差异。Math.rint(f) //2.0Math.rint遇到.5时会取偶数结果,以上三个方法的返回值均为double类型。使用Math.round进行四舍五入的结果返回值为int,2.5f的返回值为3。...原创 2020-11-23 15:33:26 · 533 阅读 · 0 评论 -
根据key或value将map容器进行排序
java中的HashMap是无序的,有序容器可用LinkedHashMap在cmopare接口中,Integer或者Date通过compareTo方法进行对象比较时,“比较对象” 比 “被比较对象” 大时返回-1,相等时返回0,小则返回1。/** * 将容器按照日期、数字等类型的键,排序 * @return * @param map * @param orderRule 0为升序,1为降序 * @param keyType 0为数字类型 1为日期类型原创 2020-09-29 14:57:17 · 240 阅读 · 1 评论 -
java计算两个字符串格式的时间间隔多少天多少小时多少分钟
传入起止时间,及SimpleDateFormat 的格式。计算一下我晚上睡了多久: @Test public void test04() throws Exception { long min = dateDiff("2020-07-13 23:58:56","2020-07-14 7:29:15","yyyy-MM-dd HH:mm:ss"); } public static long dateDiff(String startTime, String e原创 2020-07-13 14:16:41 · 2095 阅读 · 0 评论 -
使用commons-fileupload包实现文件上传
首先,需要在pom文件中添加相关依赖 <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version&...原创 2020-02-21 15:25:52 · 1519 阅读 · 0 评论 -
synchronized 关键字的底层原理
synchronized关键字实现了多个线程之间访问资源的同步性,保证了被它修饰的方法或代码块在任意时刻最多只有一个线程执行。synchronized关键字是通过JVM底层实现的。按使用位置分,同步语句块和同步方法实现线程安全的方式不同synchronized关键字同步语句块public class SynchronizedDemo { public void method() ...原创 2020-01-15 17:00:04 · 325 阅读 · 0 评论 -
ConcurrentHashMap与HashTable的区别
ConcurrentHashMap与HashTable都是线程同步的容器,主要区别体现在二者实现线程安全的方式上。底层数据结构:JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现;JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是...原创 2020-01-14 16:44:35 · 164 阅读 · 0 评论 -
java关键字transient和volatile的基本含义和使用方法
transienttransient关键字为类型修饰符,英文本意为“短暂的”,在对象序列化过程中,标记了transient的变量不会被序列化。HashMap中的size属性就标注了transient关键字。 transient int size; /** * The number of times this HashMap has been structur...原创 2019-11-25 15:33:56 · 718 阅读 · 0 评论 -
resultSet.next() 位置处报错:java.lang.OutOfMemoryError: Java heap space
在一个供应商数据同步接口运行过程中,突然发现会抛出:java.lang.OutOfMemoryError: Java heap space,内存溢出,按日志指示,找到了报错位置,当执行while (resultSet.next()) 时,就直接报错,程序中断了。......// 获取结果集prepareStatement = connection.prepareStatement(sel...原创 2019-11-19 09:34:59 · 848 阅读 · 0 评论 -
java通过+拼接字符串导致的无效SQL,三目运算符与+运算符结合使用时需要注意了
调试代码的过程中遇到一个比较尴尬的问题,java代码中先进行sql拼接,然后再执行拼接后的sql,即一个又臭又长的字符串。设计到sql拼接的情况,我个人比较喜欢用StringBuilder拼接,毕竟使用 + 连接多个String子串的效率是较低的。不过我也是二手代码,懒得重写了,就直接在源代码基础上修改了。之前代码的问题其实是出现在,通过JDBC从第三方数据库获取的字段为空,通过Result...原创 2019-11-06 16:34:05 · 839 阅读 · 0 评论 -
Oracle ORA-06861: 文字与格式字符串不匹配 记录两次无助的遭遇:存储过程直接执行正常,java调用存储过程则报错
一天之内,出现了两次这样的尴尬遭遇:将参数直接放到存储过程中执行时,程序运行正常,但是通过java程序去调用数据库存储过程时,就抛出异常。我和我的同事分别遇到了一次,但是,原因却大不相同。先说说我的:)通过前端点击按钮执行程序后,所报的错误居然不在存储过程内部,而是同一个包下,另一个验证程序所报验证失败错误。我反复检测了自己的java代码以及存储过程内部的代码,确定以及肯定自己没有去调用那...原创 2019-11-03 19:04:23 · 824 阅读 · 0 评论 -
LeetCode-50:关于浮点型数字求高次幂的高效运算
题目描述比较简单,就是求-100.0到100.0的n次幂,你为32位有符号整数。比如求2.00000的10次幂,则需要返回的值为1024.00000;诶,1024刚过:(首先比较无脑的就是一次次的去累积乘,乘n次,思维很清晰,想法很危险。32位有符号整数,[-231,231-1],即[-2147483648,2147483647]这个范围,我没有试过这种方法,但是看评论有人说这个会报超时...原创 2019-10-25 11:41:31 · 428 阅读 · 0 评论 -
LeetCode-29:不使用乘法、除法和 mod 运算符如何求解两数之商,真实面试中遇到过
这个题目在今年初,我的一个同事去面试的时候遇到过,回来一直给我吐槽,我又不是面试的算法工程师,问的些啥问题呀?哈哈~我相信很多人,如果没有经常学习的话,多半也会一脸懵逼,我也是其中一个:)。虽然这些问题在实际工作用能用上的机会很少,但是对于我们拓展思维,以及了解语言底层的一些逻辑运算,还是非常有帮助的。题目描述:给定两个整数,被除数 dividend 和除数 divisor。将两数相除...原创 2019-10-24 13:58:42 · 683 阅读 · 1 评论 -
LeetCode:递归思想的延伸,从斐波那契数列到爬楼梯模型
题目描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?看到这个问题的第一反应其实我想到的是排列组合的思想去解答。比如有n阶,那么步数最多的爬法肯定是一步一步爬,而步数最少的爬法则需要(n/2+n%2)步。从n到(n/2+n%2)减少的过程,也就意味着一次走2个台阶的步数增多,然后就是一个排列组合的算法。比如10个台阶走...原创 2019-10-23 14:21:49 · 274 阅读 · 0 评论 -
LeetCode:通过递归方法打印杨辉三角形
代码如下:package com.leetcode.recurse;import java.util.ArrayList;import java.util.List;public class YangHuiTriangle { List<List<Integer>> fatherList = new ArrayList<List<Integ...原创 2019-10-22 16:47:46 · 423 阅读 · 0 评论 -
Oracle数据同步接口,增量数据从ERP系统到本地临时表封装解决方案
项目的许多基础数据需要从ERP系统中同步基础数据,例如:物料、客户、供应商、仓库等等。之前做过一次比较死板的标准流程:1.通过JDBC取ERP系统的增量数据;2.解析;3.然后用自己项目的DB对象存进本地数据库临时表中;4.最后再本地分析增量数据完成新增或更新操作。逻辑相对简单,过程不再赘述,只是要注意空对象以及时间格式的数据要做一些处理。由于目标数据库的表与本地数据库临时表可以建成...原创 2019-07-24 17:31:29 · 788 阅读 · 0 评论 -
JAVA读取Properties文件对象常用方法总结
实际开发中,总是会需要用到配置文件的,常用的就是properties、xml、json。比如,使用jdbc访问数据库时,我们就可以将driver、url、username、password这几个参数记录在配置文件中,修改访问数据库时,只需要修改配置文件即可,就不需要再改代码了。 ClassLoder读取properties文件 //该方式只能读取类路径下的配置文件Properti...原创 2019-07-17 17:34:08 · 1371 阅读 · 0 评论 -
Oracle数据同步接口中,对于NUMBER、DATE类型数据,从resultSet中直接获取造成精度丢失的解决方案
通过JDBC获取ORACLE数据库数据时,返回值统一都是ResultSet对象,就像存储过程中的游标,一行一行的读取数据。对于NUMBER和DATE类型的数据,如果java代码中直接用resultSet.getInt()、resultSet.getDate()等,往往会存在一些精度上的丢失。NUMBER类型NUMBER数据类型既可以标识整数,也可以表示小数,所以大部分情况下表中的数字类...原创 2019-07-24 17:00:46 · 1696 阅读 · 0 评论 -
Spring中bean实例化的三种方式:默认构造、静态工厂、实例工厂
1. 默认构造方式:必须提供默认构造<bean id="bean id" class="工厂全限定类名"></bean>以Studnet类为例public class Student { private int id; private String name; private int age; public int getId() { return ...原创 2019-07-29 15:31:54 · 815 阅读 · 0 评论 -
Spring IOC基础概念总结:何为控制?何为反转?控制了什么?反转了哪里?
IOC(Inversion of Control 控制反转),是Spring框架核心,是一种重要的设计思想。它实现了将设计好的对象交由IOC容器管理,而不再是传统意义上的在对象内部直接控制。控制在学习java初期,我们就已经习惯了直接通过new创建对象,程序主动去创建依赖的对象,而IOC有一个容器来创建这些对象,即IOC容器控制对象的创建,同时,IOC容器控制外部资源的获取。反转何...原创 2019-07-29 12:18:01 · 358 阅读 · 0 评论 -
JDBC使用总结:增删改查、调用存储过程、执行存储函数、存储过程与存储函数区别分析
JDBC(Java Database Connectivity):Java访问数据库的解决方案。JDBC只定义接口,具体实现由各个数据库厂商负责。原生jdbc技术的使用基本都是模板式的开发,基本格式比较固定。 JDBC增删改查 try{//导入驱动包、加载具体驱动类Class.forName("具体驱动类");//与数据库建立连接,不同数据库写法可能不同,相同数据库不...原创 2019-07-17 14:24:57 · 492 阅读 · 0 评论 -
关于null对象使用print方法打印问题总结,null+"123"打印结果是"null123"还是"123"?
首先回忆一下String str = null与String str = “” 的区别:null表示一个空对象,除了基础类型以外的其它类型,都能以此声明一个对象,但未分配堆内存空间,就好比口头宣布“我要上北大”;后者声明了一个实实在在的字符串,只不过这个字符串比较特殊,他的长度为0,可以理解为“买好了所有的复习资料准备撸起袖子开干了,但是还未开始,积累为0”。null对象在使用String的方...原创 2019-07-19 10:31:37 · 1430 阅读 · 0 评论 -
String通过“+”号拼接字符串的底层实现
在实际开发过程中,经常涉及到字符串的处理,特别是字符串的连接。常规情况下,我们都习惯了直接使用“+”来连接两个字符串,方便简洁,但又总会有人告诉你,使用“+”连接字符串是一种低效的处理方式。由于“+”不是一个特定的类,无法从jdk源码去一探究竟底层如何实现的,所以,唯一的解释就是编译器动了手脚。L0LINENUMBER 27 L0ACONST_NULLASTORE 1L1LIN...原创 2019-07-18 18:22:29 · 1547 阅读 · 0 评论