Java数据类型及在堆栈内存的存储
java中的数据类型分为两大类,分别是基本数据类型和引用数据类型。
1、 基本数据类型
-
byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0
-
short:短整型,2个字节(16 bit),取值范围-32768~32717,默认值0
-
int:整型,用于存储整数,在内存中占4个字节,取值范围-2147483648~2147483647,默认值0
-
long:长整型,在内存中占8个字节-263~263-1,默认值0L
-
float:浮点型,在内存中占4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
-
double:双精度浮点型,用于存储带有小数点的数字,在内存中占8个字节,默认值0
-
char:字符型,用于存储单个字符,内存中占2个字节,取值范围0~65535,默认值为空
-
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false
2 、引用数据类型
Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。引用类型分3种(5种):类,接口,数组(枚举,注解);
-
类(Class):所有的类,无论是Java自身已经存在的,还是用户后来创建的;
Objec类: 它是所有类的父类,每个类都实现这个类的方法;用Object 可以定义所有的类;
String类: String类代表字符串, -
接口(interface): 系统自带或者用户创建的
-
数组(array): 系统自带或者用户创建的
3、数据类型在内存中的存储原理
Java的数据类型存储原理要根据其为局部变量还是成员变量来区分,局部变量与成员变量根据定义变量的位置区分:
- 局部变量(方法中的变量):
- 基本数据类型:所有的基本数据类型不存在“引用”的概念,都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面;
- 引用数据类型:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”(存储对象在内存堆上的地址)是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的;
- 区别:基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的
-
成员变量(类中、方法外):
-
对于成员变量来说,不论是基本数据类型还是引用类型,他们都会存储在堆内存或者方法区中;成员变量可细分为静态成员变量和普通成员变量,静态成员变量类属于类,类可以直接访问,存储在方法区中;普通成员变量属于类对象,必须声明对象之后,通过对象才能访问,存储在堆中。
4、==与equals方法的区别
- 基本数据类型:
- 基本类型只能用"=="比较的是两个基本类型的值,不能用"equals"
- 引用数据类型(封装类):
- "=="比较的是对象的内存地址,new了两个不同的对象所存放的地址是不一样的,这边的"equals"比较的就是值,这里为什么比较的是值呢,equals里的重写了equals的方法。