点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

来源 | https://urlify.cn/iYN3Uj

一、FastJson为何

首先抄录一段来自官网的介绍:FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

FastJson是Java程序员常用到的类库之一,相信点开这个页面的你,也肯定是程序员朋友。正如其名,“快”是其主要卖点。

二、真的很快吗?

没有调研就没有发言权,本着“追求真理”的初心,来一轮简单的测试。对比对象选择应用最广泛的Jackson和Google出品的Gson。测试环境选择JDK 8,AMD 3700X,3200MHZ内存。简化实验,只测试简单对象和复杂对象的String转对象、对象转String,调用1千万次的对比结果如下(时间单位是毫秒):

从测试结果看,FastJson确实是最快的,但仅比Jackson快20%左右,Google的Gson是最慢的,差距较大。读到这里,是不是觉得选择FastJson肯定没错啊!如果面试官问为什么选择FastJson?因为快!这一个理由就可以把他顶回去了。

这里的调查研究并不是很充分,没有对内存占用、大文档的测试。

在现代应用程序中,即使最慢的Gson,也是满足需求的;解析文档速度的快慢,并不能作为选型的唯一标准,可能连主要标准都算不上。对IO优化,并行处理等优化措施,比选用一个更快的库更有效。

三、FastJson并没有那么流行

然而,FastJson并没有那么流行,有一个最直观的数据,那就是在Maven的中的引用量,和Jackson和Gson不在一个数量级,和Jackson强大的家族更没法比。

难道我用了一个假的流行的国产类库?在知乎看到了一篇帖子,讨论为什么外国友人不喜欢FastJson。结论就是FastJson是个代码质量不高的国产类库。完全颠覆了我的认知,因为在我的项目中,是经常使用FastJson的,并没有出现什么Bug,而且这段评论是在2016年写的。

抱着怀疑的态度,打开FastJson的地址,看到大家提的Issues。竟然有1283个未解决的Issues。红框标识出来的,我自己拿去研究下,因为我看到下面还有人提了一样的问题。

测试代码如下:

 try {String time = "1970-01-01 00:00:00";com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();jsonObject.put("time", time);Timestamp timestamp = jsonObject.getTimestamp("time");System.out.println("time:" + timestamp);} catch (Exception e) {e.printStackTrace();}

果然,在采用了最新版本的类库后,如问题描述的,还是有异常。于是就看到了如下的源代码:

if (strVal.endsWith(".000000000")) {strVal = strVal.substring(0, strVal.length() - 10);
} else if (strVal.endsWith(".000000")) {strVal = strVal.substring(0, strVal.length() - 7);
}if (strVal.length() == 29 && strVal.charAt(4) == '-' && strVal.charAt(7) == '-' && strVal.charAt(10) == ' ' && strVal.charAt(13) == ':' && strVal.charAt(16) == ':' && strVal.charAt(19) == '.') {int year = num(strVal.charAt(0), strVal.charAt(1), strVal.charAt(2), strVal.charAt(3));int month = num(strVal.charAt(5), strVal.charAt(6));int day = num(strVal.charAt(8), strVal.charAt(9));int hour = num(strVal.charAt(11), strVal.charAt(12));int minute = num(strVal.charAt(14), strVal.charAt(15));int second = num(strVal.charAt(17), strVal.charAt(18));int nanos = num(strVal.charAt(20), strVal.charAt(21), strVal.charAt(22), strVal.charAt(23), strVal.charAt(24), strVal.charAt(25), strVal.charAt(26), strVal.charAt(27), strVal.charAt(28));return new Timestamp(year - 1900, month - 1, day, hour, minute, second, nanos);
}

这段代码有严重的逻辑错误,这样错误的格式,例如:

“1970-01-01 00:00:00.000000000.000000000”

或者

“1970-01-01 00:00:00.000000000.000000”

也能转换成功,而一些正确的格式,例如:

“1970-01-01 00:00:00”,“1970-01-01 00:00:00.000”

却转换失败。

结合知乎上网友的点评,我本人也觉得FastJson并没有那么优秀,另一些深入的点评,例如ASM,我的理解并不深,就不做测试了。

