# 第二节 基础数据类型
一、JAVA中一共有八种基本数据类型,他们分别是:
byte、short、int、long、float、double、char、boolean
类型 | 型别 | 字节 | 取值范围 |
---|---|---|---|
byte | 整型 | 1byte | -27 ~ 27 -1 |
short | 整型 | 2byte | -215 ~ 215-1 |
int | 整型 | 4byte | -231 ~ 231-1 |
long | 整型 | 8byte | -263 ~ 263 -1 |
float | 浮点型 | 4byte | 3.402823e+38 ~ 1.401298e-45(232) |
double | 浮点型 | 8byte | 1.797693e+308~ 4.9000000e-324(264) |
char | 文本型 | 2byte | 0~216-1 |
boolean | 布尔型 | 1byte | true/false |
byte a;
short b;
char c;
int d;
long e;
a = a+a;//错误,a + a的类型为int,因为在计算时,byte类型的a变量被自动提升为int类型
a = 'A';//正确,'A'是字符字面量,是一个常量,值为65,在byte范围内
a = 12;//正确,可能会问,12这个字面量在java中是int类型,但是 a 是byte类型,为什么不报错呢,因为,编译器知道12在byte范围内,所以自动转为(short)12,但如果赋值的是a = 200,那就错误了,因为编译器知道200是超出byte范围的(在编译的时候,编译器只知道常量的值,知道它是否超出范围,编译器不知道变量的值,所以无法判断一个变量是否超出范围,因为变量的值是在运行的时候确定的)
a = Byte.MAX_VALUE +1;//报错
b = Short.MAX_VALUE +1;//报错
c = Char.MAX_VALUE +1;//报错
//上述三行报错原因是因为,byte,short,char三个类型参与计算时首先会提升为int类型,但在C语言当中(char和short类型)参与计算时不会被提升,所以在C语言中值为 -1
d = Integer.MAX_VALUE +1;//值为-1
e = Long.MAX_VALUE +1;//值为-1L
//因为int和long类型不存在提升,所以会出现-1或-1L
。。。。
技术点
一、整数数据Java程序中有3种表现形式,分别为十进制、八进制、十六进制
- 十进制不能以0(零)开头,0自身除外
- 八进制必须以0(零)开头
- 十六进制必须以0X或0x开头
二、long和float
- 变量申明为long时要在后面加L或l,变量为float型时要加F或f
三、移位运算(一些算法中会用到,提高效率:ArrayList扩容时就用到了位运算)
- 移位运算适用的数据类型有byte、short、int和long
- 一个数左移(<<)n位就是讲这个数乘以2的n次方;一个数右移n位就是讲这个数除以2的n次方
二 拆箱装箱(包装类型)
写的比较好的博客
不太常见但是很有用的知识点
我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。
因此,后面一条语句也应该是false 。
这就是它有趣的地方了。如果你看去看 Integer.Java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。
所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——
Integer c = 100;
的时候,它实际上在内部做的是:
Integer i = Integer.valueOf(100);
现在,如果我们去看valueOf()方法,我们可以看到:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
如果值的范围在-128到127之间,它就从高速缓存返回实例。
。。。。