java的基本数据类型和引用类型

java的基本数据类型和引用类型

基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。
 引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏

一、8种基本基本数据类型(分布尔类型和数值类型)。

1、4种整型
byte 1字节 -128——127
short 2 字节 -32,768 —— 32,767
int 4 字节 -2,147,483,648 —— 2,147,483,647(超过20亿)
long 8 字节 -9,223,372,036,854,775,808——9,223,372,036854,775,807
注释:java中所有的数据类所占据的字节数量与平台无关,java也没有任何无符号类型
2、 2种浮点类型
float 4 字节 32位IEEE 754单精度(有效位数 6 – 7位)
double 8 字节 64位IEEE 754双精度(有效位数15位)
3、1种Unicode编码的字符单元
char 2 字节 整个Unicode字符集
4、1种真值类型
boolean 1 位 true或者false

##二、种引用类型
类class
接口interface
数组array

##三、Java数据类型在内存中的存储:
给变量赋值前需要先确定变量的类型,确定了变量的类型,即确定了数据需分配内存空间的大小,数据在内存的存储方式。
1)基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面八种数据类型是这种存储模型;

2)引用类型的存储原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的(存储对象地址),而对象本身(实例化后的对象)的值存储在内存堆上的;

区别:基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的()(需要java中的栈、堆概念)

四、“==”和equal()对数据类型的分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
eg1:定义两个String对象(String不是基本数据类型)
//String是一个特殊的包装类数据。可以用以下两种方式创建:
//String str = new String(“abc”);String str = “abc”;
String a="abc";//栈中的a引用变量指向JVM运行时数据区区域方法区的常量池中的“abc”。
String b="abc";//栈中的b引用变量也指向方法区中的常量池中的"abc",和a指向的地址一样
String c = new String("abc");
//new一个新的String实例对象,引用变量c指向实例化对象new String("abc")的地址,该实例化对象存储在堆中[ **实际该地址指针(地址存在堆中)指向此对象类型数据(存在方法区中数据值)即abc**],这和存在常量池的“abc”值得地址不一样。
if(a==b){
System.out.println("a==b");
}else{
System.out.println("a!=b");}
System.out.printLn(a==c)

结果:
程序输出a==b
flase
原因:a和b引用变量指向的地址的是相同的,a==b比较的是两个引用变量所指向的地址。
a和c引用变量指向的地址的是不相同的,a指向常量区中的abc,c指向新开辟在堆内存中的String对象实例中的abc实例对象中数据值得地址;两个地址不同,==比较返回false。
images
images

images
参考
eg2:定义两个基本数据类型

1
2
3
4
5
6
7
8
int a=4; //栈中的a引用变量指向方法区中的常量池中的4
int b=4; //栈中的b引用变量也指向方法区中的常量池中的4
if(a==b){
System.out.println("a==b");
}
else{
System.out.println("a!=b");
}

结果:
输出:a==b
原因:a和b指向同一个常量区中常量4的地址。==比较两者地址相等。

不管是引用类型或基本数据类型使用“==”比较,实际上他们都先在栈空间创建了一个各自的变量引用如int a=1 或String b 等,并比较他们指向的地址的值;
如果给基本数据类型赋值,实际是先将在方法区中的常量区中查找是否存在值1的地址(该值有一个唯一的地址),如果存在则将a指向该地址;不存在那么在常量区新建一个值为1的空间,并将该值得地址赋值给a。如果重新给a赋值如:a = 2,同理将a指向的地址改为常量区中值为2的地址。注意 int c =1,代表a和b指向同一个地址(常量区中1的地址)。
如果使用new 实例化对象,对象的引用变量指向的是在堆中该对象实例化的对象地址;
equal()方法比较的是引用变量指向地址最终指向的值。