Lang 系列 Java vs Go

对 Java 和 Go 这两门编程语言和生态做一些对比,希望能够给大家足够信息进行决策。

Posted by lichao modified on November 29, 2021

Java vs Go的优缺点

语言特性

  • 面向对象:Java是严谨的面向对象编程语言,Go不是。
    • 比如Go不支持抽象类,不支持泛型,在做复杂的领域模型建模时,Go远不如Java方便。
  • 接口:Java中的类必须明确声明实现了某接口,而Go语言中一个类只需要实现接口要求的所有函数,那该类就实现了该接口。在维护较为复杂的大项目时,Java的方式更为方便。
  • 高级特性:Java支持AOP(切面)、运行时字节码改写、运行时反射能力非常强大,这些都是Go所不具备的。Java还支持类的运行时动态加载,Go不支持,所以在实现类似TMF这种业务中台框架时,Java非常方便,可以做到平台包和业务包相互隔离;Go要实现TMF框架,困难很大,虽然公司开发了Lego插件化平台,但是与Java的能力比起来仍然有一定差距,并且性能有较大损耗。
  • 异常:Java的异常机制,是计算机编程语言中的优秀设计,比Go的error设计要友好且方便的多。
  • annotation(注解):Java支持annotation语法,很多优秀的库利用annotation,可以实现非常丰富的特性和强大的类库,使用非常便捷;Go没有对应物。
  • 并发编程:Go的并发编程能力远超Java,尤其是channel、协程的引入,使得多线程编程、异步等场景,Go比Java方便很多。

tmf是多态的高级使用案例,是基于面向对象思想的应用。go使用tmf会存在很多令人不舒服的地方

运行性能

  • 垃圾收集:Java的垃圾收集算法非常完善,例如CMS GC、G1GC、ZGC等,这些垃圾收集的算法先进性远超Go,高并发时的GC停顿性能,Java要优于Go。
  • 运行开销:Java程序运行时,内存占用远高于Go,这是Java不如Go的地方。
  • 运行性能:Java和Go的运行性能相当,差距微弱。长期运行后,由于Java的JIT的优化力度比Go编译器的优化强大,所以运行性能可能反而超过Go。

在计算机技术中,即时编译(英语:just-in-time compilation,缩写为JIT),也称为动态翻译或运行时编译,是一种执行计算机代码的方法,这种方法涉及在程序执行过程中(在运行期)而不是在执行之前进行编译。

生态

  • Java的生态非常完善,如加解密、文件系统、Web服务、全文搜索、规则引擎、脚本引擎、流程引擎、状态机引擎、大数据、机器学习……等各种领域,都有知名度很高、久经考验的高质量库供使用;相比来说,Go的生态远不如Java完善,很多库的质量堪忧。
  • 市场上,Java程序员的丰富程度远超Go,优秀的Java程序员供给比优秀的Go程序员更多。
  • 性能诊断工具:Java的性能诊断工具链非常丰富,如jstack, jmap, Arthas等,Go的性能诊断工具的丰富程度不如Java。