在日常开发中,分页遍历迭代的场景可以说非常普遍了,比如扫表,每次捞100条数据,然后遍历这100条数据,依次执行某个业务逻辑;这100条执行完毕之后,再加载下一百条数据,直到扫描完毕
那么要实现上面这种分页迭代遍历的场景,我们可以怎么做呢
本文将介绍两种使用姿势
- 常规的使用方法
- 借助Iterator的使用姿势
在日常开发中,分页遍历迭代的场景可以说非常普遍了,比如扫表,每次捞100条数据,然后遍历这100条数据,依次执行某个业务逻辑;这100条执行完毕之后,再加载下一百条数据,直到扫描完毕
那么要实现上面这种分页迭代遍历的场景,我们可以怎么做呢
本文将介绍两种使用姿势
当一个对象没有重写hascode
方法时,它返回的内存地址,当覆盖之后,我们有什么办法获取对象的内存地址么?
System.identityHashCode()
输出内存地址字符串分割,属于比较常见的case了,在实际开发中,相信很多小伙伴会借助common-lang
工具包中的StringUtils
来实现,使用姿势也很简单
1 | String[] ans = StringUtils.split("a,b,c", ","); |
一般来讲上面这种使用方式没有问题,但是当分隔符前后为空时,需要特别注意,可能会和你预期的返回不一致
实际业务开发中偶尔会遇到判断一个对象是否为基本数据类型,除了我们自老老实实的自己写之外,也可以借助Spring的 BeanUtils 工具类来实现
1 | // Java基本数据类型及包装类型判断 |
android studio 4.1 禁用一个插件之后重启,结果发现应用都起不来了,直接报了一个错误
这就有点尴尬了,禁用一个插件直接导致不可用,那么能想到的解决办法就是将这个插件启用,问题是应用都跪了,怎么启用插件呢?
借助LinkedHashMap飞速实现一个LRU算法的缓存
1 | import java.util.LinkedHashMap; |
Android开发过程中,偶遇一个webview与android通信的问题,提示A WebView method was called on thread 'JavaBridge'. All webview methods must be called...
这个问题发现Android 9以上会出现,解决方法是@JavascriptInterface
注解的方法必须指定在UI线程执行,将原来方法里的代码放入run里面执行即可
如下
1 | // 注意这个activity就是webview所在的activity |
Android可以通过webview来内嵌html页面,从而实现灵活的信息展示;最近客串android开发中,正好遇到了这样的一个小场景,所以简单的记录一下Android与html之间的交互,包含以下内容
最近客串了一把android开发,对接谷歌的内购商品,这个过程真的是特别不顺,各种意想不到的坑,一踩一个;
接下来记录一下谷歌内购服务的完整配置流程,以及在最后测试阶段可能遇到的各种问题;在正式开始之前,请确定以下基本条件
Java 实现一个AES/ECB/PKCS5Padding
加解密算法工具类
前面有两篇铺垫博文,在博文《200303-如何优雅的在java中统计代码块耗时》,其最后提到了根据利用java agent来统计方法耗时
博文《200316-IDEA + maven零基础构建java agent项目中则详细描述了搭建一个java agent开发测试项目的全过程
本篇博文将进入java agent的实战,手把手教你如何是实现一个统计方法耗时的java agent
Java Agent(java探针)虽说在jdk1.5之后就有了,但是对于绝大多数的业务开发javaer来说,这个东西还是比较神奇和陌生的;虽说在实际的业务开发中,很少会涉及到agent开发,但是每个java开发都用过,比如使用idea写了个HelloWorld.java,并运行一下, 仔细看控制台输出
本篇将作为Java Agent的入门篇,手把手教你开发一个统计方法耗时的Java Agent
SpringBoot指定com.mysql.cj.jdbc.Driver
来操作mysql数据库时,发现时区有八个小时的差距,主要原因在于需要在url中指定时区信息,否则会有这个问题
在我们的实际开发中,多多少少会遇到统计一段代码片段的耗时的情况,我们一般的写法如下
1 | long start = System.currentTimeMillis(); |
上面的写法没有什么毛病,但是看起来就不太美观了,那么有没有什么更优雅的写法呢?
HashMap对于javer而言,可以说是非常非常熟悉的一个容器类了,可以说99.99%的java开发者都用过它,那么你知道怎样创建一个HashMap是最优雅的方式呢?
在日常的编码中,有时会遇到,需要重复获取InputStream中的数据的需求;然后一般的流,只能读一次,读完就没了;那么如果我希望有一个可以重复读取数据的InputStream,可以怎么操作?
平时使用ProtoStuff作为序列化工具,对于一些POJO对象序列化,但是在实际使用中,发现针对BigDecimal对象进行序列化时却出现了问题
下面记录一下这个问题
今天开发过程中,遇到一个鬼畜的问题,在DO的某个成员上添加@Deprecated
注解之后,通过ProtoStuff反序列化得到的DO中,这个成员一直为null;花了不少时间才定位这个问题,特此记录一下
列表排序,我们可以说是用的比较多了,写起来也很溜,继承Comparable
接口,实现compareTo
方法,然后直接使用java.util.List#sort
即可
虽说如此简单,今天却是一脚踩进去,花了不少时间才爬出来,下面复盘一下这个现场
从db中查了一个BigDecimal数据,希望按照四舍五入的方式进行取整,发现直接使用 intValue
不太对,特此记录一下正确姿势
1 | new BigDecimal(4.51).setScale(0, RoundingMode.HALF_EVEN).intValue() |
map的迭代删除,和我们常见的list,set不太一样,不能直接获取Iteraotr对象,提供的删除方法也是单个的,根据key进行删除,如果我们有个需求,将map中满足某些条件的元素删除掉,要怎么做呢?
我们有这么一个场景,给你一个列表,可以动态的新增,但是最终要求列表升序,要求长度小于20,可以怎么做?
这个还不简单,几行代码就可以了
1 | public List<Integer> trimList(List<Integer> list, int add) { |
java应用启动之后,有办法查看jvm参数么?
可以通过jps -v
来实现
1 | jsp -lv |
如阿里的java进程输出如下
1 | 28996 com.aliyun.tianji.cloudmonitor.Application -Djava.compiler=none -XX:-UseGCOverheadLimit -XX:NewRatio=1 -XX:SurvivorRatio=8 -XX:+UseSerialGC -Djava.io.tmpdir=../../tmp -Xms16m -Xmx32m -Djava.library.path=../lib:../../lib -Dwrapper.key=drcJnFxDcXCZH8of -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.disable_console_input=TRUE -Dwrapper.pid=28989 -Dwrapper.version=3.5.27 -Dwrapper.native_library=wrapper -Dwrapper.arch=x86 -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 |
采用fastjson作为项目的json序列化和反序列化工具,遇到一个蛋疼至极的问题, 如Map,key为int,则输出的字符串中,key没有被双引号括起来,导致前端解析失败
作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomcat的底层是怎么支持http服务的呢?大名鼎鼎的Servlet又是什么东西呢,该怎么使用呢?
在初学java时,socket编程是逃不掉的一章;虽然在实际业务项目中,使用这个的可能性基本为0,本篇博文将主要介绍如何使用socket来实现一个简单的http服务器功能,提供常见的get/post请求支持,并再此过程中了解下http协议
之前偶然在一个开源项目中看到下面这种写法,深感惊奇,当时没有记录,后来果不其然就忘掉了这种写法,现在又看到这种写法,特此记录
1 | long price = 1_000_123L; |
如何获取应用中,所有活动的线程?
1 | ThreadGroup group = Thread.currentThread().getThreadGroup(); |
上面是获取当前线程所在的ThreadGroup, 然后将这个分组内的所有线程丢到slackList数组中,实际测试时,数组大小可能是大于实际的线程数的(而且可能性特别大)
通过ThreadGroup,还可以获取上一层的Group, 然后遍历所有的线程
在做 https://github.com/liuyueyi/quick-task
项目时,遇到了一个蛋疼的问题,不知道什么时候加了个Groovy脚本之后,整个项目就编译不过了,特此记录一下
相关博文: jvm调优的工具介绍
小结一下用的几个调优参数,特别是自带的jvisualvm
,比较好用,但是功能丰富完整方面比jprofile要欠缺一点,后面有时间补上jprofile的使用过程
jvm的垃圾回收算法,除了我们熟悉的引用计数判断对象是否活着之外,其他还有那些有意思的东西呢?
总是听到的年轻代年老代又是啥?
传说中的YoungGC(MinorGC) 和 FullGC的时机是什么,又干了些啥?
Update your browser to view this website correctly. Update my browser now