JDK包含的基本组件包括:
javac – 编译器,将源程序转成字节码
jar – 打包工具,将相关的类文件打包成一个文件
javadoc – 文档生成器,从源码注释中提取文档
jdb – debugger,查错工具
java – 运行编译后的java程序(class后缀的)
appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
Jconsole: Java进行系统调试和监控的工具
JRE - java程序运行环境1。静态方法的特点:
直接调用类名+方法名,不需要实例化类对象。
如:
HelloP();
非静态方法则必须实例化一个对象出来,再通过对象调用该方法如:
Hello
hello=new
Hello(参数1~n);
helloP();
2。程序被打包成jar文件后(相当于exe文件),给外界唯一的接口就是main方法。使用者双击jar文件,其实就是让虚拟机执行main方法。
3。main方法不是提供给程序员的,而是提供给虚拟机和使用客户的。
一个软件你没法让客户知道你内部的详情,当然客户也就没办法知道怎么去实例化对象,更不知道实例化对象时需要输入什么参数了。所以只能采用静态方法。有的,是不是隐藏扩展名了。
javac:Java编译器,将Java源代码换成字节代
java:Java解释器,直接从类文件执行Java应用程序代码
appletviewer(小程序浏览器):一种执行HTML文件上的Java小程序类的Java浏览器
javadoc:根据Java源代码及其说明语句生成的HTML文档
jdb:Java调试器,可以逐行地执行程序、设置断点和检查变量
javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件
Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义
jar:多用途的存档及压缩工具,是个java应用程序,可将多个文件合并为单个JAR归档文件。
htmlConverter——命令转换工具。
native2ascii——将含有不是Unicode或Latinl字符的的文件转换为Unicode编码字符的文件。
serialver——返回serialverUID。语法:serialver [show] 命令选项show是用来显示一个简单的界面。输入完整的类名按Enter键或"显示"按钮,可显示serialverUID。
补充详细:
javacexe
用法:javac <选项> <源文件>
可能的选项包括:
-g 生成所有调试信息
-g:none 生成无调试信息
-g:{lines,vars,source} 生成只有部分调试信息
-O 优化;可能妨碍调试或者增大类文件
-nowarn 生成无警告
-verbose 输出关于编译器正在做的信息
-deprecation 输出使用了不鼓励使用的API的源程序位置
-classpath <路径> 指定用户类文件的位置
-sourcepath <路径> 指定输入源文件的位置
-bootclasspath <路径> 覆盖自举类文件的位置
-extdirs <目录(多个)> 覆盖安装的扩展类的位置
-d <目录> 指定输出类文件的位置
-encoding <编码> 指定源文件中所用的字符集编码
-target <版本> 生成指定虚拟机版本的类文件
-help Print a synopsis of standard options
appletviewerexe
用法:appletviewer url
其中, 包括:
-debug 在 Java 调试器中启动 applet 小程序查看器
-encoding 指定由 HTML 文件使用的字符编码
-J 向 Java 解释器传递参数
-J 选项不是标准选项,如有更改,不另行通知。
====================
jarexe
用法:jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名
选项:
-c 创建新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或所有的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用ZIP压缩格式
-M 不产生所有项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classesjar' 的存档文件中:
jar cvf classesjar Fooclass Barclass
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
文件存档到一个名为 'classesjar' 的存档文件中:
jar cvfm classesjar mymanifest -C foo/
javadocexe
用法:javadoc [options] [packagenames] [sourcefiles] [classnames] [@files]
-overview 读取 HTML 格式的概述文档
-public 仅显示 public 类和成员
-protected 显示 protected/public 类和成员(缺省)
-package 显示 package/protected/public 类和成员
-private 显示所有类和成员
-help 显示命令行选项
-doclet 通过候选 doclet 生成输出
-docletpath 指定 doclet 类文件的查找位置
-sourcepath 指定源文件的查找位置
-classpath 指定用户类文件的查找位置
-exclude Specify a list of packages to exclude
-subpackages Specify subpackages to recursively load
-breakiterator Compute 1st sentence with BreakIterator
-bootclasspath 覆盖自举类加载器所加载的类文件的位置
-source Provide source compatibility with specified release
-extdirs 覆盖已安装的扩展的位置
-verbose 有关 Javadoc 所做工作的输出信息
-locale 所用的 Locale,例如 en_US 或 en_US_WIN
-encoding 源文件编码名称
-J 将 直接传给运行时系统
由标准 doclet 提供:
-d 输出文件的目标目录
-use 创建类和包的用法页
-version 包含 @version 段
-author 包含 @author 段
-docfilessubdirs Recursively copy doc-file subdirectories
-splitindex 将索引分为每个字母对应一个文件
-windowtitle 文档的浏览器窗口标题
-doctitle 包含包索引页(首页)的标题
-header 包含每一页的页眉文本
-footer 包含每一页的页脚文本
-bottom 包含每一页的页底文本
-link Create links to javadoc output at
-linkoffline Link to docs at using package list at
-excludedocfilessubdir : Exclude any doc-files subdirectories with given name
-group : Group specified packages together in overview page
-nocomment Supress description and tags, generate only declarations
-nodeprecated 不包含 @deprecated 信息
-noqualifier :: Exclude the list of qualifiers from the output
-nosince Do not include @since information
-nodeprecatedlist 不生成不鼓励使用的列表
-notree 不生成类层次
-noindex 不生成索引
-nohelp 不生成帮助链接
-nonavbar 不生成导航栏
-quiet Do not display status messages to screen
-serialwarn Generate warning about @serial tag
-tag :: Specify single argument custom tags
-taglet The fully qualified name of Taglet to register
-tagletpath The path to Taglets
-charset Charset for cross-platform viewing of generated documentation
-helpfile 包含帮助链接功能链接到目标的文件
-linksource Generate source in HTML
-stylesheetfile 改变所生成文档的样式的文件
-docencoding 输出编码名称
javahexe
用法:javah [options]
其中 [options] 包括:
-help 打印该帮助信息
-classpath 类的加载路径
-bootclasspath 自举类的加载路径
-d 输出目录
-o 输出文件(仅能使用 -d 或 -o 之一)
-jni 生成 JNI 风格的头文件(缺省)
-old 生成 JDK10 风格的头文件
-stubs 生成 stubs 文件
-version 打印版本信息
-verbose 输出有关本命令所做工作的信息
-force 始终写输出文件
指定 时必须使用全名(例如 javalangObject)。
javawexe
====================
HtmlConverterexe
用法:HtmlConverter [-option1 value1 [-option2 value2 []]] [-simulate] [filespecs]
其中,选项包括:
-source: 获取源文件的路径。 缺省值:
-dest: 写入已转换文件的路径。 缺省值:
-backup: 写备份文件的路径。 缺省值: _BAK
-f: 强制覆写备份文件。
-subdirs: 应处理子目录中的文件。
-template: 模板文件的路径。 如果不确定,请使用缺省值。
-log: 写日志的路径。 如果没有提供,则不会写入任何日志。
-progress: 转换时显示进度。 缺省值: true
-simulate: 在没有进行转换时显示特定于转换的信息。
-latest: 使用最新的 JRE 支持发行版 mimetype。
-gui: 显示转换程序的图形用户界面。
filespecs: 用空格分开的文件说明列表。 缺省值: "html htm" (需要引号)
orbdexe
用法:orbd <选项>
其中,<选项> 包括:
-port 启动 ORBD 的激活端口,缺省值为 1049 (可选)
-defaultdb ORBD 文件的目录,缺省值为 "/orbdb" (可选)
-serverid ORBD 的服务器标识符,缺省值为 1 (可选)
-ORBInitialPort 初始端口(必需)
-ORBInitialHost 初始主机名称(必需)
====================
policytoolexe
用法:policytool [选项]
[-file ] 规则文件位置
====================
rmicexe
用法:rmic <选项> <类名>
其中 <选项> 包括:
-keep 不删除中间生成的源文件
-keepgenerated (同 "-keep")
-v11 为 11 stub 协议版本创建 stubs/skeleton
-vcompat (缺省)创建与 11 和
12 stub 协议版本兼容的 stubs/skeleton
-v12 仅为 12 stub 协议版本创建 stubs
-iiop 为 IIOP 创建 stubs。当使用该选项时,<选项>还应包括:
-always 总创建 stubs (即使在它们同时出现时〕
-alwaysgenerate (同 "-always")
-nolocalstubs 不创建为同一进程优化的 stubs
-idl 创建 IDL。当使用该选项时,<选项>还应包括:
-noValueMethods 不生成值类型的方法
-always 总创建 IDL (即使在它们同时出现时〕
-alwaysgenerate (同 "-always")
-g 一般调试信息
-depend 以递归方式重编译过期的文件
-nowarn 不警告
-nowrite 不将编译过的类写入到文件系统
-verbose 输出有关编译器所做工作的信息
-classpath 指定输入源和类文件的查找位置
-sourcepath 指定用户源文件的查找位置
-bootclasspath 覆盖自举类文件的位置
-extdirs 覆盖安装扩展类的位置
-d 指定所生成类文件的放置位置
-J 将参数传给 java 解释程序
====================
rmidexe
用法:rmid
其中, 包括:
-port 指定供 rmid 使用的端口
-log 指定 rmid 将日志写入的目录
-stop 停止当前的 rmid 调用(对指定端口)
-C 向每个子进程传递参数(激活组)
-J 向 java 解释程序传递参数
====================
rmiregistryexe
用法: rmiregistry <选项> <端口>
其中,<选项> 包括:
-J 将参数传递到 java 解释程序
====================
serialverexe
用法:serialver [-classpath classpath] [-show] [classname]
====================
servertoolexe
欢迎使用 Java IDL 服务器工具
请在提示处输入命令
servertool > help
可用命令:
-------------------
register - 注册一个可激活的服务器
unregister - 取消服务器注册
getserverid - 返回应用程序名称的服务器标识符
list - 列举所有已注册服务器
listappnames - 列举当前定义的应用程序名称
listactive - 列举当前活动的服务器
locate - 将已注册服务器定位在特定类型的端口
locateperorb - 为已注册服务器的特定对象请求代理程序定位端口。
orblist - 对象请求代理程序 (orb) 名称及其映射列表
shutdown - 关闭一个已注册服务器
startup - 启动一个已注册服务器
help - 取得帮助
quit - 退出此工具
====================
rmic
功能说明:
rmic 为远程对象生成 stub 和 skeleton。
语法:
rmic [ options ] package-qualified-class-name(s)
补充说明:
rmic 编译器根据编译后的 Java 类(含有远程对象实现)名,为远程对象生成 stub 和 skeleton(远程对象是指实现 javarmiRemote 接口的对象)。在 rmic 命令中所给的类必须是经 javac 命令成功编译且是完全包限定的类。
命令选项
-classpath[路径] 指定 rmic 用于查询类的路径。如果设置了该选项,它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
-d[目录] 指定类层次的根目录。此选项可用来指定 stub 和 skeleton 文件的目标目录。
-depend 使编译器考虑重新编译从其它类引用的类。 一般来说,它只重新编译从源代码引用的遗漏或过期的类。
-g 允许生成调试表格。调试表格含有行号和局部变量的有关信息,即 Java 调试工具所使用的信息。缺省情况下,只生成行号。
-J 与 -D 选项联用,它将紧跟其后的选项( -J 与 -D 之间无空格)传给 java 解释器。
-keepgenerated 为 stub 和 skeleton 文件保留所生成的 java 源文件,并将这些源文件写到与 class 文件相同的目录中,如果要指定目录,则使用 -d 选项。
-nowarn 关闭警告。如果使用该选项,则编译器不输出任何警告信息。
-show 显示 rmic 编译器的 GUI(图形用户界面)。输入一个或多个包限定类名(以空格分隔),并按回车键或“显示”按钮,创建 stub 和 skeleton。
-vcompat (缺省值)创建与 JDK 11 和 12 stub 协议版本都兼容的 stub 和 skeleton。
-verbose 使编译器和链接器输出关于正在编译哪些类和正在加载哪些类文件的信息。
-v11 创建 JDK 11 stub 协议版本的 stub 和 skeleton。
-v12 只创建 JDK 12 stub 协议版本的 stub。
=================================
rmid
功能说明:
rmid 启动激活系统守护进程,以便能够在 Java 虚拟机上注册和激活对象。
语法:
rmid [-port port] [-log dir]
补充说明:
rmid 工具启动激活系统守护进程。必须先启动激活系统守护进程,才能向激活系统注册可被激活的对象或在 Java 虚拟机上激活可被激活的对象。
命令选项
-C<某些命令行选项> 指定一个选项,在创建每个 rmid 的子守护进程(激活组)时,该选项以命令行参数的形式传给该子守护进程。
-log[目录] 指定目录的名称,激活系统守护进程在该目录中写入其数据库及相关信息。缺省状态下,将在执行 rmid 命令的目录中创建一个 log 目录。
-port[端口] 指定 rmid 的注册服务程序所使用的端口。激活系统守护进程将 ActivationSystem 与该注册服务程序中的名称javarmiactivationActivationSystem 捆绑在一起。
-stop 停止 -port 选项所指定端口上的当前 rmid 调用。若未指定端口,则将停止在端口 1098 上运行的 rmid。
=============================
rmiregistry
功能说明:
rmiregistry 命令可在当前主机的指定端口上启动远程对象注册服务程序。
语法:
rmiregistry [port]
补充说明:
rmiregistry 命令在当前主机的指定 port 上创建并启动远程对象注册服务程序。如果省略 port,则注册服务程序将在 1099 端口上启动。rmiregistry 命令不产生任何输出而且一般在后台运行。远程对象注册服务程序是自举命名服务。主机上的 RMI 服务器将利用它将远程对象绑定到名字上。客户机即可查询远程对象并进行远程方法调用。注册服务程序一般用于定位应用程序需调用其方法的第一个远程对象。该对象反过来对各应用程序提供相应的支持,用于查找其它对象。javarmiregistryLocateRegistry 类的方法可用于在某台主机或主机和端口上获取注册服务程序 *** 作。javarmiNaming 类的基于 URL 的方法将对注册服务程序进行 *** 作,并可用于查询远程对象、将简单(字符串)名称绑定到远程对象、将新名称重新绑定到远程对象(覆盖旧绑定)、取消远程对象的绑定以及列出绑定在注册服务程序上的 URL。
=============================
serialver
功能说明:
serialver 命令返回 serialVersionUID。
语法:
serialver [ 命令选项 ]
补充说明:
serialver 以适于复制到演变类的形式返回一个或多个类的 serialVersionUID。不带参数调用时,它输出用法行。
命令选项
-show 显示一个简单的用户界面。输入完整的类名并按回车键或“显示”按钮可显示 serialVersionUID。
================================
jarsigner
功能说明:
为 Java 归档 (JAR) 文件产生签名,并校验已签名的 JAR 文件的签名。
语法:
jarsigner [ 命令选项 ] jar-file alias
jarsigner -verify [ 命令选项 ] jar-file
补充说明:
jarsigner 工具用于两个目的:
1:为 Java 归档 (JAR) 文件签名
2:校验已签名的 JAR 文件的签名和完整性
命令选项
-keystore[url] 指定密钥仓库的 URL。缺省值是用户的宿主目录中的 keystore 文件,它由系统属性“userhome”决定。
-storetype[storetype] 指定要被实例化的密钥仓库类型。默认的密钥仓库类型是安全属性文件中 "keystoretype" 属性值所指定的那个类型,由 javasecurityKeyStore 中的静态方法 getDefaultType 返回。
-storepass[password] 指定访问密钥仓库所需的口令。这仅在签名(不是校验)JAR 文件时需要。在这种情况下,如果命令行中没有提供 -storepass 选项,用户将被提示输入口令。
-keypass[password] 指定用于保护密钥仓库项(由命令行中指定的别名标出)的私钥的口令。使用 jarsigner 为 JAR 文件签名时需要该口令。如果命令行中没有提供口令,且所需的口令与密钥仓库的口令不同,则将提示用户输入它。
-sigfile[file] 指定用于生成 SF 和 DSA 文件的基本文件名。
-signedjar[file] 指定用于已签名的 JAR 文件的名称。
-verify 如果它出现在命令行中,则指定的 JAR 文件将被校验,而不是签名。如果校验成功,将显示“jar verified”。如果试图校验未签名的 JAR 文件,或校验被不支持的算法(例如未安装 RSA 提供者时使用的 RSA)签名的 JAR 文件,则将有如下显示: "jar is unsigned (signatures missing or not parsable)" 。
-certs 如果它与 -verify 和 -verbose 选项一起出现在命令行中,则输出将包括 JAR 文件的每个签名人的证书信息。
-verbose 如果它出现在命令行中,则代表“verbose”模式,它使 jarsigner 在 JAR 签名或校验过程中输出额外信息。
-internalsf 过去,JAR 文件被签名时产生的 DSA(签名块)文件包含一个同时产生的 SF 文件(签名文件)的完整编码副本。这种做法已被更改。为了减小输出 JAR 文件的整个大小,缺省情况下 DSA 文件不再包含 SF 文件的副本。但是如果 -internalsf 出现在命令行中,将采用旧的做法。该选项主要在测试时有用;实际上不应使用它,因为这样将消除有用的优化。
-sectionsonly 如果它出现在命令行中,则 JAR 文件被签名时生成的 SF 文件(签名文件)将不包括含有整个清单文件的散列的头。它仅包含 与 JAR 中每个单独的源文件相关的信息和散列。该选项主要在测试时有用;实际上不应使用它,因为这样将消除有用的优化。
-J[javaoption] 将指定的 javaoption 串直接传递到 Java 解释器。((jarsigner 实际上是解释器的一个 “wrapper”)。JDK:
Java Develpment Kit java 开发工具
JRE:
Java Runtime Environment java运行时环境
JVM:
java Virtual Machine java 虚拟机
jdk 是给开发人员使用的, jre和jvm是给普通用户使用,如果只是运行Java程序,安装JRE即可
JDK:
是java开发工具包,是Sun公司针对java开发人员的产品,jdk中包含jre,在jdk的安装目录下有一个jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里面就是jvm,lib中是java工作需要的类库,而java和lib合起来就称为jre
JDK(Java Development Kit) 是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rtjar)。
第一、JDK是开发包,是应用程序的开发环境;API应用程序编程接口,是一些预先定义的类,我们写程序的时候可以直接使用这些已经被打包的类来做具体的应用。我们在搭建jdk的时候就包含了API
第二、你这个问题问的有点问题,java分为javase、javaee、javame用的jdk是同一个,开发javaEE,javame的时候还需要导入其他外来包
第三、我用的是myEclipse2013,jdk是用的17做个示范,window—>preference —> java —> 点击Installed JREs —>右边点击Add —>双击Standard VM —>点击Directory—>找到你JDK安装目录—>finish 选择你导入的JDK就行了
个人的理解,希望能帮到你
路遥
来自专栏走进 JDK
往期目录:
走进 JDK 之 Integer
走进 JDK 之 Long
走进 JDK 之 Float
走进 JDK 之 Byte
今天来说说 Boolean 。Boolean 类源码也很简单,在阅读源码的过程中思考这么一个问题,Boolean 类型在内存中是如何表示的?或者说,JVM 是如何看待 Boolean 的?
类声明
public final class Boolean implements javaioSerializable,Comparable<Boolean>
Boolean 也是不可变类,事实上所有的基本类型包装类、String、BigDecimal、BigInteger 也都是不可变类。
字段
private final boolean value;
public static final Boolean TRUE = new Boolean(true); // true
public static final Boolean FALSE = new Boolean(false); // false
public static final Class<Boolean> TYPE = (Class<Boolean>) ClassgetPrimitiveClass("boolean");
private static final long serialVersionUID = -3665804199014368530L;
Boolean 类型只有两个值,true 和 false。
构造函数
public Boolean(boolean value) {
thisvalue = value;
}
public Boolean(String s) {
this(parseBoolean(s));
}
还是熟悉的味道,第一个构造函数直接传入 boolean。第二个构造函数调用 parseBoolean() 方法,将 String 转换为布尔值。
方法
parseBoolean()
public static boolean parseBoolean(String s) {
return ((s != null) && sequalsIgnoreCase("true"));
}
直接和字符串 true 进行比较。
valueOf()
public static Boolean valueOf(boolean b) {
return (b TRUE : FALSE);
}
public static Boolean valueOf(String s) {
return parseBoolean(s) TRUE : FALSE;
}
toString()
public static String toString(boolean b) {
return b "true" : "false";
}
hashcode()
public static int hashCode(boolean value) {
return value 1231 : 1237;
}
源代码都很简单,没有什么好说的。回过头看看文章开头的问题:
JVM 是怎么处理 Boolean 的 ?
源码中貌似也看不出什么端倪,我们得从 Java 虚拟机的角度出发了。先看下面这个例子:
public class BooleanTest {
public void test() {
boolean flag = true;
if (flag)
Systemoutprintln("This is true");
}
}
test 方法显然会打印字符串 This is true。站在人脑的思维很容易理解,下面我们站在 JVM 的思维来看一下该如何理解。
首先虚拟机肯定是不认识这些源代码的,它认识的只有字节码,也就是 class 文件。关于 Class 文件的具体格式,可以看看我之前的一篇文章,Class 文件格式详解。我在这就直接使用 javap 命令来查看字节码了。
javac BooleanTestjava
javap -v BooleanTestclass
略去常量池等部分内容,我把 test() 方法的字节码内容拿过来:
public void test();
descriptor: ()V // 方法描述符
flags: ACC_PUBLIC // 访问标志
Code:
stack=2, locals=2, args_size=1
0: iconst_1
1: istore_1
2: iload_1
3: ifeq 14
6: getstatic #2 // Field java/lang/Systemout:Ljava/io/PrintStream;
9: ldc #3 // String This is true
11: invokevirtual #4 // Method java/io/PrintStreamprintln:(Ljava/lang/String;)V
14: return
下面逐行分析 Code 部分:
stack=2, locals=2, args_size=1
stack 表示 *** 作数栈深度的最大值,这里是 2 。locals 表示局部变量表所需的存储空间,这里需要两个 slot。还记得什么是 slot 吗,slot 是虚拟机为局部变量分配内存所使用的最小单位。args_size 是参数个数,这里 test() 方法并没有参数,但是每个方法都有一个参数是指向当前引用自身的。
0: iconst_1 // 将一个 int 常量 1 加载到 *** 作数栈
1: istore_1 // 将数值 1 从 *** 作数栈存储到局部变量表
2: iload_1 // 将局部变量 1 加载到 *** 作数栈
这三行字节码其实就是 boolean flag = true; 。JVM 并没有为 boolean 专门做处理,而是直接当做 int处理。true 就是 1, false 就是 0 。
3: ifeq 14
14: return
ifeq 是控制转移指令,这里的含义是如果 *** 作数栈上的值是 0, 就跳转到 14 处,14 处指令为 return,则结束方法执行。这里已经将 1 加载到 *** 作数栈,所以会继续往下执行,省略号中的字节码内容就是打印语言 Systemoutprintln("This is true");,不作过多分析。
根据 Java 虚拟机规范,JVM 并没有任何供 boolean 值专用的字节码指令,Java 源代码中使用到的布尔值,在编译之后都使用 int 值来代替。JVM 也支持 boolean 类型数组,其一般经过编译会被当作 byte 数组进行处理。所以,在字节码中,你是看不到 boolean 的。
还记得上篇文章 走进 JDK 之 Byte 中提出的一个问题,作为方法内部局部变量的 byte 在内存中占几个字节 ? 结论是:
基本类型作为方法局部变量是存储在栈帧上的,除了 long 和 double 占两个 Slot,其他都占用一个 Slot
在 JVM 的眼里,并没有这么多的数据类型,对于 boolean 、byte 、short 和 char,在编译期都会变成 int 类型,JVM 也仅仅只对 int 提供了最完整的 *** 作码,其他类型数据的 *** 作,都是使用相应的 int 类型的 *** 作码进行 *** 作。那么 JVM 为什么没有给每种数据类型都配置完整的 *** 作码呢?这还得从 *** 作码的长度说起。
Java 虚拟机 *** 作码的长度为一个字节,所以字节码指令集的 *** 作码总数不可能超过 256 条。这么做是为了尽可能获得短小精干的字节码,字节码指令流都是单字节对齐的,数据量小,传输效率高。当然,这么做的代价就是你不可能设计出一套面向所有数据类型都完整的 *** 作码。如果每一种数据结构都要得到 Java 虚拟机的字节码指令的支持的话,那么指令的数量将远远超过 256 种。所以,这也给指令集的设计带来了麻烦。最终权衡的结果就是,只对有限的类型提供完整的指令。大部分的指令都没有支持 byte 、 char 和 short,boolean 则更惨,没有任何指令支持 boolean 类型。对于这些不支持的指令类型,一律使用 int 的相关指令代替。
总结
Boolean 其实是被当做 int 值处理的,true 表示 1,false 表示 0
JVM 为 int 提供了完善的 *** 作码,boolean 、byte 、char 、short 在编译期或运行期都会被转换为 int,使用 int 类型的字节码指令进行处理
文章同步更新于微信公众号: 秉心说 , 专注 Java 、 Android 原创知识分享,LeetCode 题解,欢迎关注!
![]
展开阅读全文
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)