Java中的数据类型

Posted by Rorschach on November 25, 2015

数据的存储单位

  • bit : 位

一个位能表示0和1两种状态,是计算机中最小的单位

  • byte:字节

1 byte = 8 bit,计算机中通常使用byte代替bit作为单位

数据类型

  • 基本数据类型

    • 数值型
      • 整型 (byte, short, int, long)
      • 浮点型 (float, double)
    • 字符型 (char)
    • 布尔型 (boolean)
  • 引用数据类型

    • 类 (class)
    • 接口 (interface)
    • 数组 (array)

整数类型

  • Java中整型有4种,表示的长度固定,不受具体的操作系统的影响,保证其跨平台能力

  • Java中整数的表现形式

    • 十进制
    • 八进制 要求以数字0开头(不是字母O), 如:0456

    • 十六进制 要求以0x开头(不是字母O), 如:0x123
  • Java中默认的整数类型为int

    • 因此需要注意的是,声明long类型的变量时必须在后面加上一个l或者L
    • 下面代码会报错,实际上是类型转换的问题,因为128默认是int类型,这里需要强制类型转换
      byte b = 128;
      
  • Java中整型的表示范围

类型 占用存储空间 表示范围 
byte 1byte -2^7~2^7-1
short 2byte -2^15~2^15-1
int 4byte -2^31~2^31-1
long 8byte -2^63~2^63-1

浮点数类型

  • Java中浮点型型有2种,表示的长度固定,不受具体的操作系统的影响,保证其跨平台能力

  • Java中浮点类型的表示方式:

    • 十进制计数 如3.1415926

    • 科学计数法 如3.14e2, -3.14E-2

  • Java中默认的浮点数类型为double
    • 因此需要注意的是,声明float类型的变量时必须在后面加上一个f或者F
    • 下列写法是否不同?
      float f1 = 12.345f;  
      float f2 = (float)12.345;
      
  • Java中浮点型的表示范围
类型 占用存储空间 表示范围 
float 4byte -3.403E38~3.403E38
double 8byte -1.798E308~1.798E308

字符类型

  • 字符类型是用’‘单引号扩起来的单个字符,如 char c = 'A'
  • Java中的字符编码采用unicode编码,每个字符占2个字节,因此可以使用16进制编码表示,如 char c = '\0041'('A')
  • Java中允许使用转义字符’'将后面的字符转换成其他含义,如‘\n’表示换行

布尔类型

  • boolean的取值只能为true或者false
  • boolean类型不可以和其他类型的数据进行转换,即不可以用非零的值表示`true。
    下面这种写法在C语言中可行,而在Java中并不成立:
while(1){  
//do sth  
}

数据类型之间的转换

  • boolean类型不能和其他数据类型进行转换

  • 整数型、浮点型和字符型之间转换遵循下面的标准

    • 容量小的自动向容量大的类型转换(向上转型,自动完成)
    • 容量小于int类型的数据类型在计算时先转换成int类型
    • 多种类型进行计算时,先转换成最大的类型再计算
    • 大容量的数据类型向小容量的数据类型转换时,必须使用强制类型转换
      此过程可能导致精度丢失或者数据溢出问题(向下转型,不安全)

大数

一旦数据的大小足够大,达到超过Java提供的基本数据类型的容纳范围,我们就需要使用大数来满足我们的需求

  • BigInteger(超过了long能够容纳的大小)
    BigInteger bi = new BigInteger("234234345985690468464098708709450974957856756756755...");
    
  • BigDecimal(超过了double能够容纳的大小)
    BigDecimal bd = new BigDecimal("3.1415926893485893658762893764982345353453453453453...");
    

基本数据类型对应的包装类

对应关系如图
基本数据类型 对应的包装类
byte Byte
short Short
char Character
int Integer
long Long
float Float
double Double
为什么要有包装类?
  • 体现纯粹的面向对象的思想
  • 包装类是一个类,有字段和方法,比基本的数据类型强大
    String num = "100";  
    int value = Integer.parseInt(num);
    
  • JDK1.5之后,系统实现了自动装箱和自动拆箱,方便了基本数据类型和包装类之间的转换
    Integer i1 = new Integer(123);  
    int i2 = Integer.intValue();        
    
一些注意点
  • 在计算机中数的存储和运算使用补码的形式

  • 基本数据类型和对应的包装类的区别

一个是数据类型,一个是类

  • 基本数据类型和对应的包装类的初始默认值不同

如int类型默认值为0,而Integer的默认值为null,因此使用Integer可以区分是否赋值