Java基本数据类型知识点总结

导读:本篇文章讲解 Java基本数据类型知识点总结,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

参考:Java基本数据类型和Integer缓存机制 – 之石先生 – 博客园

文章链接: Java中的基本数据类型 | 学习笔记

目录

字符型常量和字符串常量的区别?

8种数据类型

整型(byte、short、int、long)

浮点型(float、double)

字面值赋值

例子:

 (byte) 156 等于多少:

Integer 的缓存机制

 其他缓存的对象

是否存在 x>x+1?为什么?

switch语句能否作用在byte上,能否作用在long上,能否作用在string上?


字符型常量和字符串常量的区别?

比较:

  1. 字符常量用单引号,而字符串是双引号;
  2. 字符常量相当于一个整形值(ASCII值,可以参加表达式运算),而字符串常量代表一个地址值(该字符在内存中的地址);
  3. 字符常量在Java中占两个字节;而字符串常量占若干个字节大小(没有大小规定);

8种数据类型

Java基本数据类型知识点总结

整型(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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!