谈谈Java基础数据类型
来源:互联网 发布:知乎删除答案 编辑:程序博客网 时间:2024/06/05 21:07
Java的基本数据类型
JVM本地对应的类型
typedef unsigned char jboolean;typedef signed char jbyte;typedef short jshort;typedef int jint;typedef long long jlong;或typedef __int64 jlong;typedef double jdouble;typedef float jfloat;typedef unsigned short jchar;
java的boolean在jvm中对应unsigned char类型(0为false而非0为true);byte对应signed char类型;short对应short类型;int对应int类型;long对应long long或者_int64类型;double对应double类型;float对应float类型;char对应unsigned short类型。
编译器生成bytecode的类型
compiler将java编译为class,而class文件除了结构信息和元数据等,还包含了bytecode,这其实就是虚拟机的指令,好比物理机的机器指令。举个例子,
public int getInt(){ int a = 100; return a; }
生成该方法的bytecode为
bipush 100istore_1iload_1ireturn
bipush 100
将100以byte型推进operand stack中,istore_1
将operand stack顶int型数值存入第二个局部变量,iload_1
将第二个int型局部变量推进operand stack,ireturn
返回int。
对于一些toy jvm会简单地直接用C/C++处理指令,但对于工业级的openjdk中的Hotspot则会继续生成汇编指令执行。
从上面的情况可以看到java的int型编译成bytecode后可能会变成byte型来表示,这个主要取决于java的int型数值的大小,编译器会在编译期间判断大小从而生成对应的指令,比如小于128时则为bipush
,大于138且小于32768时则为sipush
,它表示以short型表示,而大于32768的则都是用ldc+常量池来表示。
执行时的类型
在指令执行时JVM并不需要指明类型,因为指令已经包含了类型信息,但由于bytecode指令只用1个字节来表示,所以指令数量需要控制,并不是每种基础数据类型都有对应的操作指令,比如iload
lload
fload
dload
对应int
long
float
and
double
。类似还有ireturn
lreturn
freturn
dreturn
。
所以执行引擎只要根据不同的指令做不同的类型处理即可。
Java调本地
如果某个java对象调用了native方法,此本地方法由编译器编译后access flags 会生成ACC_NATIVE
标识,执行引擎执行bytecode时,根据java-jvm类型的映射也可能会涉及到类型处理。
====广告时间,可直接跳过====
公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。
为什么写《Tomcat内核设计剖析》
=========================
欢迎关注:
- 谈谈Java基础数据类型
- 【Java基础】Java数据类型
- Java基础--基础数据类型及封装数据类型
- java 基础数据类型
- Java基础数据类型
- Java基础 - 数据类型
- java基础数据类型
- java基础--数据类型
- java 基础数据类型
- JAVA-基础数据类型转换
- JAVA基础数据类型
- Java基础:数据类型
- java基础语法--数据类型
- Java 基础数据类型
- Java基础 数据类型
- MongoDB 基础java数据类型
- java byte 数据类型(基础)
- java基础数据类型分析
- spring boot项目打包成war并在tomcat上运行的步骤
- 运用递归查找对象下的所有子物体
- unit6-nfs
- java多线程之线程死锁
- Spring Boot 普通类调用Bean对象的一种方式
- 谈谈Java基础数据类型
- GRPC 初体验
- java好书推荐
- AutoCompleteTextView-------android 高级控件(自动补全文本框)
- iOS中几种数据持久化方案:数据,我要永远地记住你!
- SpringMVC 使用JSR-303进行校验
- 赫夫曼编码
- spring学习笔记
- Vim:打造Linux程序员的编辑利器(ctags+cscope+taglist+code_complete)