Java生存指南

在工作中从C++转到使用Java有一段时间了。Java语言与C++十分相似,Effective C++中说,C++作为一个语言联邦,其中包含C,Object-Oriented C++,Template C++和STL。而Java的面向对象对比C++的OO和数据容器如List、Set、Map对比C++的STL,这两方面两种语言除去语言本身的一些细节几乎可以无缝转换。

但是本文讨论的不是Java语言层面的内容,之前看了一篇叫做JVM Minimal Survival Guide的文章,将.NET平台与Java平台作对比,里面介绍了JVM的一些概念和Java在各个领域的一些杀手级应用。我也想自上而下地整理一下在Java环境中生存的基础知识,可以看成是那篇文章Basic部分的一些补充。

常识

Java版本

通过以下命令查询Java版本

java -version

你将会得到:

java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)

通常所说的Java8就是java version以1.8开头,以此类推Java7就是1.7开头。

JDK与JRE

JDK全称Java Development Kit,JRE全称Java Runtime Environment。前者包括后者,并且包含Java编译器,调试器以及各种开发需要的工具,还有一些DEMO和库。而JRE是运行Java程序必备的运行时环境,包含了Java虚拟机JVM以及运行时库。

JAVA环境变量

相信很多人在初学Java的时候都为了环境变量而头疼过。Java有3个环境变量,CLASSPATH,PATH和JAVA_HOME。CLASS_PATH是JVM加载类的路径,PATH是Java各种工具javac,javadoc等等的路径,JAVA_HOME是JDK的安装路径。一般像这样配置:

JAVA_HOME=JDK的安装目录
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH

语言

从语言层面上,Java一直以来收到很多人的诟病。包括代码写出来复杂,死板,很多重要的语言特性的缺失,包括函数默认参数,纯OO没有FP的特性(Lambda,高阶函数),运算符重载等,虽然某些特性在Java8中得到了支持,但是对比现代的编程语言仍然像一个步履蹒跚的老者。

可是即使你不喜欢Java语言,你也可以在Java的生态中活得很好。

Scala凭借Spark在Java生态中大放异彩,被称为复杂度超越C++的宇宙最难语言,Groovy语法简洁适用于编写脚本(现在Android开发官方的构建脚本Gradle就是使用Groovy语言),纯函数式编程语言Clojure,以及Android平台的Swift-Kotlin,还有JRuby,Jython这些移植到JVM的语言。这些基于JVM的语言各有所长,让Java这个平台几乎无所不能。更可怕的一点在于,因为都是运行在JVM上的语言,只需要很小的工作量就可以使用Java大量成熟的库,这使得每新出一门语言就可以直接享受各种强大的代码库。这是最近几年崛起的Go,Rust等语言梦寐以求的好处。

字节码

JVM上的语言都是跨平台的,原因就在于这些语言一次编译成JVM字节码,就可以到处运行。这些语言在通过编译器生成.class文件,通常每个.class文件对应一个Java类,这些.class文件可以放到任何安装了JVM的平台下运行。JVM就像一个黑盒,隐藏了不同平台之间的差异,上层看到的就只有编译出.class文件放到JVM上执行而不需要关注更加底层的东西,计算机技术的发展就是不断地增加层次,不断地抽象,底层对上层更加的透明化。

Java的包本质上是将一些相关的文件打包并压缩在一起,根据不同的使用场景有以下几种格式:

JAR

Java Archive File,以ZIP格式为基础,里面包含配置信息META-INF以及一系列.class文件。

WAR

Web Archive File,用于Web方面的包,包含了.class文件,配置信息以及描述网络服务器(如Tomcat)。

EAR

Enterprise Archive File,为J2EE程序创建的JAR文件。

AAR

Android Archive File,用于Android平台的包文件,不仅包含.class文件,还可以包含界面等资源文件。含有AndroidManifest.xml,classes.jar,res,R.txt等文件。

JVM

Java Virtual Machine,用于执行编译生成的.class文件,内存管理,垃圾收集等。关于JVM的话题十分庞大并且深入,这篇文章不做深入探究了。不过想对于Android的DVM(Dalvik Virtual Machine)做一下简单的比较。JVM执行的是.class文件,DVM执行的是dex文件,dex文件是将.class文件整合在一起的,因此运行速度更快,可以使用dex2jar工具将dex文件转换成jar文件。而apk是将dex文件和资源一起打包后的文件,一般一个apk只有一个dex文件,但是由于dex文件65535的方法数限制,现在也出现了多dex的解决方案。apk文件中包含AndroidManifest.xml,classes.dex,res,resources.arsc,META-INF这些文件,从这可以看出确实是包含了dex文件和资源文件。

最后

总结了一下在Java环境下生存的最基础的知识。虽然我也不怎么喜欢Java语言,但是Java平台毕竟诞生了这么多伟大的东西,我的心态也应该从之前的嫌弃和抵触变成积极地拥抱,多学点总是没错的。