本模块适合 Java后端研发(业务岗、架构岗)
、Java安卓原生研发
等 Java 相关岗位的同学。
Java 中的基本数据类型有哪些?它们的大小和取值范围是多少?
Java 中的基本数据类型有 8 种,分别是byte
、short
、int
、long
、float
、double
、char
、boolean
。
byte
:1 字节,取值范围是-128~127
。short
:2 字节,取值范围是-32768~32767
。int
:4 字节,取值范围是-2147483648~2147483647
。long
:8 字节,取值范围是-9223372036854775808~9223372036854775807
。float
:4 字节,取值范围是-3.4028235E38~3.4028235E38
。double
:8 字节,取值范园是-1.7976931348623157E308~1.7976931348623157E308
。char
:2 字节,取值范围是0~65535
。boolean
:1 字节,取值范围是true
和false
。
首先要理解二进制转十进制的计算方法,这是计算机中最基础的运算。
对于二进制数1101
,我们可以以 i 作为下标,x 作为当前位置上的数,从零开始,从右往左依次递增编号。则每一位可以转换为x*2^i
,然后将所有位的值相加即可得到十进制数,即1*2^3+1*2^2+0*2^1+1*2^0=13
。
接下来我们可以得到记忆各类型位数的最简单的方法:
一个字节就是 8 位,第一位如果是符号位,那么剩下的 7 位就是数值位,所以byte
的取值范围是-2^7~2^7-1
,short
的取值范围是-2^15~2^15-1
,int
的取值范围是-2^31~2^31-1
,long
的取值范围是-2^63~2^63-1
。
对于浮点数,采用IEEE 754
标准,float
是 32 位,包含 1 个符号位、8 个指数位和 23 个尾数位,double
是 64 位,包含 1 个符号位、11 个指数位和 52 个尾数位。
对于char
,采用 Unicode 编码,2 字节,取值范围是 0~2^16-1。
对于boolean
,1 字节,取值范围是true
和false
。
Java 中的基本数据类型和包装类有什么区别?
Java 中的基本数据类型和包装类的区别主要有以下几点:
- 基本数据类型是 Java 语言的一部分,而包装类是 Java 类库中的类。
- 基本数据类型是值类型,包装类是引用类型。
- 基本数据类型在内存中占用的空间较小,包装类在内存中占用的空间较大。
- 基本数据类型的默认值是 0,包装类的默认值是 null。
- 基本数据类型和包装类之间可以自动装箱和拆箱。
什么是自动装箱和拆箱?
自动装箱(Boxing)和拆箱(Unboxing)是 JDK 5 中引入的特性,用于基本数据类型和包装类之间的转换,在此之前只能使用Object
进行装箱和拆箱。(目前C#等语言仍旧使用object
进行装箱和拆箱,因此可以说 Java 的包装类设计解决了自动拆装箱问题)
自动装箱是指将基本数据类型自动转换为包装类,比如int
转换为Integer
,double
转换为Double
,boolean
转换为Boolean
等。
自动拆箱是指将包装类自动转换为基本数据类型,比如Integer
转换为int
,Double
转换为double
,Boolean
转换为boolean
等。
自动装箱和拆箱可以简化代码,提高代码的可读性和可维护性。
判断题:Integer a = 10, b = 10; System.out.println(a == b);
输出为true
。
正确。因为 Java 中对于-128~127
之间的整数,会在常量池当中进行缓存,所以 a 和 b 指向的是同一个对象,超出这个范围就不会进行缓存,会创建新的对象。
讲讲常量池
常量池是 Java 虚拟机中的一块内存区域,用于存放字符串常量、基本数据类型常量和符号引用。常量池分为运行时常量池和类常量池。
运行时常量池是每个类的一部分,用于存放编译期生成的字面量和符号引用。类常量池是每个类的一部分,用于存放编译期生成的字面量和符号引用。
常量池的作用是减少内存的占用,提高性能。常量池中的常量是唯一的,可以减少内存的占用,提高性能。
常量池中的常量是不可变的,一旦创建就不能修改。常量池中的常量是共享的,可以被多个对象共享。
讲讲各基础类型的上下行转换规则
Java 中的基本数据类型之间的转换规则如下:
byte、short、char
之间可以相互转换,转换时会自动提升为int
类型。int
可以自动转换为long、float、double
,但是不能自动转换为byte、short、char
。long
可以自动转换为float、double
,但是不能自动转换为byte、short、char、int
。float
可以自动转换为double
,但是不能自动转换为byte、short、char、int、long
。double
不能自动转换为其他基本数据类型。