-
java一共8种基本的数据类型
-
4种整形(byte/short/int/long)
-
2种浮点(float/double)
-
1种字符类型(char)
-
1种布尔类型(boolean)
byte:8 位,用于表示最小数据单位,如文件中数据,-128~127 short:16 位,很少用,-32768 ~ 32767 int:32 位、最常用,-2^31-1~2^31 (21 亿) long:64 位、次常用 float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。 double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾 char:16位,它是无符号的,表示的是UTF-16编码集,是整数类型。 boolean:true和false
-
问题1:float和double的区别
float : 单精度浮点数 double : 双精度浮点数 两者的主要区别如下: 01.在内存中占有的字节数不同 单精度浮点数在机内存占4个字节 双精度浮点数在机内存占8个字节 02.有效数字位数不同 单精度浮点数有效数字8位 双精度浮点数有效数字16位 03.数值取值范围 单精度浮点数的表示范围:-3.40E+38~3.40E+38 双精度浮点数的表示范围:-1.79E+308~-1.79E+308 04.在程序中处理速度不同 一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快 如果不声明,默认小数为double类型,所以如果要用float的话,必须进行强转 例如:float a=1.3; 会编译报错,正确的写法 float a = (float)1.3;或者float a = 1.3f;(f或F都可以不区分大小写) 注意:float是8位有效数字,第7位数字将会四舍五入 面试题: 1.java中3*0.1==0.3将会返回什么?true还是false? false,因为浮点数不能完全精确的表示出来,一般会损失精度。 2.java中float f = 3.4;是否正确? 不正确,3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型会造成精度损失, 因此需要强制类型转换float f = (float)3.4;或者写成 float f = 3.4f;才可以。
-
问题2:boolean占用的空间是多少?
在《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。 在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值, 在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组, 每个元素boolean元素占8位”。 也就是说JVM规范指出 #boolean当做int处理,也就是4字节,boolean数组当做byte数组处理# #这样我们可以得出boolean类型占了单独使用是4个字节,在数组中是确定的1个字节。# 拓展:那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。 使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面), 32 位 CPU 使用 4 个字节是最为节省的,哪怕你是 1 个 bit 他也是占用 4 个字节。 因为 CPU 寻址系统只能 32 位 32 位地寻址,具有高效存取的特点。
-
问题3:数据类型的转换
1).自动(隐式)类型转换:从小类型到大类型,不需要强制转换符,不会有精度损失 2).强制类型转换:从大类型到小类型,需要强制转换符实现强制转换,会有精度损失 强制转换符:(需要转换成的类型)变量 3) 精度小于int的数值运算的时候都回被自动转换为int后进行计算 a、所有的byte型、short型和char的值将被提升到int型 b、如果一个操作数是long型,计算结果就是long型 c、如果一个操作数是float型,计算结果就是float型 d、如果一个操作数是double型,计算结果就是double型 e、如果一个操作数是String型,计算结果就是String型 面试题: short s1 = 1; short s2 = 1; s1= (s1+s2); 错误,s1+s2的计算结果是int类型 必须改成: short s1 = 1; short s2 = 1; s1= (short)(s1+s2); short s1 = 10; s1 = s1 + 4; //错误: 不兼容的类型: 从int转换到short可能会有损失 但是,s1+=4;是正确的,等同于short s2 = (short)(s2 + (short)1);
-
问题4:对编码的理解
常见的编码格式有ASCII、Unicode、UTF-8、UTF-16 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。 ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。 这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。 数字0的ASCII码是48; 字母A的ASCII码是65; 字母a的ASCII码是97; Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。 UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。 UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。 UTF-8 的编码规则很简单,只有二条: 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。 2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。 剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
网友评论