一、数据类型(八种)
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
1、byte(1B)
简介
- 字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数。
- 字节通常简写为“B”,而位通常简写为小写“b”,计算机存储器的大小通常用字节来表示。
范围
- Byte数据类型(字节型)用一个字节(Byte)储存,可区别256个数字,取值范围:0到255。 Byte是从0-255的无符号类型,所以不能表示负数。
换算
- 1KB(Kilobyte,千字节)=1024B= 2^10 B;
- 1MB(Megabyte,兆字节,百万字节)=1024KB= 2^20 B;
- 1GB(Gigabyte,吉字节,十亿字节)=1024MB= 2^30 B;
- 1TB(Terabyte,万亿字节,太字节)=1024GB= 2^40 B;
栗子
byte a = 100;
byte b = -50;
2、short(2B)
简介
- short在C语言中是定义一种整型变量家族的一种。
- short 数据类型是 16 位、有符号的以二进制补码表示的整数。
范围
- short 数据类型是 16 位、有符号的以二进制补码表示的整数,最小值是 -32768(-2^15),最大值是 32767(2^15 - 1)。
- short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
栗子
short a = 100;
short b = -200;
3、char(2B)
简介
- char是表示的是char类型是一个单一的 16 位 Unicode 字符,定义的时候用单引号,只能存储一个字符。
- char 数据类型可以储存任何字符。
范围
- Unicode:采用的是十六进制形式,取值范围是**\u0000(即为0)** - \uffff(即为65535)。
栗子
char x='a';
//内存x中存储的是字符a在Unicode字符集中的排序位置97
//因此允许将上面的语句写成
char x=97;
4、int(4B)
简介
- int 数据类型是32位、有符号的以二进制补码表示的整数。
范围
- int的数据范围为-2147483648 ~ 2147483647 [-2^31 ~2^31-1]。
栗子
int a = 100;
int b = -100;
5、long(8B)
简介
- long 数据类型是 64 位、有符号的以二进制补码表示的整数。
范围
- long的数据范围为-9223372036854775808~-9223372036854775807 [-2^63 ~2^63-1]。
- 默认值为0L。
栗子
long a = 100L;
long b = -100L;
6、float(4B)
简介
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数。
- 浮点数不能用来表示精确的值,如货币。
范围
- 由于尾数的高顺序位始终为 1,因此它不是以数字形式存储的。此表示形式为 float 类型提供了一个大约在 -3.4E+38 ~ 3.4E+38 之间的范围。
- 默认值是 0.0f。
栗子
float f1 = 234.5f;
float f2 = -234.5f;
7、double(8B)
简介
- double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数。
- 浮点数的默认类型为double类型。
- double类型同样不能表示精确的值,如货币。
范围
- 它可以表示十进制的15或16位有效数字,负值取值范围为 -1.7976E+308 到 -4.94065645841246544E-324,正值取值范围为4.94065645841246544E-324 到 1.797693E+308。
- 默认值是 0.0d。
栗子
double d1 = 234.5d;
double d2 = -234.5d;
8、boolean(1B)
简介
- boolean 数据类型 boolean 变量存储为 **8 位(1 个字节)**的数值形式,但只能是 True 或是 False。
- 在java中boolean值只能是true和false,而不能用0和1代替,并且一定要小写。
- 该类型的名称是为了纪念英国数学家George Boole。
范围
- 这种类型只作为一种标志来记录 true/false 情况。
- 默认值是 false。
栗子
boolean one = true;
boolean two = false;
二、装箱和拆箱
1、定义
装箱
-
装箱就是把基础类型封装成一个类。比如把int封装成Integer,这时你就不能把他当成一个数了,而是一个类了,对他的操作就需要用它的方法了。
-
假如码头上有很多货物 这些货物需要装到集装箱才能装船运走(这个可以比作把自定义变量打包),把这个步骤比作装箱。
-
栗子:
Integer i = 100;//装箱
拆箱
- 拆箱就是把类转换成基础类型。比如你算个加法什么的是不能用类的,就得把它转换成基本类型。
- 当卸载货物时候 需要打开集装箱 然后发往各处(这个可以比作 值得调用) 把这个步骤比作拆箱。
- 栗子:
int n = i;//拆箱
2、对应关系
原始类型 | 包装类型 |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
3、代码
常见的面试代码
public void testAutoBox2() {
//1
int a = 100;
Integer b = 100;
System.out.println(a == b);
//2
Integer c = 100;
Integer d = 100;
System.out.println(c == d);
//3
c = 200;
d = 200;
System.out.println(c == d);
}
- 打印结果居然是!!!???【黑人脸.png】
- ture
- ture
- false
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
....
- 这是IntegerCache静态代码块中的一段,默认Integer cache 的下限是**-128**,上限默认127。
- 我们上面当赋值100给Integer时,刚好在这个范围内,所以从cache中取对应的Integer并返回,所以两次返回的是同一个对象,所以==(对象地址)比较是相等的。
- 当赋值200给Integer时,不在cache 的范围内,所以会创建new Integer并返回,对象的地址不一样,当然比较的结果是不相等的。
总结:
当 i 在 [-128,127] 的范围时,直接把静态内部类 IntegerCache 中已经存在这些 Integer 对象返回,如果 i 不在此范围内就 new Integer(i) 返回。也就是说以这种方式创建两个相同且在 [-128,127] 范围内的 Integer 对象,这两个引用指向堆中相同的一个 Integer 对象。
借鉴:https://blog.csdn.net/Little_person/article/details/79048637
参考:https://www.jianshu.com/p/bbe6bffcb03b