参考:Java基本数据类型和Integer缓存机制 – 之石先生 – 博客园
文章链接: Java中的基本数据类型 | 学习笔记
目录
switch语句能否作用在byte上,能否作用在long上,能否作用在string上?
字符型常量和字符串常量的区别?
比较:
- 字符常量用单引号,而字符串是双引号;
- 字符常量相当于一个整形值(ASCII值,可以参加表达式运算),而字符串常量代表一个地址值(该字符在内存中的地址);
- 字符常量在Java中占两个字节;而字符串常量占若干个字节大小(没有大小规定);
8种数据类型
整型(byte、short、int、long)
虽然byte、short、int、long 数据类型都是表示整数的,但是它们的取值范围可不一样。
byte 的取值范围:-128~127(-2的7次方到2的7次方-1)
short 的取值范围:-32768~32767(-2的15次方到2的15次方-1)
int 的取值范围:-2147483648~2147483647(-2的31次方到2的31次方-1)
long 的取值范围:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)
浮点型(float、double)
float 和 double 都是表示浮点型的数据类型,它们之间的区别在于精确度的不同。
float(单精度浮点型)取值范围:3.402823e+38~1.401298e-45(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方)
double(双精度浮点型)取值范围:1.797693e+308~4.9000000e-324(同上)
double 类型比float 类型存储范围更大,精度更高。
通常的浮点型数据在不声明的情况下都是double型的,如果要表示一个数据时float 型的,可以在数据后面加上 “F” 。浮点型的数据是不能完全精确的,有时候在计算时可能出现小数点最后几位出现浮动,这时正常的。
字面值赋值
在使用字面值对整数赋值的过程中,可以将int 赋值给byte short char int,只要不超出范围。这个过程中的类型转换时自动完成的,但是如果你试图将long literal赋给byte,即使没有超出范围,也必须进行强制类型转换。例如 byte b = 10L;是错的,要进行强制转换。
十进制转成十六进制: Integer.toHexString(int i)
十进制转成八进制 Integer.toOctalString(int i)
十进制转成二进制 Integer.toBinaryString(int i)十六进制转成十进制 Integer.valueOf(“FFFF”,16).toString()
八进制转成十进制 Integer.valueOf(“876”,8).toString()
二进制转十进制 Integer.valueOf(“0101”,2).toString()
例子:
public static void main(String[] args) {
byte a = 1;
short b = 18;
short c = 128;// 1000 0000 -256+128 = -128
short d = 200; //1100 1000 减一取反 1100 0111 -- > 0011 1000 8+16+32 = 56
// -128+(200-127) -256+200 = -56
short e = 257;// 1 0000 0001 -256+257 = 1
// System.out.println("200的二进制: "+ Integer.toBinaryString(200) );
// System.out.println(Integer.valueOf("01001000",2));
a = (byte) b;
System.out.println("a = " + a);
a = (byte) c;
System.out.println("a = " + a);
a = (byte) d;
System.out.println("a = " + a);
a = (byte) e;
System.out.println("a = " + a);
}
(byte) 156 等于多少:
156;二进制表示为:1001 1100,进行强制转换为byte后,因为byte是有符号的,取值范围为:-128-127;1001 1100是一byte数的补码,我们将它转为原码,即减一后再取反,但符号位不能变,得到:1110 0100,这个数也就是-100了。
byte的最小值是-128,最大值是127,就好像一杯水的容量是有限的,当你杯子的水装满了,自然也就会溢出,127就好像是杯子最上面的那一层水,你只要加上一滴,就会溢出,流到杯子底部,而杯子的最底部就是-128。按照这种逻辑,你的156,也就是有28流到了底部,最底部是-128,被28覆盖了28,所以最后自然也就是-100了。
Integer 的缓存机制
Integer 缓存是 Java 5 中引入的一个有助于节省内存、提高性能的特性。
Integer的缓存机制: Integer是对小数据(-128~127)是有缓存的,再jvm初始化的时候,数据-128~127之间的数字便被缓存到了本地内存中,如果初始化-128~127之间的数字,会直接从内存中取出,不需要新建一个对象.
首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为。
public class testIntegerCache {
public static void main(String[] args) {
System.out.println("---int---");
int a = 127, b = 127;
System.out.println(a == b); //true
a = 128;
b = 128;
System.out.println(a == b); //true
System.out.println("---Integer---");
Integer aa = 127, bb = 127;
System.out.println(aa == bb); //true
aa = 128;
bb = 128;
System.out.println(aa == bb); //false
System.out.println(aa.equals(bb)); //true
}
}
其他缓存的对象
Java基本数据类型和Integer缓存机制 – 之石先生 – 博客园
这种缓存行为不仅适用于Integer对象。我们针对所有整数类型的类都有类似的缓存机制。
有 ByteCache 用于缓存 Byte 对象
有 ShortCache 用于缓存 Short 对象
有 LongCache 用于缓存 Long 对象
有 CharacterCache 用于缓存 Character 对象
Byte,Short,Long 有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行。
public void test2(){
short s1 = 1;
s1 = (short) (s1 + 1);// 没有 (short) 编译报错
s1 += 2;
System.out.println(s1);
}
答:对于short s1=1;s1=s1+1来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型转换错误。
对于short s1=1;s1+=1来说 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
是否存在 x>x+1?为什么?
这就是临界值,当x=最大值 时; 再加1(根据二进制运算+1)就超过了它的临界值,刚好会是它最小值。
举个例子吧,byte 8位, -128 ~ 127
127 二进制: 0111 1111
1 二进制 : 0000 0001
相加结果: 1000 0000
byte 8位 有符号, 1000 0000 刚好 为 -128
switch语句能否作用在byte上,能否作用在long上,能否作用在string上?
byte的存储范围小于int,可以向int类型进行隐式转换,所以switch可以作用在byte上
long的存储范围大于int,不能向int进行隐式转换,只能强制转换,所以switch不可以作用在long上
string在1.7版本之前不可以,1.7版本之后switch就可以作用在string上了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92850.html