java数据类型


1、基本数据类型:

类型位数占用存储空间最大值最小值默认值其他
byte 8 1字节 127(2^7-1) -128(-2^7) 0 有符号、二进制补码表示
short 16 2字节 32767(2^15-1) -32768(-2^15) 0 有符号、二进制补码表示
int 32 4字节 2^31-1 -2^31 0 有符号、二进制补码表示
long 64 8字节 2^63-1 -2^63 0L(0l) 有符号、二进制补码表示
float 32 4字节 2^128-1 2^(-149) 0.0f 单精度、IEEE754标准
double 64 8字节 2^1024-1 2^(-1074) 0.0d 双精度、IEEE754标准
char 16 2字节 \uffff(65535) \u0000(0) \u0000(0) 单一的、Unicode字符
boolean         false true或false

在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。也就是说JVM规范指出boolean当做int处理,也就是4字节,boolean数组当做byte数组处理,这样我们可以得出boolean类型占了单独使用是4个字节,在数组中是确定的1个字节。

2、封装对象

基本数据类型   封装对象
 byte  Byte
 short  Short
 int  Integer
 long  Long
 float  Float
 double  Double
 char  Character
boolean   Boolean

  Integer i = 100; //自动装箱,编译器执行Integer.valueOf(100)
  int j = i; //自动拆箱,编译器执行i.intValue()

  ###由于自动拆装箱的存在,要注意i为null的情况
  Integer i = null;
  int j = i.intValue();
  ###编译通过,但运行时报错NullPointerException

  Integer i1 =200;
  Integer i2 =200;
  System.out.println("i1==i2: "+(i1==i2));
  Integer i3 =100;
  Integer i4 =100;
  System.out.println("i3==i4: "+(i3==i4));
  ###答案为:false,true

知识点:

1、首先,==和equals()的区别:

==比较的是两个对象的引用是否相同,或者是比较原始数据类型是否相等;
equals()比较的是两个对象的内容是否相同,可以通过重写equals添加自己的比较逻辑。
2、其次,-128~127的Integer值可以从缓存中取得,即Integer类型的常用数字缓存IntegerCache.cache。其他情况要重新创建。  

  public static Integer valueOf(int i) {
  if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
  }

补充:

  • short s1=1; s1=s1+1;编译报错;

    s1=s1+1返回结果是int类型(隐式类型转换),需强转;

    s1=s1+=1无问题;(+=具有强转效果)

  • switch语句不能作用于浮点数类型中;

  • 封装类型+String都是final的,不可被扩展,数字类型的公共父类是Number类;

  public static void main(String[] args) throws Throwable {
    int j=0;
    for(int i=0;i<1000;i++) {
      j=j++;
    }
    System.out.println(j);
  }
  答案为:0;
  解析:从底层来看,j=j++是对局部变量的操作
  1、将局部变量j的值存放到栈顶:0
  2、将局部变量j的值加1,j=1
  3、将栈顶的值j放到局部变量中,j=0

知识点:

1、隐式类型转换(自动类型转换):从存储范围小的类型到存储范围大的类型

byte→short(char)→int→long→float→double,虚拟机自动完成

2、显示类型转换(强制类型转换):从存储范围大的类型到存储范围小的类型

double→float→long→int→short(char)→byte,损失精度

  public static void main(String[] args) {
    int m = 1234;
    byte b = (byte)m;
    System.out.println(b);
  }
  答案为:-46
  解析:整数强制转换为整数时取数字的低位,例如int类型的变量转换为byte类型时,则只取int类型的低8位(也就是最后一个字节)的值。b1的计算方法如下:m的值转换为二进制是10011010010,取该数字低8位的值作为b的值,则b的二进制值是11010010,按照机器数的规定,最高位是符号位,1代表负数,在计算机中负数存储的是补码,则该负数的原码是10101110,该值就是十进制的-46