【Java】到底是不是同一个对象?

2024-08-26 03:58

本文主要是介绍【Java】到底是不是同一个对象?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自己一直没有完全搞明白java的传值,传引用,传对象的区别,有时候觉得自己搞懂了,一碰到具体例子,又懵了,所以今天来敲代码看一下。

第一版:

    public static void main(String[] args) {List<Integer> userListA=new ArrayList<>();userListA.add(1);List<Integer> userListB=new ArrayList<>();userListB=userListA;System.out.println(userListA == userListB);}

来看下结果:

true

所以这种直接=的情况,两个list其实指向的是堆内的同一个对象。

第二版:

    public static void main(String[] args) {List<Integer> userListA=new ArrayList<>();userListA.add(1);List<Integer> userListB=new ArrayList<>();userListB.add(1);System.out.println(userListA == userListB);}

答案是:

false

当分别赋值,此时两个list指向不同。
这里有个有趣的地方,此时如果我们不比较list,而是比较list中的第一个对象,你会发现,返回结果也是true。
当我们继续将放到list中的值增大,一直到128,如下:

    public static void main(String[] args) {List<Integer> userListA=new ArrayList<>();userListA.add(128);List<Integer> userListB=new ArrayList<>();userListB.add(128);System.out.println(userListA.get(0) == userListB.get(0));}

此时结果就会变为 false,这种情况,是因为常量池的存在。
Byte, Short, Integer, Long, Character, Boolean, Float, Double, 除Float和Double以外, 其它六种都有常量池,,只在大于等于-128并且小于等于127时使用常量池

第三版:

此时我们不往list中放数字,放个对象试试:

    public static void main(String[] args) {User user=new User();user.setAge(1);user.setName("蝈蝈");List<User> userListA=new ArrayList<>();userListA.add(user);List<User> userListB=null;userListB=userListA;System.out.println(userListA == userListB);}

结果当然是:

true

第四版:

看看这个:

    public static void main(String[] args) {User user=new User();user.setAge(1);user.setName("蝈蝈");List<User> userListA=new ArrayList<>();userListA.add(user);List<User> userListB=new ArrayList<>();userListB.add(user);System.out.println(userListA == userListB);System.out.println(userListA.get(0)==userListB.get(0));}

结果为:

false
true

第五版:

到现在为止还是挺清晰的,那么addAll的情况如何呢?

    public static void main(String[] args) {User user=new User();user.setAge(1);user.setName("蝈蝈");List<User> userListA=new ArrayList<>();userListA.add(user);List<User> userListB=new ArrayList<>();userListB.addAll(userListA);System.out.println(userListA == userListB);System.out.println(userListA.get(0)==userListB.get(0));}

结果:

false
true

总结

其实java中,只有一种参数传递,就是值传递,当一个对象是基本数据类型对象时,把它当作参数传递给另一个方法,此时传递的是值,也就是会讲值拷贝给另一个方法。基本类型数据在方法里被修改了,原来的调用方那里是不会变的,因为是被复制了一份的,不会影响到原来的值;

当一个对象是个对象引用类型,比如User对象时,把它当作参数传递给另一个方法,此时传递的也是值,只不过此时,值并非某个数字,而是堆内存的地址。

这篇关于【Java】到底是不是同一个对象?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107486

相关文章

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s