Java提供了两类数据类型:一种是基本类型(原始类型),一种是引用类型。
- 数据类型图:
┏数值型━┳━整数型:byte short int long
┏基本数据类型━━┫ ┗━浮点型:float double
┃ ┣字符型:char
数据类型╋ ┗布尔型:boolean
┃ ┏类(class)
┗引用数据类型━━╋接口(interface)
┗数组(array)
- 基本数据类型
数据类型 | 大小(bit) | 范围 | 默认值 | 包装类 |
---|---|---|---|---|
byte(字节) | 8 | -128 - 127 | 0 | Byte |
shot(短整型) | 16 | -32768 - 32767 | 0 | Boolean |
int(整型) | 32 | -2147483648-2147483647 | 0 | Short |
long(长整型) | 64 | -9233372036854477808-9233372036854477807 | 0 | Character |
float(浮点型) | 32 | -3.40292347E+38-3.40292347E+38 | 0.0f | Integer |
double(双精度) | 64 | -1.79769313486231570E+308-1.79769313486231570E+308 | 0.0d | Long |
char(字符型) | 16 | ‘ \u0000 - u\ffff ’ | ‘\u0000 ’ | Float |
boolean(布尔型) | 1 | true/false | false | Double |
注意:
1、在基本数据类型中,除了boolean类型所占长度与平台有关外,其他数据类型长度都是与平台无关的。比如,int永远占4个字节(1 Byte = 8 bit)。
2、void不是基本数据类型
在 Java 中基本类型只有八种,详见 Java Language Specification 的 4.2 节:
http://java./docs/books/jls/third_edition/html/typesValues.html#4.2
另外,在 Java Language Specificaion 的第 14.8 节也提及 void 并不是一种类型:
http://java./docs/books/jls/third_edition/html/statements.html#5989
为什么《Thinking in Java》等一些书籍都说,void是基本类型的一种呢?
来看void的包装类java.lang.Void源码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
再看getPrimitiveClass()方法的源码:
- 1
- 2
- 3
- 4
- 5
- 6
“Ctrl+Alt+H”查看调用getPrimitiveClass()方法的所有类,确实是“Byte、Boolean、Short、Character、Integer、Long、Float、Double、Void”一共9个包装类,由此猜测把void也归到基本数据类型的说法可能来源于此。
3、基本数据类型的默认值仅在作为类中属性时生效
在方法内部必须先对基本数据类型变量赋值后才能使用,否则编译不通过。Demo如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
在程序中如果某些数据可能会返回空值,那么用包装类比较好。比如当结果为空时,转换为int会发生异常,而转换为Integer则不会,因为对象可以为null。此时建议用包装类,虽然会牺牲一些转换效率,但可以避免持久化数据时产生的一些异常。
- 引用数据类型
引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。
在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。
引用类型常见的有:String,StringBuffer,ArrayList,HashSet,HashMap等。
String也属于引用数据类型:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
如果要对比两个对象是否相同,则需要使用equals()方法,但有一点需要注意:equals()方法的默认行为是比较引用。如果是你自己写的类,你应该为它重写equals()来比较对象的内容。大多数Java类库都实现了比较对象内容的equals()方法。
- 两种类型对比
最后,基本数据类型和引用数据类型的一些对比如下:
基本数据类型 | 引用数据类型 |
---|---|
在栈中进行分配 | 在堆中进行分配,堆的读写速度远不及栈 |
变量名指向具体的数值 | 变量名指向存数据对象的内存地址,即变量名指向hash值 |
变量在声明之后java就会立刻分配给他内存空间 | 它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址 |
基本类型之间的赋值是创建新的拷贝 | 对象之间的赋值只是传递引用 |
“==”和“!=”是在比较值 | “==”和“!=”是在比较两个引用是否相同,需要自己实现equals()方法 |
基本类型变量创建和销毁很快 | 类对象需要JVM去销毁 |