Java基础
文章平均质量分 55
瘦子没有夏天
大家好,我是Leon。一个专业与Java领域的程序员,偶尔理理财。欢迎大家来阅读我博客,如果你发现极个别文章和书籍内容雷同,请叫我勤奋的code搬运工٩(๑❛ᴗ❛๑)۶。我的邮箱:gyoomi0709@foxmail.com
展开
-
继续前进吧
今天由于工作原因,导致博客更新拉下了不少。从现在开始慢慢捡起来,进行技术文章更新。原创 2022-02-08 17:13:25 · 520 阅读 · 0 评论 -
Java对集合中的元素进行排序的几种方法
Java对集合中的元素进行排序的几种方法一、前言实际开发中,对业务数据按照指定规则进行排序是很常见的。比如说,“按照记录的创建日期降序排序”、“按照App的应用率从大到小排序”… 在编码过程中,我们一般在两个层面排序入手:其一、SQL脚本;其二、服务应用层面(通俗来讲就是Java代码层面)。当然,本人探讨的核心是其二。二、需求设定假如有一组学生列表,学生对象具有id、姓名、所在年级、出生日期、身高字段。需对这一组学生列表进行以下规则进行排序。先按照年级从大到小排列,如果年级为空,则排在最后面原创 2021-03-25 09:29:07 · 2813 阅读 · 0 评论 -
EasyExcel之回填下拉框
一、业务背景1.1 技术演进在业务系统的开发中,我们会经常遇见各类各样的Excel导出,按照传统的做法,我们会引入第三方工具jar: POI来实现我们的导出功能。但是这也有缺点,我们的业务代码中充斥着重复且没有很多意义的代码。于是EasyExcel诞生了,它的出现了大大降低了我们开发的工作量,给我们提供了不少便利。EasyExcel官方源码: 链接官方文档: 链接在这里,对EasyExcel我们就不做过多介绍,有不了解的同学可以根据上述的官方地址进行自行学习。本篇文章所探求的主旨均是建立原创 2021-01-20 10:29:49 · 4119 阅读 · 4 评论 -
EasyExcel之填充公式导出Excel
一、业务背景1.1 技术演进在业务系统的开发中,我们会经常遇见各类各样的Excel导出,按照传统的做法,我们会引入第三方工具jar: POI来实现我们的导出功能。但是这也有缺点,我们的业务代码中充斥着重复且没有很多意义的代码。于是EasyExcel诞生了,它的出现了大大降低了我们开发的工作量,给我们提供了不少便利。EasyExcel官方源码: 链接官方文档: 链接在这里,对EasyExcel我们就不做过多介绍,有不了解的同学可以根据上述的官方地址进行自行学习。本篇文章所探求的主旨均是建立原创 2021-01-18 14:10:25 · 12391 阅读 · 19 评论 -
Spring源码之MethodIntrospector的原理解析与实际应用
一、概述1.1 说明从4.x版本开始,MethodIntrospector是spring-core中一个频繁使用的工具类。该类通常用来:用于搜索与元数据相关的方法的算法,包括接口和父类,同时还处理参数化方法以及基于接口和基于类的代理遇到的常见情况。通常(但不是必须)用于查找带注释的处理程序方法。二、源码解析2.1 源码/** * Defines the algorithm for searching for metadata-associated methods exhaustively *原创 2020-12-07 11:40:18 · 1554 阅读 · 0 评论 -
JDK14新特性之instanceof模式匹配
JDK14新特性之instanceof1. 背景及动机通过对instanceof运算符进行模式匹配来增强Java编程语言。模式匹配允许程序中的通用逻辑,即从对象中有条件地提取组件,可以更简洁,更安全地表示。这是JDK 14中的预览语言功能。动机几乎每个程序都包含某种逻辑,这些逻辑结合了对表达式是否具有某种类型或结构的测试,然后有条件地提取其状态的组件以进行进一步处理。例如,所有Java程序员都熟悉实例化。经常见到如下代码:if (obj instanceof String) { Strin原创 2020-05-19 15:48:00 · 1421 阅读 · 0 评论 -
超大Excel读取和写出(支持50万+)(一)
超大Excel读取和写出(支持50万+)一、现状假设我们的测试或生产环境的内存条件有限,比如说2GB(当然小数据的导入和导出不在本文的讨论范围,因为导入和导出它们几乎不存在内存溢出问题)。这里,我们假如:项目中有50W条及以上数据需要进行excel导入和导出。使用普通的POI包中HSSFWorkbook(2003版及以前的版本)和XSSFWorkbook(2007版及以后的版本),很容易造...原创 2020-05-06 21:05:04 · 3459 阅读 · 0 评论 -
超大Excel文件写出(支持50w+)(二)
超大Excel文件写出(支持50w+)1 线上内存溢出问题演示环境准备jvm运行参数设置如下: -Xms100M -Xmx100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d://dump.hprof示例代码/** * 超大excel写出示例 * * @author Leon * @date 2020-05-06 11:2...原创 2020-05-06 21:03:44 · 2868 阅读 · 0 评论 -
超大Excel文件读取(支持50w+)(三)
超大Excel文件读取(支持50w+)1 线上内存溢出问题演示环境准备准备一个大的excel文件(xlsx大小10M及以上)将jvm的heap缩小到500m(JVM 参数 -Xmx500m)用于模拟OOM使用参数在OOM时dump内存快照 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d://dump.hprof依赖管理 &l...原创 2020-05-06 20:59:47 · 7245 阅读 · 1 评论 -
JDK14新特性之Record
Record类型1、概念记录类型(record)是JDK 14的另一个预览功能。记录类型的作用类似于Kotlin中的数据类(data class)和Scala中的case class。记录类型的作用是作为不可变数据的封装。类似于枚举类型,记录类型是一种形式受限的类。一个记录类型由名称和状态描述两部分组成。状态描述声明了记录中包含的组件。2、 示例下面代码中的Student就是一个记录类型。...原创 2020-05-06 20:12:35 · 3328 阅读 · 0 评论 -
Java基础之可设置过期时间的map
Java基础之可设置过期时间的map一、技术背景在实际的项目开发中,我们经常会使用到缓存中间件(如redis、MemCache等)来帮助我们提高系统的可用性和健壮性。但是很多时候如果项目比较简单,就没有必要为了使用缓存而专门引入Redis等等中间件来加重系统的复杂性。那么Java本身有没有好用的轻量级的缓存组件呢。答案当然是有喽,而且方法不止一种。常见的解决方法有:ExpiringMap、...原创 2020-02-26 22:57:09 · 13738 阅读 · 1 评论 -
Java基础之超大集合数据分片策略
超大集合数据分片策略一、实际场景实际项目开发中常常为遇到超大数据量的集合,比如说一个size为100w的List。而往往实际应用中,我们不可能把这么大的数据量进行发送或传递,除了传递耗时过长,还有可能造成服务器内存溢出。所以我们往往将大集合进行数据分片,多次发送来提高灵活性和性能。二、解决思路将大集合拆分成若干个集合,然后分别发送或处理这些子集合。三、实现方法3.1 Guavasp...原创 2019-12-13 11:35:04 · 3141 阅读 · 2 评论 -
HTTP之CROS、预检
一、引言CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resourcesharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。本文详细介绍CORS的内部机制。二、简介CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器...转载 2019-01-09 15:01:28 · 868 阅读 · 0 评论 -
CAS理解
CAS一、什么是CAS概念CAS(compare and swap)即比较并交换。它是解决多线程的环境下使用锁造成性能损耗的一种机制。内容CAS操作一般包含三个操作数——内存位置(V)、预期原值(A)和新值(B)当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做并返回false原理CAS通过调用JNI的代码实现的。JNI:Java N...原创 2019-02-01 15:03:47 · 1299 阅读 · 0 评论 -
基于CAS和Unsafe的AtomicInteger源码实现
基于CAS和Unsafe的AtomicInteger源码实现当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchronized会保...原创 2019-02-02 11:58:35 · 311 阅读 · 0 评论 -
HTTP之基于 HTTP 的功能追加协议
HTTP之基于 HTTP 的功能追加协议虽然 HTTP 协议既简单又简捷,但随着时代的发展,其功能使用上捉襟见肘的疲态已经凸显。本章我们将讲解基于 HTTP 新增的功能的协议9.1 基于 HTTP 的协议9.1 基于 HTTP 的协议在建立 HTTP 标准规范时,制订者主要想把 HTTP 当作传输 HTML 文档的协议。随着时代的发展,Web 的用途更具多样性,比如演化成在线购物网...原创 2019-03-19 21:40:27 · 387 阅读 · 0 评论 -
Java基础之Java12(JDK12)新特性详解
Java12 新特性一、JShellJDK9加入说明java9引入了jshell这个交互性工具,让Java也可以像脚本语言一样来运行,可以从控制台启动 jshell ,在 jshell中直接输入表达式并查看其执行结果。当需要测试一个方法的运行效果,或是快速的对表达式进行求值时,jshell 都非常实用.除了表达式之外,还可以创建 Java 类和方法。jshell 也有基本的...原创 2019-05-11 23:42:59 · 4842 阅读 · 1 评论 -
jstl中c:if的使用
<c:if> 标签必须要有test属性,当test中的表达式结果为true时,则会执行本体内容;如果为false,则不会执行。例如:${requestScope.username = = 'admin'},如果requestScope.username等admin时,结果为true;若它的内容不等于admin时,则为false。 于 接下来看下列的范例: <c:...原创 2017-11-09 17:13:01 · 7190 阅读 · 1 评论 -
Java基础之Java中label标签的用法(retry:为例)
Java中retry:的用法一、示例代码:public class Main { public static void main(String[] args) throws Exception { retry: for (int i = 0; i < 10; i++) { if (i == 8) { ...原创 2019-05-29 23:17:49 · 10292 阅读 · 2 评论 -
Java基础之Java8中Map的compute的使用
Java基础之Java8中Map的compute的使用一、介绍Java8更新后,Map接口中提供了compute方法。下面我们先看看官方文档的对它的使用说明.如果看完上面的还是不太明白的话,看下面的这个示例。然后再来看这段说明,你就明白的它的意思了。二、使用假如我们现在有一需求,需要统计一个字符串中各个单词出现的频率,然后从中找出频率最高的单词。让我们先来看看jdk8之前的写法。 ...原创 2019-06-10 00:04:20 · 52248 阅读 · 5 评论 -
Java基础之Java8中Map的computeIfPresent的使用
一、介绍首先先来看看JDK8文档对其的方法说明描述。方法的字面意思为:如果存在就进行compute(计算)如果看了上面的文档描述你还不是很懂的话,可以先看下的例子,然后回过头再看上面的说明,你就会明白。二、使用我们还是结合的具体的案例来说明,这样好理解。我们假设有这样一个javaBean对象,其中有id,name,age,hobby四个字段的值。现在我们假设有一个对其新增/修改的接口...原创 2019-07-14 14:40:54 · 27276 阅读 · 4 评论 -
Java基础之Java8中map和flatMap的使用
Java基础之Java8中map和flatMap的使用一、介绍首先,看下map和flatMap的官方文档说明mapflatMap其实单纯的看api说明还是比较抽象,下面我将以几个实战例子来帮助我们理解。然后再回过头来看它的说明,就会有一种恍然大悟的感觉。二、使用map示例字母大小写 public static void main(String[] args)...原创 2019-07-31 23:56:05 · 20044 阅读 · 6 评论 -
Java基础之JDK13新特性理解与使用
JDK13新特性理解与使用350: Dynamic CDS Archives351: ZGC: Uncommit Unused Memory353: Reimplement the Legacy Socket API354: Switch Expressions (Preview)355: Text Blocks (Preview)官方网站: http://openjdk.java...原创 2019-09-25 10:55:39 · 893 阅读 · 0 评论 -
Java基础之JDK13新特性之TextBlock文本块的使用理解
JDK13新特性之TextBlock文本块的使用理解文本块这个特性对我们的帮助的确太大了,点赞!!!之前的写法的中,我们一般使用如下形式拼接较长的字符串。 String sql = " SELECT " + " t.* " + " FROM user t"; String h...原创 2019-09-25 11:00:15 · 1400 阅读 · 0 评论 -
Spring MVC 中重定向和转发
1:知识回顾使用servlet重定向有两种方式,一种是forward,另一种就是redirect。forward是服务器内部重定向,客户端并不知道服务器把你当前请求重定向到哪里去了,地址栏的url与你之前访问的url保持不变。redirect则是客户端重定向,是服务器将你当前请求返回,然后给个状态标示给你,告诉你应该去重新请求另外一个url,具体表现就是地址栏的url变成了新的url。原创 2017-12-15 17:16:29 · 3680 阅读 · 0 评论 -
Java之Object类源码实现
一、引言我们知道Java是单继承语言,所有类的最终父节点都是Object(java.lang.Object)类,这一点与C++不同,因为C++既可以单继承也可是多继承。上述的所有类包括数组这些等。二、分析1.结构与源码public class Object { private static native void registerNatives(); static {...原创 2018-11-09 17:59:51 · 565 阅读 · 1 评论 -
Java9新特性初体验
Java9模块系统的必要性可定制的JRE:更小的运行时镜像更确定的模块 依赖关系:避免JAR HELL问题与OSGI的比较模块的定义模块是一个命名的、自我描述和数据的集合模块的代码被组织成多个包,每个包中java类和接口模块的数据包括资源文件和其他静态信息模块声明文件模块的声明文件:mudule-info.java新的关键词:module模块的名称的规...原创 2018-07-31 14:15:20 · 399 阅读 · 0 评论 -
分布式唯一ID
一,题记所有的业务系统,都有生成ID的需求,如订单id,商品id,文章ID等。这个ID会是数据库中的唯一主键,在它上面会建立聚集索引!ID生成的核心需求有两点:全局唯一趋势有序二,为什么要全局唯一?著名的例子就是身份证号码,身份证号码确实是对人唯一的,然而一个人是可以办理多个身份证的,例如你身份证丢了,又重新补办了转载 2018-01-11 17:47:27 · 671 阅读 · 0 评论 -
StringUtils.join(array,sep)学习
commons.lang3.StringUtilsStringUtils.join(Object array[],String separator) 将数组以符号或其他字符串为间隔组成新的字符串Object array[] 需要转换的数组。separator组成新串的间隔符号,如 "," "|"1 private static final String[] st原创 2018-01-15 15:06:55 · 568 阅读 · 0 评论 -
java与设计模式(二)回调函数
回调函数,第一次见是在Java编程思想中,以及后来的观察者模式也应用了回调函数的思想。但是一直都没有重视,终于在一次面试的时候吃亏了,越来越理解为什么很多人说Java编程思想这本书要一遍遍的看,吃透! 首先在网络上搜索很多文章介绍什么是回调函数,看的云里雾里的。后来自己一步步分解终于理解了,记录如下。 从维基百科上面摘抄定义:(看完本篇文章再来理解这个定义)转载 2018-01-04 17:58:43 · 513 阅读 · 0 评论 -
tomcat内部探析
俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂,但是 Tomcat 非常的模块化,找到了 Tomcat最核心的模块,问题才可以游刃而解,了解了Tomcat的整体架构对以后深入了解Tomcat来说至关重要!一、Tomcat顶层架构先上一张Tomcat的顶层结构图(图A),如下:T转载 2018-01-11 16:53:13 · 262 阅读 · 0 评论 -
dateutils和dateformatutils的使用的心得(1)
public static void main(String[] args) throws Exception{ //(DateFormatUtils.format(date,string) 和simpledateformat类中的format()方法 System.out.println(DateFormatUtils.format(new Date(), "yyyy-MM-dd hh:原创 2017-12-27 11:47:29 · 1826 阅读 · 0 评论 -
java中泛型-泛型方法(2)
泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test{}。这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类型,例如:Test t = new Test();,指明泛型T的类型为Object。 但是Java中的泛型方法就比较复杂了。 泛型类,是在实例化类的时候指明泛型的具体类型;泛型方原创 2017-12-03 21:33:03 · 324 阅读 · 0 评论 -
JAVA中的泛型(1)
转自:https://www.cnblogs.com/lwbqqyumidi/p/3837629.html一. 泛型概念的提出(为什么需要泛型)?首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(String[] args) { 4 Lis转载 2017-12-03 18:30:59 · 212 阅读 · 0 评论 -
Java静态代理
代理模式:就是为目标对象提供一种代理已达到控制对真是对象访问的目的. 在一些情况下,一些客户不能直接或不想直接访问目标对象,而代理对象则起到在这两者之间的的"中介人"作用.=========================================================================================角色描述:①代原创 2017-09-18 21:53:29 · 472 阅读 · 0 评论 -
StringUtils下几种判空方法
1.public static boolean isEmpty(final CharSequence cs) { return cs == null || cs.length() == 0; }判断的主要根据字符串长度和NULL.原创 2017-08-30 10:58:11 · 11452 阅读 · 0 评论 -
对Java中递归的再思考
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... (斐波那契数列)采用递归来做,代码如下:package com.gyoomi.test;/** * 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89原创 2017-09-06 17:13:09 · 623 阅读 · 1 评论 -
Java中Enum类的使用
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。 下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容:1. 原始的接口定义常量2. 语法(定义)3. 遍历、switch 等常用操作4. enum 对象的常用方法介绍5. 给 enum 自定义属性和方法6原创 2018-01-17 13:56:01 · 481 阅读 · 0 评论 -
Java中this的作用
1.this调用本类中的属性,也就是类中的成员变量; 2.this调用本类中的其他方法; 3.this调用本类中的其他构造方法,调用时要放在构造方法的首行。原创 2018-01-10 20:32:14 · 279 阅读 · 0 评论 -
Gson的使用
转自:http://blog.csdn.net/IO_Field/article/details/51204517项目中,解析json数据时,一直使用Gson解析。对于Gson的基本使用没有什么问题,但并没有Gson更深入的认识。json作为主流的数据传递方式,深入理解Gson的用法还是很有必要的,那么系统的了解下Gson到底可以做什么。1.Gson的对象 Gso转载 2018-01-10 21:38:39 · 315 阅读 · 0 评论