Java的基本数据类型

  • 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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。