
看山聊Java
文章平均质量分 92
Java技术栈
看山
人非生而知之者,孰能无惑,惑而不从师,其为惑也,终不解矣
展开
-
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java18 的新特性
Java18新特性原创 2024-09-10 08:30:00 · 1279 阅读 · 1 评论 -
小心 transmittable-thread-local 的这个坑
本文主要是变更 transmittable-thread-local 使用方式时出现的一个异常。原创 2022-07-30 11:19:17 · 3055 阅读 · 0 评论 -
Switch 块、Switch 表达式、Switch 模式匹配,越来越好用的 Switch
与 if-else 一样,switch 语法是用来做条件判断的。当条件清晰简洁时,能够有效地提升代码可读性。switch 语法从 Java5 开始,Java12 增加了 Switch 表达式(Java14 提供正式版),Java17 增加 Switch 模式匹配(预览版)。...原创 2022-07-30 11:11:33 · 1738 阅读 · 0 评论 -
2022 年 Java 行业分析报告
前段时间介绍了从 Java8 到 Java17 每个版本比较有特点的新特性(收录在 从小工到专家的 Java 进阶之旅 专栏),今天看到 JRebel 发布了《2022 年 Java 发展趋势和分析》,于是借此分析一下 Java 行业的现状,希望给大家一些参考。......原创 2022-06-19 11:50:56 · 5216 阅读 · 1 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java17 的新特性
你好,我是看山。本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。概述Java17 是在.原创 2022-05-17 21:39:12 · 1890 阅读 · 1 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java16 的新特性
你好,我是看山。本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。概述Java16 是在.原创 2022-04-19 08:08:35 · 2687 阅读 · 0 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java15 的新特性
你好,我是看山。本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。概述Java15 是在.原创 2022-03-17 07:49:08 · 2007 阅读 · 1 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java14 的新特性
本文讲解一下 Java14 的特性,这个版本带来了不少新特性、功能实用性的增强、GC 的尝试、性能优化等:JEP 305:instanceof 模式匹配 (预览版);JEP 343:打包工具 (孵化);JEP 345:G1 的可识别 NUMA 系统的内存分配;JEP 349:JFR 事件流;JEP 352:非原子性的字节缓冲区映射;JEP 358:NullPointerException 的友好提示信息;JEP 359:Record 声明 (预览版);JEP 361:Switch 表达式转正 (第二版预览)原创 2022-03-07 21:50:57 · 1562 阅读 · 1 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java13 的新特性
你好,我是看山。本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。概述本文讲解一下 Ja.原创 2022-02-14 21:56:37 · 2547 阅读 · 1 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java12 的新特性
本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。你好,我是看山。从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。概述本文讲解一下 Ja..原创 2022-01-17 08:30:00 · 2099 阅读 · 0 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java11 的新特性
文章目录概述增强 Stringrepeatstrip、stripLeading、stripTrailingisBlanklines增强文件读写增强集合的数组操作增强函数 PredicateLambda 中的局部变量转正的 HTTP 客户端基于嵌套关系的访问控制优化增强 java 命令动态类文件常量低开销的堆性能采用工具ZGC改进 Aarch64 指令集Epsilon 垃圾收集器飞行记录器(Flight Recorder)移除或过期组件其他小改动文末总结推荐阅读你好,我是看山。本文收录在 《从小工到专.原创 2022-01-10 07:00:00 · 2382 阅读 · 6 评论 -
Java11 中基于嵌套关系的访问控制优化
有人的地方就有江湖,有猿的地方就有 bug原创 2022-01-05 23:08:08 · 4090 阅读 · 7 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java10 的新特性
你好,我是看山。本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。概述从 Java10 .原创 2021-12-29 22:10:45 · 2992 阅读 · 1 评论 -
Spring隐藏了真实的错误,让排查问题变得很难
你好,我是看山。今天项目依赖了一个基础组件之后,启动失败,排查过程走了一些弯路,最终确认是因为依赖组件版本冲突造成了java.lang.NoClassDefFoundError异常。下面是排查过程,希望可以给你提供一些思路。观察异常栈下面是打印的异常栈信息,从其中提炼可能的关键信息,能够找到“Could not convert argument value of type [java.lang.String] to required type [java.lang.Class]”,还有“Unres.原创 2021-12-28 21:54:21 · 5119 阅读 · 2 评论 -
Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java9 的新特性
你好,我是看山。本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。概述相较于 Java8.原创 2021-12-20 06:00:00 · 3072 阅读 · 1 评论 -
JDK 每半年就会更新一次新特性,再不掌握就要落伍了:JDK8 的新特性
该图片由Alexandr Podvalny在Pixabay上发布你好,我是看山。本文收录在 《Java 进阶》 系列专栏中。从 2017 年开始,JDK 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中仍有近半的环境使用 JDK8,有近半的人转移到了 JDK11,随着 JDK17 的发布,相信比例会有所变化。因此,准备出一个系列,配合示例讲解,阐述从..原创 2021-11-25 08:11:49 · 4296 阅读 · 19 评论 -
从零实现“百度网盘批量重命名”工具
该图片由Roshan Bhatia在Pixabay上发布你好,我是看山。工具的发明能够节省体力,同时也可以减少重复劳动,软件也是工具的一种。今天要说的是,引用 IT 技术,减少大量文件重命名这种重复的劳动。一直在用的存储云盘是百度网盘,里面收集了大量文件。各种资料、电子书,使用空间达到了 2500G。之前还清理过一些低质的书籍,结果使用工具导出发现,在待整理目录中,居然有 1942 条电子书的记录。如果有小伙伴想要什么书,可以从公号留言,只要不是商用,无私共享。提出需求书归正传,这么多的文..原创 2021-11-18 07:59:37 · 5723 阅读 · 34 评论 -
Java 进阶:使用 Lambda 表达式实现超强的排序功能
该图片由Michael Kleinsasser在Pixabay上发布你好,我是看山。本文被《Java 进阶》专栏收录,在公众号「看山的小屋」,回复“java”可获取源码。我们在系统开发过程中,对数据排序是很常见的场景。一般来说,我们可以采用两种方式:借助存储系统(SQL、NoSQL、NewSQL 都支持)的排序功能,查询的结果即是排好序的结果查询结果为无序数据,在内存中排序。今天要说的是第二种排序方式,在内存中实现数据排序。首先,我们定义一个基础类,后面我们将根据这个基础类演示..原创 2021-11-08 23:13:31 · 6821 阅读 · 52 评论 -
阿里开源的这个库,让Excel导出不再复杂(填充模板的使用指南)
该图片由宅-KEN在Pixabay上发布你好,我是看山。前文 说了写操作,可以实现简单的列表导出,还能 定义样式。有时候,我们还需要导出的一个大表单,或者是表单+列表的形式,这个时候,我们就需要填充功能。内容比较多,文内只会列出关键代码,想要完整源码,可以关注公号「看山的小屋」回复“easyexcel”获取。在 EasyExcel 中,写操作可以完成大部分工作,填充的优势在于,可以实现自定义样式的,只要在模板中设置好样式,填充的数据就能够带着样式。先写个表单既然是使用模板,写来定义一个模..原创 2021-10-10 16:04:56 · 7906 阅读 · 17 评论 -
阿里开源的这个库,让 Excel 导出不再复杂(既要能写,还要写的好看)
既要能写,还要写的好看。毕竟,有时候还是要看脸。原创 2021-10-07 16:11:44 · 8562 阅读 · 22 评论 -
阿里开源的这个库,让 Excel 导出不再复杂(简简单单的写)
该图片由dae jeung kim在Pixabay上发布你好,我是看山。导出是中后台常见的功能,Excel文件是常见的导出格式。在Java栈中,常用的是JXL(目前改名为JExcel)和Apache POI。其中jxl最后的更新时间是2012,除了老系统中能看到影子,几乎见不到踪迹了。目前基本上是POI一统天下。今天要说的EasyExcel阿里巴巴开源的Excel导出类库,是对POI的封装,实现了很多高级功能,并且留出扩展口,支持扩展定制化功能。打个比喻,POI相当于乐高积木,一个个的小积木可..原创 2021-10-04 07:09:58 · 8663 阅读 · 9 评论 -
看山聊 Java:检查日期字符串是否合法
该图片由Анастасия Белоусова在Pixabay上发布你好,我是看山。这次说一下,怎样检查给出的字符串,是否是合法日期字符串。本文将从 Java 原生和第三方组件两种方式来说明。WHY后端接口在接收数据的时候,都需要进行检查。检查全部通过后,才能够执行业务逻辑。对于时间格式,我们一般需要检查这么几方面:字符串格式是否正确,比如格式是不是yyyy-MM-dd时间在合法范围内,比如我们需要限定在一个月内的时间字符串可以解析为正常的时间,比如 2 月 30 号就不是正常时间..原创 2021-08-06 22:03:29 · 5619 阅读 · 11 评论 -
看山聊Java:开始使用 Java8 中的时间类
该图片由Erik Karits在Pixabay上发布你好,我是看山。前面聊了聊 Java8 新版时间 API 的类,然后又说了说怎么与旧版时间 API 的转换,今天来聊聊怎样通过新 API 实现老 API 的功能,这样我们就可以逐步替换掉旧版 API,与时俱进。Java8 之前,我们常用的时间类有java.util.date、java.util.Calendar和java.util.Timezone。还会有一些不那么常用的,java.sql.Date、java.sql.TimeStamp。这..原创 2021-06-30 23:11:00 · 1099 阅读 · 7 评论 -
看山聊并发:如果非要在多线程中使用 ArrayList 会发生什么?(第二篇)
你好,我是看山。前面写过一篇文章 《如果非要在多线程中使用 ArrayList 会发生什么?》,有读者反馈,Java 11 代码已经修复,还会出现 null 元素。为了便于理解,当时只是通过代码执行顺序说明了异常原因。其实多线程中还会涉及 Java 内存模型,本文就从这方面说明一下。对比源码我们先来看看 Java 11 中,add方法做了什么调整。Java 8 中add方法的实现:public boolean add(E e) { ensureCapacityInternal(siz.原创 2021-06-29 23:38:39 · 1896 阅读 · 21 评论 -
将EOS项目部署到weblogic12c
EOS Platform支持标准的EAR,可以运行在weblogic服务器上,但是EOS Platform 7.2暂不支持weblogic12c,需要手动修改一些配置,然后才能够成功部署。原创 2015-03-24 18:59:01 · 3440 阅读 · 0 评论 -
EOS Platform 7.2下安装weblogic插件
在实际工作中,需要用到EOS Platform,这是一个基于Eclipse的开发工具,自带了Tomcat,可以满足大部分需要,但是有时候需要使用Weblogic,这就得手动安装Weblogic插件了。这个过程与Eclipse相同(Eclipse下安装weblogic插件),本文中在EOS Platform 7.2中安装Weblogic插件。原创 2015-03-24 18:13:45 · 2572 阅读 · 0 评论 -
在EOS项目中禁用BPS服务
在安装EOS Platform的时候,会有选择插件的界面,包括bps、cap、mobile(7.3提供)、sso。当选择的bps之后,在EOS的default包(应该称为基础包)中,将包含BPS的内容。EOS导出EAR包的原理是,将新建的EOS项目中的内容添加到default包中,然后将default整体导出为EAR包。在某些使用EOS项目中没有用到BPS,并且不需要BPS引擎启动,需要通过修改配置原创 2015-04-01 11:38:19 · 5092 阅读 · 0 评论 -
面试真题:无重复字符的最长子串
你好,我是看山。来一个算法题,面试之后查了一下,是 LeetCode 的第三题,难度中等。居然在面试过程中碰到 LeetCode 真题,事后总结一波。加深印象。先看一下题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。输入:s = “abcabcbb”输出:3解释:因为无重复字符的最长子串是 “abc”,所以其长度为 3。输入:s = “pwwkew”输出:3解释:因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 .原创 2021-05-08 21:51:19 · 1048 阅读 · 0 评论 -
中文字节长度引起的数据丢失
最近在写一个应用监控的项目,使用netty作为数据传输。因为刚开始写,没有使用Protobuf之类的作为编码工具,只是使用的是netty自带的`LengthFieldBasedFrameDecoder`作为报文解析工具,自定义编码解码类,实现数据传输。在对中文进行转换字节的时候一定要注意,千万不要想当然的使用`length()`方法。还是要根据具体情况多试试。原创 2017-08-30 16:18:07 · 2317 阅读 · 0 评论 -
看山聊Java:Date 与 LocalDate 或 LocalDateTime 互相转换
你好,我是看山。从 Java1 到 Java8 将近 20 年,再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时间 API 之间切换,并行使用。今天就来说说,java.util.Date与java.time.LocalDate/LocalDateTime如何互相转换。java.util.Date转为java.time.LocalDateJava8 发行的时候,也考虑到了新旧 API 之间的转换,所以在java.util.Date中增加了toI.原创 2021-06-22 23:17:59 · 5016 阅读 · 1 评论 -
看山聊Java:介绍 Java8 中的时间类及常用 API
该图片由Önder Örtel在Pixabay上发布你好,我是看山。年龄大的 Java 程序员都有体会,Java8 之前,Java 提供了一组时间类:java.util.Date、java.util.Calendar及其子类和工具类等。功能比较全面,最大的缺点是难用。所以很多团队直接放弃原生时间类,使用第三方的时间类库。后来,Java8 吸收了 joda-time 的优秀设计,提供了一组新的时间处理 APIjava.time.。本文作为这个系列的第一篇,扒一扒Date和Calendar存在的问题..原创 2021-06-16 08:40:06 · 1186 阅读 · 1 评论 -
看山聊Java:一文掌握 Java8 的 Optional 的 6 种操作
你好,我是看山。Java8 中引入了一个特别有意思类:Optional,一个可以让我们更加轻松的避免 NPE(空指针异常,NullPointException)的工具。很久很久以前,为了避免 NPE,我们会写很多类似if (obj != null) {}的代码,有时候忘记写,就可能出现 NPE,造成线上故障。在 Java 技术栈中,如果谁的代码出现了 NPE,有极大的可能会被笑话,这个异常被很多人认为是低级错误。Optional的出现,可以让大家更加轻松的避免因为低级错误被嘲讽的概率。定义示例数据.原创 2021-05-20 06:16:28 · 1502 阅读 · 4 评论 -
看山聊Java:一文掌握 Java8 Stream 中 Collectors 的 24 个操作
你好,我是看山。Java8 应该算是业界主版本了,版本中重要性很高的一个更新是Stream流处理。关于流处理内容比较多,本文主要是说一下Stream中的Collectors工具类的使用。Collectors是java.util.stream包下的一个工具类,其中各个方法的返回值可以作为java.util.stream.Stream#collect的入参,实现对队列的各种操作,包括:分组、聚合等。官方文档给出一些例子:Implementations of {@link Collector} tha.原创 2021-05-13 19:22:56 · 1734 阅读 · 6 评论 -
看山聊并发:面试实战之多线程顺序打印
你好,我是看山。来个面试题,让大家练练手。这个题在阿里和小米都被问过,所以放在这个抛砖引玉,期望能够得到一个更佳的答案。实现 3 个线程 A、B、C,A 线程持续打印“A”,B 线程持续打印“B”,C 线程持续打印“C”,启动顺序是线程 C、线程 B、线程 A,打印的结果是:ABC。解法一:状态位变量控制这个问题考察的是多线程协同顺序执行。也就是第一个线程最先达到执行条件,开始执行,执行完之后,第二个线程达到执行条件,开始执行,以此类推。可以想到的是,通过状态位来表示线程执行的条件,多个线程自旋.原创 2021-04-11 23:05:16 · 1075 阅读 · 0 评论 -
看山聊并发:synchronized 锁同步
你好,我是看山。synchronized 是 java 内置的同步锁实现,一个关键字实现对共享资源的锁定。synchronized 有 3 种使用场景,场景不同,加锁对象也不同:普通方法:锁对象是当前实例对象静态方法:锁对象是类的 Class 对象方法块:锁对象是 synchronized 括号中的对象synchronized 实现原理synchronized 是通过进入和退出 Monitor 对象实现锁机制,代码块通过一对 monitorenter/monitorexit 指令实现。在编原创 2021-03-28 20:18:28 · 1115 阅读 · 0 评论 -
看山聊并发:Java 中 Vector 和 SynchronizedList 的区别
你好,我是看山。本文还是折腾 Java 中的队列,上次比较了 Vector、ArrayList、CopyOnWriteArrayList、SynchronizedList,当时感觉挺明白,后来想想又有些不理解的地方,所以今天在重新翻出来研究一下,我承认我钻了牛角尖了。Vector虽然种种问题,但是都属于设计上的问题,为什么不在后续版本中进行优化呢?HashMap就优化了好几次。而SynchronizedList这个内部类(也就是通过Collections.synchronizedList(new A.原创 2021-02-28 19:45:34 · 1843 阅读 · 6 评论 -
看山聊并发:认识 Java 中的队列:Vector、ArrayList、CopyOnWriteArrayList、SynchronizedList
你好,我是看山。书接上文,上次聊了聊 在多线程中使用 ArrayList 会发生什么,这次我们说说平时常用的列表:Vector、ArrayList、CopyOnWriteArrayList、SynchronizedList。VectorVector是在 JDK 1.0 提供的,虽然没有被标记Deprecated,但是事实上已经没人使用了。主要原因是性能差,且不符合需求。从源码可以看出(这里不贴源码了),Vector是基于数组实现,几乎在所有操作方法上,都用synchronized关键字实现方法同.原创 2021-02-10 11:59:01 · 1131 阅读 · 0 评论 -
看山聊并发:如果非要在多线程中使用ArrayList会发生什么?
你好,我是看山。我们都知道,Java中的ArrayList是非线程安全的,这个知识点太熟了,甚至面试的时候都很少问了。但是我们真的清楚原理吗?或者知道多线程情况下使用ArrayList会发生什么?前段时间,我们就踩坑了,而且直接踩了两个坑,今天就来扒一扒。翠花,上源码上代码之前先说下ArrayList的add逻辑:检查队列中数组是否还没有添加过元素如果是,设置当前需要长度为10,如果否,设置当前需要长度为当前队列长度+1判断需要长度是否大于数组大小如果是,需要扩容,将数组长度扩容1..原创 2021-02-04 23:19:10 · 1818 阅读 · 5 评论 -
java import 导入包时,我们需要注意什么呢?
你好,我是看山。这篇文章起因是 code review 时和同事关于 import 导入声明的分歧。用过 IDEA 的都知道,默认情况下,通过 import 导入类时,当数量达到设置数量(类 5 个、静态变量 3 个),就会改为按需导入方式,也就是使用使用*号折叠导入。同事建议不要采用按需导入,要使用单类型导入 (single-type-import)。而我是觉得既然 IDEA 作为宇宙级的 IDE,不会在这种地方出现纰漏,所以想继续按照 IDEA 默认配置来。所以总结一下这两种方式的差异。如果对.原创 2021-01-31 23:50:45 · 3113 阅读 · 5 评论 -
JVM 垃圾收集算法
这是根据周志明老师的《深入理解Java虚拟机》整理的学习笔记,后续会更新在深入理解Java虚拟机中,希望能够帮到一些需要速成的同学。从如何判断对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两大类也常被称作“直接垃圾收集”和“间接垃圾收集”。从如何判断对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(T.原创 2021-01-24 22:06:02 · 988 阅读 · 0 评论