Skip to content

卷起来🐎🐲💪 -- Java基本数据类型

Posted on:March 23, 2023 at 04:37 PM
Share on

Java 语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。

Table of contents

Open Table of contents

Java 基本类型

@startmindmap
* Java类型
** 基本数据类型
*** 数值型
**** 整数类型(byte,short,int,long)
**** 浮点类型(float,double)
*** 字符型(char)
*** 布尔型(boolean)
** 引用数据类型
*** 类(class)
*** 接口(interface)
*** 数组([])
@endmindmap

Java基本类型

Java 基本数据类型

类型类型名称关键字占用内存取值范围作为成员变量的默认值
整型字节型byte1 字节-128(-2^7)~127(2^7-1)0
短整型short2 字节-2^15~(2^15-1)0
整型int4 字节-2^31~(2^31-1)0
长整型long8 字节-2^63~(2^63-1)0L
浮点型单精度浮点型float4 字节-3.403E38~3.403E380.0F
双精度浮点型double8 字节-1.798E308~1.798E3080.0D
字符型字符型char2 字节表示一个字符’a’..‘\u0000’
布尔型布尔型boolean1 字节true 或 falsefalse

卷起来 🐎🐲💪

直接写 12 的话,Java 会把它当成 int,直接写 3.4 的话,Java 会把它当成 double。

float f = 3.4; //错误
short s = 1;
s = s +1;//错误
s+=1;// 正确,相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。

Java 数据类型转换

如果要进行 “窄化转换” 的操作,也就是说将 “ 能容纳更多细节信息的类型 ” 往 “ 不能容纳那么多细节的类型 ” 转换,那么就会面临信息丢失的危险。此时编译器不会帮助我们自动转换,而是需要我们自己承担风险!必须由我们进行显式地类型转换!(就例如:float 类型转 int 类型)

然而如果我们进行扩展转换,就像 int 转为 float,那么就没必要进行显式地类型转换。

JVM 在运行时创建了一个缓存区域,并创建了一个 Integer 数组。这个数组存储了-128 至 127 的值。

如果 Integer 的值在-128 至 127 之间,则是去缓存里面去获取。因此上面的 i 和 j 指向的是同一个内存地址。因为 128 超过了这个缓存区域,因此第二次赋值的时候重新开辟了两个内存地址。第三次因为使用了 new 关键字,在 java 中,new 关键字会开辟新的内存空间。因此第三次赋值是开辟了新的内存空间,此时即使 i 与 j 都是 127,但是内存地址不同。

这个是 Integer 的性质,跟 int 没关系,注意看 int 类型的 i==j 在值都为 128 时,输出的是 true。

对于对象引用类型:==比较的是对象的内存地址。

对于基本数据类型:==比较的是值。如果整型字面量的值在-128 到 127 之间,那么自动装箱时不会 new 新的 Integer 对象,而是直接引用常量池中的 Integer 对象,


Integer a = new Integer(12);
Integer b = new Integer(12);
Integer i = 12; // 将12自动装箱成Integer类型
int o = 12;
System.out.println(a==b);
System.out.println(a==o); //true a自动拆箱成int类型再和o比较
System.out.println(a==i);
Integer c = 129;
Integer d = 129;
System.out.println(c == d);
Integer e = 127;
Integer f = 127;
System.out.println(e==f);

输出结果是:

false
true
false
false
true

Math.round(11.5) 等于多少?Math.round(-11.5) 等于多少?

Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。

switch 是否能作用在 byte 上,是否能作用在 long 上,是否 能作用在 String 上?

在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版 本中都是不可的。

为什么?

网上有很多的答案,个人比较倾向于认为 case 的可能性到 int 就差不多了,因为有 2^31 的范围了。

Share on