Java数据类型之引用数据类型解读
作者:墨末..
Java数据类型之引用数据类型
在Java中除了8种基本数据类型外,其他数据类型全部都是引用(reference)数据类型,引用数据类型用来表示复杂数据类型,如下图所示,包含:类、接口和数组声明的数据类型。
引用数据类型:有类,接口,数组等。
Java中的引用数据类型,相当于C等语言中指针(pointer)类型,引用事实上就是指针,是指向一个对象的内存地址。引用数据类型变量中保持的是指向对象的内存地址。
很多资料上提到Java不支持指针,事实上是不支持指针计算,而指针类型还是保留了下来,只是在Java中称为引用数据类型。
int x = 7; int y = x; String str1 = "Hello"; String str2 = str1; str2 = "World";
上述代码声明了两个基本数据类型(int)和两个引用数据类型(String)。当程序执行完第②行代码后,x值为7,x赋值给y,这时y的值也是7,它们的保持方式如图1所示,x和y两个变量值都是7,但是它们之间是独立的,任何一个变化都不会影响另一个。
当程序执行完第③行时,字符串“Hello”对象被创建,保持到内存地0x12345678中,str1是引用类型变量,它保存的是内存地址0x12345678,这个地址指向“Hello”对象。
当程序执行完第④行时,str1变量内容(0x12345678)被赋值给str2是引用类型变量,这样一来str1和str2保存了相同的内存地址,都指向“Hello”对象。见图1所示,此时str1和str2本质上是引用一个对象,通过任何一个引用都可以修改对象本身。
当程序执行完第⑤行时,字符串“World”对象被创建,保持到内存地址0x23455678中,地址保存到str2变量中,此时,str1和str2不再指向相同内存地址,见图2所示。
图一:引用数据类型赋值过程1
图二:引用数据类型赋值过程2
java理解引用数据类型
一.java中基础数据类型与引用数据类型的区别
1.1基础数据类与引用数据类型介绍
1.基础数据类型:
- ①整数类型:
long、int、short、byte
- ②浮点类型:
float、double
- ③字符类型:
char
- ④布尔类型:
boolean
2.引用数据类型:类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型,例:String
类型就是引用类型。
1.2存储位置的区别
- 基本变量类型
在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的
- 引用变量类型
只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址
如图:
- 基本数据类型
引用数据类型:
1.3传递方式的区
- 基本变量类型
在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的
- 引用变量类型
引用数据类型变量,调用方法时作为参数是按引用传递的,传递的是引用的副本
二.String判断字符串相等
2.1java中字符串的基本存储原理
- 1.常量池中的字符串仅是符号,第一次用到的时候才变为对象
- 2.利用串池的机制,来避免重复创建字符串对象
- 3.字符串常量拼接原理是StringBuilder(1.8)
- 4.可以使用intern方法,主动将串池中还没有的字符串放入串池(1.8是放入,1.6是复制副本放入)
2.2举例
public class ComPareString { public void test(){ String str1="a";//"a"第一次用到,变为对象 String str2="b"; String str3="a";//判断str1==str3为true,str1与str2指向的都是在串池中的对象"a" String str4="ab"; String str5="a"+"b";//判断str4==str5为true,str4在编译的过程中就完成了拼接为"ab" // ,与上述同理,与str4所指是同一对象 String str6=str1+str2;//判断str4==str6为false,str1与str2为变量,实际上是 //new StringBuilder().append("a").append("b").toString(),即new String("ab") //新创建了对象,并不是在串池中的"ab",所以为false String str7=str6.intern(); //将str6字符串对象放入串池中,如果串池中有就不会放入,如果没有就会放入,最后会把串池中的对象返回 //所以str7现在所指的对象与str4是一样的,str4与str6不相等,故判断str6==str7为false String s8=new String("abc"); String s9=s8.intern();//判断s8==s9,如果jdk为1.8则为true,如果jdk为1.6则为false }}
三.java创建链表错误点
Node h = new Node(); Node n=new Node(); Node n2=h.next; n2=n; //奇奇怪怪的错误(捂脸),无论next是null或是非null都不可以这样写,n2=n就是把n的引用赋值给了n2,这样的话n2与h.next就没有任何关系了 //正确写法 n.next=null; h.next=n;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。