美文网首页
Java的基本数据类型

Java的基本数据类型

作者: lbcBoy | 来源:发表于2020-05-12 22:47 被阅读0次
    • 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 码。
      
    image.png

    相关文章

      网友评论

          本文标题:Java的基本数据类型

          本文链接:https://www.haomeiwen.com/subject/uyxwnhtx.html