范型语法糖
Jackson
里面有个转字符串为Java
对象的方法,传进去的是
大概像下面这样
1 | public void batchInsertRecords(String str){ |
关于隐式转换,不只是 Java 的拆装箱,范型,在其他地方也有,如SQL
,select * from t where id = 1
;select * from t where id ='1'
完全是两个东西,一个会不走索引,一个走一级(主键)索引
在JDK1.5
前,范型(Java这里只是个语法糖/伪范型,每个编程语言都会去实现它)没有出来的时候,像ArrayList
里面提供的就是Object
返回。没有return (E) elementData[index]
这里面是没有E的,是Object
类型。能够在编译时检查类型错误,利用get()
方法取出的对象也不再是Objec
t引用,编译器可以认识此类型。
1 | public static void main(String[] args) { |
很多人可能说,我怎么可会犯这种错误。当你指定类型不明确时,进行强转,就会出现这个问题。
HBase Scan PageFilter
HBase Scan PageFilter 设置的返回数据量和实际返回的数据量不同。低版本的 Scan 没有 setLimit 方法。
1 | Scan scan = new Scan(); |
坑
上面很大可能返回大于 200 条记录。
原因
HBase 里 Filter 状态全部都是 Region 内有效的,也就是说,Scan 一旦从一个 Region 切换到另一个 Region,之前那个 Filter 的内部状态就无效了,新 Region 内用的其实是一个全新的 Filter。具体到这个问题,就是 PageFilter 内部计数器从一个 Region 切换到另一个 Region,计数器已经被清 0。——来自《HBase 原理与实践》
解决方法
- 手动利用 List#subList 方法,在返回结果前截取对应 pageSize 条数记录。
- 升级 HBase 客户端代码,使用 scan#setLimit 方法。