
Java进阶
文章平均质量分 77
Java进阶高级开发必备知识技能图谱、Java开发者技能强化必备知识技能、Java开发所用三方组件、开源框架使用示例、Java性能优化案例、Java源码分析详解。
优惠券已抵扣
余额抵扣
还需支付
¥15.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
霸道流氓气质
每一个优秀的人,都有一段沉默的时光,(项目合作请留言)是那段时光,不抱怨不诉苦,最后渡过了这段感动自己的日子。
展开
-
Java性能优化-String的intern()方法的使用减少内存消耗
String.intern() 方法用于在字符串常量池中查找是否存在与指定字符串相等的字符串。如果找到了,就返回该字符串的引用;否则,就在字符串常量池中创建一个新的字符串对象,并返回对它的引用。这个方法对于避免创建重复的字符串对象非常有用,特别是在处理大量字符串数据时,可以显著减少内存使用。需要明确Java(这里是JDK1.8)创建字符串的不同:1.使用双引号声明的字符串对象会保存在字符串常量池中2.使用new关键字创建的字符串对象会先从字符串常量池中找,如果没找到就创建一个,原创 2024-07-22 09:59:07 · 854 阅读 · 0 评论 -
JVM常用工具中jmap实现手动进行堆转储(heap dump文件)并使用MAT(Memory Analyzer Tool)进行堆分析-内存消耗分析
上面讲了jmap的简单使用。下面记录其常用功能,实现堆转储离线文件,并通过三方工具进行可视化查看和分析。性能监控之常见 Java Heap Dump 方法dump heap是诊断与内存相关的问题的重要手段,例如:内存泄漏、垃圾回收问题和java.lang.OutOfMemoryError。同时也是优化内存消耗的重要手段。有非常多的工具可以dump heap,以及分析转储文件,例如:visualVM、Eclipse MAT和 Heap Hero等等。原创 2024-07-19 14:51:33 · 1538 阅读 · 0 评论 -
Java开发手册中-要求日志输出时字符串变量之间的拼接使用占位符与使用字符串拼接性能对比
参考以上性能测试工具的使用。Java开发手册中有这样一条:【强制】在日志输出时,字符串变量之间的拼接使用占位符的方式。说明:因为 String 字符串的拼接会使用 StringBuilder 的 append()方式,有一定的性能损耗。使用占位符仅是替换动作,可以有效提升性能。正例:logger.debug("Processing trade with id: {} and symbol: {}", id, symbol);原创 2024-07-18 15:55:29 · 559 阅读 · 0 评论 -
Java开发手册中-避免Random实例被多线程使用、多线程下Random与ThreadLoacalRandom性能对比
参考以上性能测试工具的使用。Java开发手册中有这样一条:【推荐】避免 Random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一 seed导致的性能下降。说明:Random 实例包括 java.util.Random 的实例或者 Math.random()的方式。正例:在 JDK7 之后,可以直接使用 API ThreadLocalRandom,而在 JDK7 之前,需要编码保证每个线程持有一个单独的 Random 实例。原创 2024-07-17 16:12:34 · 539 阅读 · 0 评论 -
Java开发手册中-锁并发-同步调用应该去考量锁的性能损耗-加锁与不加锁性能对比
参考以上性能测试工具的使用。参考以上synchronized关键字的使用。《Java开发手册》中关于锁并发中有要求:【强制】高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。说明:尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用 RPC 方法。原创 2024-07-17 14:38:30 · 427 阅读 · 0 评论 -
Java开发手册中为什么要求集合转数组toArray时禁止使用无参方法,而使用传参长度为0的空数组
参考以上性能测试工具的使用。阿里巴巴《java开发手册》泰山版关于集合转数组时规范声明:【强制】使⽤集合转数组的⽅法,必须使⽤集合的 toArray(T[] array),传⼊的是类型完全⼀致、⻓度为0的空数组。原创 2024-07-17 14:07:09 · 445 阅读 · 0 评论 -
Java性能优化-书写高质量SQL的建议(如何做Mysql优化)
为避免开发过程中针对mysql语句的写法再次踩坑,总结开发过程中常用书写高质量sql的一些建议。原创 2024-07-16 14:03:39 · 854 阅读 · 0 评论 -
Java性能优化-if-else简化技巧
如果单纯是做情景选择,建议使用switch,如果必须使用if-else,过多的if-else会让人看着很难受,可以使用如下几个小技巧来简化过多的if-else。原创 2024-07-15 11:08:01 · 371 阅读 · 0 评论 -
Java性能优化-switch性能优化-用String还是int做比较
参考以上性能测试工具的使用。下面针对Java中对switch-case比较时使用String还是int性能做对比。原创 2024-07-12 14:46:04 · 516 阅读 · 0 评论 -
Java性能优化-switch-case和if-else速度性能对比,到底谁快?
参考以上性能测试工具的使用。下面针对Java中对switch-case和if-else在速度方面的性能做测试。原创 2024-07-12 13:19:33 · 689 阅读 · 0 评论 -
Java性能优化-HashMap遍历的7种方式及性能测试对比
参考以上性能测试工具的使用。下面针对Java中对HashMap的7种遍历方式做性能测试。原创 2024-07-11 17:17:42 · 1281 阅读 · 0 评论 -
Java中实现监听UDP协议的指定端口并收到数据按照十六进制输出
对接协议中需要监听UDP协议的指定端口并监听数据,且数据格式为十六进制。如果是在linux服务上,可以快速通过C或者python脚本等方式实现。这里使用Java代码实现,可便于后续做其他存储数据等的扩展,且只需要在服务器上安装jdk,均可进行运行和数据调试。原创 2024-04-11 21:30:00 · 1023 阅读 · 0 评论 -
Java中使用poi+poi-tl实现根据模板导出word文档
上面讲的是Excel的导出,如果是需要根据word文档的模板,比如根据数据库中数据或者其它数据源循环根据模板填充数据,可填充文字、图片、表格、图表等数据。原创 2024-03-01 20:15:00 · 4521 阅读 · 2 评论 -
Java中使用Jsoup实现网页内容爬取与Html内容解析并使用EasyExcel实现导出为Excel文件
Jsoup使用的是DOM解析方式,把整个HTML文档(XML文档)加载到内存中形成一棵DOM树,得到文档的Document对象。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,这里要获取到id为t_container的div元素大的第22个子元素(索引为21)的table元素的tr元素的td数据。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,原创 2024-02-28 21:00:00 · 1944 阅读 · 0 评论 -
Java中使用Graphics2D实现图片添加文字/图片水印
java实现给图片添加水印实现步骤:获取原图片对象信息(本地图片或网络图片)添加水印(设置水印颜色、字体、坐标等)处理输出目标图片。原创 2024-02-27 20:30:00 · 1270 阅读 · 0 评论 -
Java中使用StopWatch实现代码块耗时统计/计时某段代码执行
上面讲了统计方法的耗时,实现和使用面向方法体。如果是在方法中,需要频繁统计一段段的代码块的耗时,可以使用StopWatch。原创 2024-02-02 21:00:00 · 2855 阅读 · 1 评论 -
Java中SimpleDateFormat时YYYY与yyyy以及HH和hh的区别注意踩坑
在使用SimpleDateFormat在获取当前日期时因使用了YYYY导致20231231这个日期被格式化为20241231这里推荐在日期处理时统一使用封装工具类并指定格式化格式,避免在业务代码中失误写错。在Java中的SimpleDateFormat类中格式化日期时,YYYY和yyyy之期存在细微的差异。它们都代表一年,但是yyyy代表日历年份,而YYYY代表星期,基于周的年份。这是一个细微的差异,通常情况下,两者的结果是相同的,但在跨年的第一周或最后一周可能会有差异。原创 2024-01-25 20:30:00 · 1082 阅读 · 0 评论 -
Java中使用JTS实现WKB数据写入、转换字符串、读取
WKB(Well-Known Binary) 用二进制流 描述几何对象信息。WKB比WKT的优势在于WKB是二进制,主要是解决传输和存储的效率问题,所以MySQL,Postgre数据存储Geometry类型的数据,存储的值是WKB格式的WKB 使用 1 字节无符号整数、4 字节无符号整数和 8 字节双精度数(IEEE 754 格式)。一个字节是八位。注:博客:霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客。原创 2023-12-22 21:30:00 · 1137 阅读 · 0 评论 -
Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内的方位角
基于gis的业务场景中,需要在地图中录入区域数据的wkt数据,然后根据某个坐标点判断是属于哪个区域,以及距离所属区域中最近的端点的方位角,比如坐标点位于某区域东南方向100米。原创 2023-09-08 13:26:08 · 1303 阅读 · 0 评论 -
Java性能优化-测试try-catch放在循环内和外的性能对比与业务区别
使用如上方式测试Java中try-catch放在循环内和循环外是否有性能上的差别。原创 2023-07-16 16:03:20 · 1106 阅读 · 0 评论 -
Java性能优化-ArrayList VS LinkedList,测试数组和链表在查询和添加删除时性能对比
上面在使用JMH时测试了Java中数组和链表在进行头部插入时的对比结果。下面分别对比在头部、中部、尾部分别进行查询和添加/删除时的性能对比,因添加和删除流程类似,所以只测试添加即可。原创 2023-07-16 14:26:02 · 344 阅读 · 0 评论 -
Java代码精简之道-10条代码精简方案
JDK7 开始新增了对需要关闭资源处理的特殊语法 try-with-resource。所有实现Closeable接口的“资源”,均可采用try-with-resource进行简化。例如 InputStream, OutputStream ,Connection, Statement, ResultSet等接口都实现了,使用 try-with-resource可以不用写finally块,编译器会帮助生成关闭资源的代码。原创 2023-06-15 13:37:36 · 1276 阅读 · 2 评论 -
Java编程技巧-定义集合常量、定义数组常量的最佳方式
一般定义数组常量,会像下面代码一样,定义一个公有数组常量但是,可以通过下标修改数组值,导致数组常量的值可变。所以,这种方法定义的数组常量,并不是一个真正意义上的数组常量。最佳法“私有数组常量+公有克隆方法”的解决方案。如下代码所示:先定义一个私有数组常量,保证不会被外部类使用;在定义一个获取数组常量方法,并返回一个数组常量的克隆值。由于每次返回的是一个克隆数组,即便修改了克隆数组的常量值,也不会导致原始数组常量值的修改。原创 2023-06-10 17:21:17 · 3835 阅读 · 0 评论 -
Java开发技巧-数据结构-使用HashSet判断主键是否存在、使用Pair成对结果返回/Triple三个对象返回
HashSet实现Set接口,由哈希表(实际上是HashMap)实现,但不保证set的迭代顺序,并允许使用null元素。HashSet的时间复杂度跟HashMap一致,如果没有哈希冲突则时间复杂度为O(1),如果存在哈希冲突则时间复杂度不超过O(n)。所以,在日常编码中,可以使用HashSet判断主键是否存在。原创 2023-06-10 16:16:55 · 1287 阅读 · 0 评论 -
Java避免踩坑:Set对象排重注意避免重复-以commons-csv读取csv文件并排查为例
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。HashSet 允许有 null 值。HashSet 是无序的,即不会记录插入的顺序。HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。在Java语言中,Set数据结构可以用于对象排重,常见的Set类有HashSet、LinkedHashSet等。比如:代码中使用HashSet数据结构,为了避免城市数据重复,对读取的城市数据进行强制排重。这里的数据源从csv文件中读取。原创 2023-06-09 16:58:54 · 1268 阅读 · 0 评论 -
Java开发手册中为什么禁止使用isSuccess作为布尔类型变量名以及POJO中基本类型与包装类型的使用标准
Java开发手册中关于POJO的布尔类型的变量名的要求是:【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所以,需要在设置从 is_xxx 到 xxx 的映射关系。反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时候,原创 2023-06-06 11:05:11 · 708 阅读 · 0 评论 -
Java中为什么禁止把SimpleDateFormat定位为static变量以及如果非要使用static定位SimpleDateFormat时在多线程环境下的几种使用方式
以下会用到如上概念。Java开发手册中对于SimpleDateFormat的使用的要求是:【强制】SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static,必须加锁,或者使用 DateUtils 工具类。正例:注意线程安全,使用 DateUtils。说明:如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar,原创 2023-06-05 19:18:53 · 453 阅读 · 0 评论 -
Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作
首先创建一个字符数组,长度是已有字符串和待拼接字符串的长度之和,再把两个字符串的值复制到新的字符数组中,【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。除了使用+拼接字符串之外,还可以使用 String 类中的方法 concat 方法来拼接字符串。而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。经过对比,我们发现,直接使用StringBuilder的方式是效率最高的。注意这里的代码耗时统计的方式可以参考。原创 2023-06-05 18:53:06 · 660 阅读 · 0 评论 -
Java开发手册中为什么要求谨慎使用ArrayList中的sublist方法
使用sublist的set等方法修改元素值时,发现原来的那个list的元素值也发生了改变,同理对sublist进行add操作时也是如此。subList 是 List 接口中定义的一个方法,该方法主要用于返回一个集合中的一段、可以理解为截取一个集合中的部分元素,也就是说,SubList 并没有重新创建一个 List,而是直接引用了原有的 List(返回了父类的视图),返回此列表中位于指定的fromIndex(包含)和toIndex(排除)之间的部分的视图。返回的列表支持此列表支持的所有可选列表操作。原创 2023-06-05 18:09:23 · 452 阅读 · 0 评论 -
Java开发手册中为什么建议初始化HashMap的容量大小,以及HashMap源码中相关参数(容量大小设置参数公式)说明
临界值,当实际 KV 个数超过 threshold 时,HashMap 会将容量扩容,threshold =容量 * 加载因子。表示 HashMap 满的程度,默认值为 0.75f,设置成0.75 有一个好处,那就是 0.75 正好是 3/4,而 capacity 又是 2 的幂。所以,两个数的乘积都是整数。从结果中可知,在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效的提高性能。4、除了以上成员变量,还有一个概念capacity,容量,如果不指定,默认容量是16。原创 2023-06-05 17:51:20 · 1283 阅读 · 0 评论 -
Java开发手册中为什么要求三目运算符必须要注意类型对齐
那如果,三目运算符的第二位和第三位的操作数的类型分别是基本数据类型和包装类型对象时,就需要有一方需要进行自动拆装箱。根据规定,三目运算符的第二、第三位操作数的返回值类型应该是一样的,这样才能当把一个三目运算符的结果赋值给一个变量。根据三目运算符的语法规范,当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作。2) 表达式 1 或表达式 2 的值的类型不一致,会强制拆箱升级成表示范围更大的那个类型。计算 x 的值,运算结果为 x 的值;否则,计算 y 的值,运算结果为 y 的值。原创 2023-06-05 17:24:07 · 470 阅读 · 0 评论 -
Java开发手册中为什么要求SimpleDateFormat时用y表示年,而不能用Y
SimpleDateFormat 是 Java 提供的一个格式化和解析日期的工具类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。SimpleDateFormat 使得可以选择任何用户定义的日期 - 时间格式的模式。在Java中,可以使用SimpleDateFormat的format方法,将一个Date类型转化为String类型,并且可以指定输出格式在Java中,可以使用 SimpleDateFormat 的 parse 方法,将一个 String 类型转化成 Date 类型原创 2023-06-05 17:17:02 · 405 阅读 · 0 评论 -
Java开发手册中为什么禁止使用ApacheBeanutils进行属性的复制copy以及使用SpringBeanUtils、CglibBeanCopier、AapchePropertyUtils进行属
如我们经常在代码中会对一个数据结构封装成 DO、SDO、DTO、VO 等,而这些 Bean 中的大部分属性都是一样的,3、构建PersonDo对象并赋值属性,并将同类别的属性复制的工具类进行一百万次测试方法的封装。7、Java中封装使用ApachePropertyUtils进行指定次数属性复制的方法。有些时候,如果我们要转换的两个对象之间属性大致相同,会考虑使用属性拷贝工具进行。4、Java中封装使用ApacheBeanUtils进行指定次数属性复制的方法。为了验证以上原因,变写测试代码进行验证。原创 2023-06-05 17:04:40 · 555 阅读 · 0 评论 -
Java反编译工具Jad的下载与使用示例
上面讲过Java反编译工具JD-GUI的使用,如果使用jad并通过命令如何实现反编译。为了验证Java开发手册中为什么不推荐使用+进行字符串拼接,我们编写示例代码并编译和进行反编译之后进行验证。原创 2023-06-04 10:02:24 · 2771 阅读 · 0 评论 -
Java开发手册中为什么禁止使用BigDecimal的equals方法做等值比较以及为什么禁止使用double直接构造BigDecimal
阿里Java开发手册嵩山版中明确指出:1、BigDecimal的等值比较应使用compareTo()方法,而不是equals()方法equals()方法会比较值和精度(1.0与1.00返回结果为false),而compareTo()则会忽略精度2、禁止使用构造方法BigDecimal(double)的方式把double值转换为BigDecimal对象BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常 注:博客:霸道流氓气质的博客_CSDN博客-C#,架构原创 2023-06-01 16:48:52 · 955 阅读 · 0 评论 -
JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用
记录JVM中常用工具。原创 2023-06-01 10:26:54 · 2435 阅读 · 0 评论 -
Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式)
LRU算法-缓存淘汰算法-Least recently used,最近最少使用算法根据数据的历史访问记录来进行淘汰数据,其核心思想是:如果有数据最近被访问过,那么将来被访问的几率也更高在Java中可以利用LinkedHashMap容器简单实现LRU算法LinkedHashMap底层就是用的HashMap加双链表实现的,而且本身已经实现了按照访问顺序的存储。此外,LinkedHashMap中本身就实现了一个方法removeEldestEntry用于判断是否需要移除最不常读取的数,原创 2023-05-31 15:34:46 · 540 阅读 · 0 评论 -
Java实战-不可变容器、列表遍历删除、HashMap遍历删除、巧用函数方法实现二维数组遍历
上面讲了在guava中的新集合类型,其中就包含不可变集合。其应用场景如果是应用内的接口方法,容器传参,返回容器时,尽量不要使用不可变容器,因为没法保证别人拿到你的返回容器后,会对它进行什么操作。如果对外提供返回结果,特别是null的场景,使用不可变的空容器优于返回null不可变容器,用于全局公用资源,共享配置参数;多线程的数据传递时,属于比较合适的场景。1、jdk原生提供了一些不可变容器,最大的特点就是不支持添加、删除、修改容器内的值。原创 2023-05-31 15:19:51 · 968 阅读 · 0 评论 -
Java中进行排序比较-Comparator与Comparable的区别-使用示例
java中进行排序比较时Comparator与Comparable区别:如果你有一个类,希望支持同类型的自定义比较策略,可以实现接口Comparable如果某个类,没有实现Comparable,但是又希望对它进行比较,则可以自定义一个Comparator,来定义这个类的比较规则注:博客:霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主新建类CompareDemo,并添加code和age属性,该类实现Comparable接口并重新compareTo方法进行排序比较,默认根原创 2023-05-31 14:47:07 · 876 阅读 · 0 评论 -
Java中枚举类的特殊用法-使用枚举实现单例模式和策略模式
上面针对枚举类实现单例模式和策略模式有所涉及,下面补充。原创 2023-05-31 14:35:23 · 1171 阅读 · 0 评论