Java数据类型之引用数据类型解读

 更新时间:2023年07月31日 10:59:49   作者:墨末..  
这篇文章主要介绍了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;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java底层基于二叉搜索树实现集合和映射/集合Set功能详解

    Java底层基于二叉搜索树实现集合和映射/集合Set功能详解

    这篇文章主要介绍了Java底层基于二叉搜索树实现集合和映射/集合Set功能,结合实例形式分析了Java使用二叉搜索树实现集合和映射相关操作技巧,需要的朋友可以参考下
    2020-03-03
  • Java数组的基本操作方法整理

    Java数组的基本操作方法整理

    这篇文章主要介绍了Java数组的基本操作方法整理,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • spring cloud 配置中心客户端启动遇到的问题

    spring cloud 配置中心客户端启动遇到的问题

    这篇文章主要介绍了spring cloud 配置中心客户端启动遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Lombok使用@Tolerate实现冲突兼容问题

    Lombok使用@Tolerate实现冲突兼容问题

    这篇文章主要介绍了Lombok使用@Tolerate实现冲突兼容问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 使用@SpringBootTest注解进行单元测试

    使用@SpringBootTest注解进行单元测试

    这篇文章主要介绍了使用@SpringBootTest注解进行单元测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 聊一聊SpringBoot服务监控机制

    聊一聊SpringBoot服务监控机制

    这篇文章主要介绍了聊一聊SpringBoot服务监控机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java基础之包装类的介绍及使用

    java基础之包装类的介绍及使用

    今天带大家复习Java基础知识,文中对Java包装类作了非常详细的介绍及总结,对正在学习java基础的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java Random.nextInt()方法原理解析

    Java Random.nextInt()方法原理解析

    这篇文章主要介绍了Java Random.nextInt()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 使用@Validated 和 BindingResult 遇到的坑及解决

    使用@Validated 和 BindingResult 遇到的坑及解决

    这篇文章主要介绍了使用@Validated 和 BindingResult 遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • springmvc注解配置实现解析

    springmvc注解配置实现解析

    这篇文章主要介绍了springmvc注解配置实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论