基本数据类型
Java中的数据类型分为 内置数据类型和引用数据类型两种。
内置数据类型分为4大类,包含 整数型(byte int short long),浮点型(float double),逻辑型(boolean)以及字符型(char)
原始类型 | 占用字节数 | 包装类 | 默认初始值 | 范围 |
---|---|---|---|---|
byte | 1个字节 | Byte | 0 | -128 ~ 127 |
int | 4个字节 | Integer | 0 | -2147483648~2147483647 |
short | 2个字节 | Short | 0 | -32768~32767 |
long | 8个字节 | Long | 0L | -9223372036854775808~9223372036854775807 |
float | 4个字节 | Float | 0.0f | -3.4E38~3.4E38 |
double | 8个字节 | Double | 0.0d | -1.7E308~1.7E308 |
boolean | 1个字节 | Boolean | false | true或false |
char | 2个字节 | Character | 0~255 |
引用数据类型
类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型等
基本数据类型和引用数据类型的区别
- 存储位置的差异
基本数据类型
在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的局部变量表中(栈的构成 局部变量表、操作数栈、动态链接、方法出口)。
引用数据类型
只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址。
public class Main{
public static void main(String[] args){
//基本数据类型
int i = 1;
double d = 1.2;
//引用数据类型, str存在栈中,helloworld存在堆内存中。
String str = "helloworld";
}
}
- 传递方式的差异
/基本数据类型作为方法参数被调用,值不变
public class Main{
public static void main(String[] args){
int msg = 100;
System.out.println("调用方法前msg的值:\n"+ msg); //100
fun(msg);
System.out.println("调用方法后msg的值:\n"+ msg); //100
}
public static void fun(int temp){
temp = 0;
}
}
//引用数据类型作为方法参数被调用,会改变
class Book{
String name;
double price;
public Book(String name,double price){
this.name = name;
this.price = price;
}
public void getInfo(){
System.out.println("图书名称:"+ name + ",价格:" + price);
}
public void setPrice(double price){
this.price = price;
}
}
public class Main{
public static void main(String[] args){
Book book = new Book("Java开发指南",66.6);
book.getInfo(); //图书名称:Java开发指南,价格:66.6
fun(book);
book.getInfo(); //图书名称:Java开发指南,价格:99.9
}
public static void fun(Book temp){
temp.setPrice(99.9);
}
}
装箱和拆箱问题
Java为每种基本数据类型都提供了对应的包装器类型。在1.5之前生成Integer 需要 Integer i = new Integer(10);在1.5之后 Integer i = 10;
Integer i = 10; //装箱
int n = i; //拆箱
装箱的实现是调用Integer.valueof()方法。拆箱的实现是调用intValue方法。
常见面试中会有
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2); //true 小于int最大值,不会申请空间,触发拆箱操作,比较的是值
System.out.println(i3==i4); //false,超过int最大值,会申请空间,比较的是引用地址
}
}