二进制
计算机内存能够寻址的最小单位就是字节。一个字节有八个位,每个位只能是0或者1。
int i =0;占四个字节,三十二个位。
基本数据类型
基本数据类型int a = 1;那么内存中存储的就是数字1;String b = "你好";,因为String是引用数据类型,所以b是一个地址,它指向存储的数据。
- byte 一个比特有八个位,最大能存储127,最大值继续加一会发生溢出,变为-128.
- short
- int
- long
- float 浮点数比较相等时,两个数相减,小于一个非常小的数,就认为他们相等。
- double
dounle 0.23d - char
- boolean
- void
类型转换与类型提升
将低精度转换为高精度的不会出现问题,如
byte a = 100;
int b = a;
因为int可以容纳四个四个字节,反过来如果int的大小超过byte的容量,就会出现问题。
两个不同类型的数做运算需要将其转换为精度最高的类型:
public static void main(String[] args){
Syetem.out.println(devide(3, 2));
}
public float devide(int a int b){
double result = 1.0 * a /b;
// double result = (double)a /b;
return result;
}
char c = '1';
// 等价于 char c = 49;
c = char(c + 1)
System.out.println(c); // 2 50对应ascii表中的2.
基本类型对应的装箱类型。
比如byte对应的Byte,float对应的Float,int对应的Integer等等。
为什么要存在装箱数据类型呢?可以提供额外的方法,比如Integer.parseInt()。
基本数据类型是怎么变成对象的呢?就是自动装拆箱。
int i = 100;
Integer integer = i; // 会自动帮我们new Integer(i)
add(integer);
public static int add(int i){
return new Integer(123); // 会自动转换
}
List<Integer> list = new ArrayList<>(); // 容器类不接受原生数据类型
list.add(1); // 自动装箱
因为装箱类型的值可以为null,所以这时进行转换会抛出空指针异常。
原生类型与引用类型带来的坑
int a = 1;
int b = 1;
if(a==b){
System.out.println("a == b"); // 被执行
}
Integer c = 1;
Integer d = 1;
if(c==d){
System.out.println("c == d"); // 未被执行
}
当比较a和b时,比较的是他们的值,因为他们是基本数据类型。比较c和d时比较的则是地址值,而不是其中的值。要比较引用数据类型需使用equals, c.equals(d)。
需要注意的是,如果两个Integer的数字比较小,此时比较它们会发现他们相等。这是因为Integer所占空间比int要大,当声明很多小对象时,会给内存造成压力,java在内部对Integer做了一个缓存,缓存127到-128之间的数字。
Integer a = 1;
a = a + 1;
Integer类型的数据是不可变的,上面第二行代码新建了一个对象,改变了a的指向。原来内存中的数据并没有发生改变。