0%

Java 编程基础(二):赋值

1. 整数类型 byte、short、int、long 分别占几个字节、取值范围是怎样的

  • byteshortintlong 分别占 1、2、4、8 个字节。
  • 取值范围如下表所示:
类型名 取值范围 类型名 取值范围
byte -2^7 ~ 2^7-1 int -2^31 ~ 2^31-1
short -2^15 ~ 2^15-1 long -2^63 ~ 2^63-1

2. 给 long 类型赋值时有什么需要注意的

  • long 类型赋值时,如果常量超出了 int 的表示范围 -2^31 ~ 2^31 -1,需要在常量后面加大写字母 L(或小写字母),这是因为整型常量默认是 int 类型的。
  • 很多开发规范里为防止字母 L 的小写和数字 1 混淆建议使用大写

3. 浮点类型 float、double 分别占几个字节?赋值时有什么需要注意的

  • 分别占 4、8个字节。
  • 因为浮点类型默认是 double 类型,所以对于 float 类型需要在后面加大写字母 F 或小写字母 f

4. 布尔类型 boolean 占用几个字节

  • 在《Java 虚拟机规范》一书中的描述:“虽然定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持。在 Java 虚拟机中没有任何供 boolean 值专用的字节码指令,Java 语言表达式所操作的 boolean 值,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替,而 boolean 数组将会被编码成 Java 虚拟机的 byte 数组,每个 boolean 元素占 8 位”。
  • 也就是说 JVM 规范指出 boolean 当做 int 处理,也就是 4 字节,boolean 数组当做 byte 数组处理。这样我们可以得出 boolean 类型单独使用是 4 个字节,在数组中是确定的 1 个字节

5. 那虚拟机为什么要用 int 来代替 boolean 呢,为什么不用 byte 或 short,这样不是更节省内存空间吗

  • 使用 int 的原因是,对于当下 32 位的处理器 CPU 来说,一次处理数据是 32 位(这里不是指的是 32/64位系统,而是指 CPU 硬件层面)。
  • 32 位 CPU 使用 4 个字节是最为节省的,哪怕你是 1 个 bit 它也是占用 4 个字节。因为 CPU 寻址系统只能 32 位 32 位地寻址,具有高效存取的特点。

6. 字符类型占用几个字节,怎么表示

  • 字符类型 char 表示一个字符,这个字符可以是中文字符,也可以是英文字符。占用两个字节,赋值时把常量字符用单引号括起来。
  • 大部分的常用字符用一个 char 就可以表示,但有的特殊字符用一个 char 表示不了,It has a minimum value of ‘\u0000’ (or 0) and a maximum value of ‘\uffff’ (or 65,535 inclusive)(跟 Android 中的 65535 是巧合吗)

7. 基本数据类型和对象类型的默认值都是怎样的

数据类型 默认值 数据类型 默认值
byte 0 float 0.0f
short 0 double 0.0d
int 0 char ‘\u0000’
long 0L boolean false
String null Object null

8. 局部变量的默认赋值是怎样的

  • Local variables are slightly different; the compiler never assigns a default value to an uninitialized local variable. If you cannot initialize your local variable where it is declared, make sure to assign it a value before you attempt to use it. Accessing an uninitialized local variable will result in a compile-time error(试图访问一个没有初始化的局部变量会导致编译时错误).
  • Official Reference: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

9. 新建一个基本类型的数组有哪几种写法

  1. int[] arr = {1, 2, 3}; 简单粗暴派(毛)
  2. int[] arr = new int[] {1, 2, 3}; 左右逢源派(周)
  3. int[] arr = new int[3]; arr[0] = 1; arr[1] = 2; arr[2] = 3; 学院教条派(王)

10. int[] arr = new int[3] {1, 2, 3} 这种写法是否正确,为什么

  • 不正确
  • 可以这么理解,因为初始值已经决定了长度,再指定一个长度,如果不一致,计算机将无所适从。说白了,JVM还没有那么智能,也许将来新版本会改进这个问题。

11. 数组在内存中的表示形式是怎样的

  • 数组在内存中两块内存空间
  • 一块用于存储数组内容本身,另一块用于存储数组第一个元素内容在内存中的实际位置

12. 为什么数组要用两块空间,不能只用一块吗

  • 为了方便不同长度的数组之间的赋值
  • 也就是说,给数组变量赋值和给数组中元素赋值是两回事,给数组中元素赋值是改变数组内容,给数组变量赋值则会让变量在内存中指向一个不同的位置。
-------------------- 本文结束感谢您的阅读 --------------------