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;

总结

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

相关文章

  • 浅析Java8新特性Lambda表达式和函数式接口

    浅析Java8新特性Lambda表达式和函数式接口

    Lambda表达式理解为是 一段可以传递的代码。最直观的是使用Lambda表达式之后不用再写大量的匿名内部类,简化代码,提高了代码的可读性
    2017-08-08
  • 浅谈java Iterator.remove()方法的用法(详解)

    浅谈java Iterator.remove()方法的用法(详解)

    下面小编就为大家带来一篇浅谈java Iterator.remove()方法的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 模仿mybatis-plus实现rpc调用

    模仿mybatis-plus实现rpc调用

    这篇文章主要为大家介绍了模仿mybatis-plus实现rpc调用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Spring中ApplicationListener的使用解析

    Spring中ApplicationListener的使用解析

    这篇文章主要介绍了Spring中ApplicationListener的使用解析,ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,需要的朋友可以参考下
    2023-12-12
  • mongo分布式锁Java实现方法(推荐)

    mongo分布式锁Java实现方法(推荐)

    下面小编就为大家带来一篇mongo分布式锁Java实现方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 详解java面试题中的i++和++i

    详解java面试题中的i++和++i

    这篇文章主要介绍了java面试题中的i++和++i的相关资料,需要的朋友可以参考下
    2018-03-03
  • Java雪花算法生成分布式id详解

    Java雪花算法生成分布式id详解

    这篇文章主要介绍了Java雪花算法生成分布式id详解,随着业务的增长,有些表可能要占用很大的物理存储空间,为了解决该问题,后期使用数据库分片技术,将一个数据库进行拆分,通过数据库中间件连接,需要的朋友可以参考下
    2024-01-01
  • 通过实例深入学习Java的Struts框架中的OGNL表达式使用

    通过实例深入学习Java的Struts框架中的OGNL表达式使用

    这篇文章主要通过实例介绍了Java的Strus框架中的OGNL表达式使用,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-11-11
  • 解析Java异步之call future

    解析Java异步之call future

    当调用一个函数的时候,如果这个函数的执行过程是很耗时的,就必须要等待,但是有时候并不急着要这个函数返回的结果。因此,可以让被调者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,可以先处理一些其他事情,在真正需要数据的时候再去尝试获得需要的数据
    2021-06-06
  • 基于Java实现QQ登录注册功能的示例代码

    基于Java实现QQ登录注册功能的示例代码

    这篇文章主要和大家分享如何利用Java语言实现QQ登录、注册等功能。本文主要应用的技术有:GUI、JDBC、多线程等,需要的可以参考一下
    2022-05-05

最新评论