一、java基本数据类型
byte char int short float long double boolean 一共八种,同时他们的内存占用情况:
一个字节等于8位;1 byte = 8 bit。
byte:1 byte 8 bit -2^7 ——2^8-1 -128 ——127 (因为中间有个0算为正数了,)
char:2 byte 16 bit 0——2^16 - 1 0——65535 (因为字符串没有负数,所以都为正的)
short:2 byte 16 bit -2^15 —— 2^15- 1
int:4 byte 32 bit -2^31 —— 2^31- 1
float:4 byte 32 bit -2^63 —— 2^63- 1
long:8 byte 64 bit -2^63 —— 2^63- 1
double:8 byte 64 bit 2^127 —— 2^127- 1
boolean 1 byte true false (注意:其实布尔类型只需要一个bit 就可以了,但是计算机最小存储单元是1 byte)
规律总结:
最小值和最大值的计算方式就是 2 的 x 平方 (x = 字节数 * 8 - 1 = 多少bit),但这个规律不包括浮点数,即float 和 double 。
为什么内存一样大的int 和 float 所代表的大小却不一样呢?
- 原因很简单,就是int类型是直接以二进制形式保存,而float类型是以指数形式保存。 参考
二 、String 为什么不算是基本类型?
从 String str = new String("str"); 我们点击进去看源码发现
/** The value is used for character storage. */
private final char value[];
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
String类其实是对字符数组进行了封装操作,用户真正操作的其实字符数组,居然是数组,我们知道传统的数组有一个天生的缺点:长度不可改变。我们在讲解继承的时候,我们是不是自己实现了一个Array类的操作啊,在这个类中我们是不是定义了一个addLen()的方法,这个方法主要是为了动态扩展数组长度而定义的,但是我们发现这个方法中改变的其实并不是数组长度,而是数组的引用地址。也就是说,我们改变的不是字符串的内容,而是字符串的引用地址。那原来的堆内存是不是就会成为垃圾啊?等待JVM回收。当别人问到一定要清楚这个概念哦。简单的说就是:字符串内部其实就是一个使用final关键字定义的char[]数组,数组长度一旦声明则不可改变,字符串一旦声明则不可改变,改变的引用内存指向。
String属于一个类,不属于一个关键字、准确的说它不是一个数据类型。只是由于它字符串的特殊支持,我们习惯把它叫做字符串类型。