四、弃坑fastjson

在我负责的项目中,因为SpringBoot相关的框架中,应用了Jackson,本着“最少依赖”的原则,json解析应用了Jackson。但是很多同事的代码中,也用了Gson和Fastjson,当然,是没有严格规范要求的结果。

通过今天的一个小小研究,Jackson的流行,是有着内在的原因的。在我们以后的项目中,主推Jackson,逐渐的淘汰Fastjson。

热门内容:现在的学生太厉害了!一位同学冒着挂科的风险给大家写得 Spring Cloud 入门总结
Spring Boot + Vue.js 实现前后端分离(附源码)一位群友作为后端开发在滴滴和头条分别干了 2 年的经验总结最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・

干掉 FastJson相关推荐

  1. 干掉Navicat:这个IDEA的兄弟真香!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 DataGrip 版是由JetBrains公司推出的数据库管理软件 ...

  2. fastjson 版本_以快标榜的fastjson,快没快多少,倒是漏洞一大堆

    fastjson 说起fastjson 大家一定fast 感觉很快就用完了, 但是带来的效益是什么呢? fastjson到了2020年了还在一直漏洞. 随便百度一搜全是漏洞. [安全通告]Fastjs ...

  3. 配置中心Apollo的设计原理

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:https://urlify.cn/eIBZne 前言 Ap ...

  4. Java如何优雅的实现时间控制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | http://rrd.me/gCQHp 前言:需求是这样 ...

  5. Spring Boot 2.3.0 发布:支持Java14、打包Docker镜像、优雅关机配置...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 冷冷gg 来源 | https://www.oschin ...

  6. 总结:一些关于 CPU 的基本知识

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 来源 | rrd.me/gDkNN CPU是计算机的大脑 ...

  7. 微服务架构下静态数据通用缓存机制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 |  my.oschina.net/u/3971241/bl ...

  8. Mybatis基础知识点:trim标签的使用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:wt_better blog.csdn.net/wt_bet ...

  9. Java集合框架综述,这篇让你吃透!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:平凡希 cnblogs.com/xiaoxi/p/60899 ...

最新文章

  1. python一个月能掌握吗_零基础python入门分析,如何做到一个月学会(深思极恐)...
  2. sql server 2005 中的同义词
  3. 【Bit-Z月报】11月送出182.4万美元活动奖励,真是豪气
  4. leetcode 507. 完美数(Java版)
  5. 为什么我们会拖延? (TED)
  6. java求平均值Scanner_Scanner的一些问题
  7. shell mysql eof_shell EOF
  8. printf打印结构体_工程师:这道题80%初学者都没做对!你确定搞懂结构体内存对齐了?...
  9. 预计2000元起步的骁龙855?魅族游戏手机16T有点猛!
  10. r语言作业:出租车数据基础数据分析、时间处理等
  11. java path环境变量_java配置环境变量
  12. 2021 年高教社杯全国大学生数学建模竞赛题目
  13. Bugku-网站被黑
  14. 记录某学校热水卡安全性研究
  15. CISCO ASA任意文件读取漏洞复现 (CVE-2020-3452)
  16. 矿物质饲料补充剂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. 树形结构的处理——组合模式(二)
  18. java 文件目录是否存在_java中判断文件目录是否存在的方法
  19. python脚本备份linux,linux利用bypy自动备份文件上传百度云
  20. C语言利用结构体查看电话号码

热门文章

  1. Python3 调试技巧 —— 死循环
  2. 8月12笔记-安卓文件扫描
  3. KBMMW 的日志管理器
  4. Oracle基础 动态SQL语句
  5. 【直播】王茂霖:二手车交易价格预测 Baseline 提高(河北高校数据挖掘邀请赛)
  6. Matlab数据的可视化 -- 散点图
  7. Matlab与线性代数 -- 矩阵的加法与减法
  8. 【ACM】杭电OJ 2000
  9. 华为持续引领,开辟5G Massive MIMO绿色新赛道
  10. AI 重塑 IT的 5 种方式