Java中的==使用方法详解

 更新时间:2021年09月28日 14:44:17   作者:It一zhai男  
这篇文章主要给大家介绍了关于Java中的==使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Java中的==

Java中的==表示的是什么呢?有时候很令人费解。比如,以下例子输出是什么?

		// 例一
		String str = "wo";
		String str1 = "wo";
		System.out.println("例一:" + (str == str1));

		// 例二
		String str2 = new String("wo");
		String str3 = new String("wo");
		System.out.println("例二:" + (str2 == str3));

		// 例三
		int i1 = 1;
		int i2 = 1;
		System.out.println("例三:" + (i1 == i2));

		// 例四
		TestObject t1 = new TestObject();
		TestObject t2 = new TestObject();
		System.out.println("例四:" + (t1 == t2));

其中,TestObject是自定义的一个类,结构如下:

package com.yds.test;

public class TestObject {
	public TestObject(){
		
	}
}

最终的结果输出什么呢?结果如下:

例一:true
例二:false
例三:true
例四:false

其实,在Java中,如果是基本数据类型,则 == 比较的是值;如果是对象类型,则 == 比较的是对象的地址。但是,有时候会疑惑,String不是对象类型么?为什么例一是true呢?这个就要谈谈字符串常量池的问题。

2 字符串常量池

String类是我们平常项目中使用频率非常高的一种对象类型,JVM为了提升性能和减少开销,避免字符串的重复创建,维护了一块特殊的内存空间,即字符串常量池。当需要使用字符串时,先去字符串常量池查看该字符串是否已经存在,如果存在,则可直接使用;如果不存在,初始化,并将该字符串放入到字符串常量池中。

在JDK1.6及之前版本,字符串常量池在方法区中

在JDK1.7及以后版本,字符串常量池移到了堆中

使用String str=“wo”,可能创建一个或者不创建对象。如果“wo”在字符串常量池中已经存在,则不会再创建String类型的值为“wo”的对象,而是将str指向这个“wo”对象内存地址,后续无论用这种方式创建多少个指向“wo”的引用,在内存中,都只有一个“wo”内存地址被分配。而==判断的是对象内存的地址,所以例一返回true。下图是用这种方式创建字符串的示例图。

例一示例图

对象存放在堆中,字符串常量池是堆中一块特殊区域,new出来的是对象,字符串可以通过直接赋值创建一个对象,如上所述。

对象的引用存放在栈中,String str是对象的引用

在上图中,栈存放的是字符串的引用,str和str1存放的都是对象“wo”的内存地址,==判断对象时,判断的是他们存储的内存地址是否相同,由上图可见,他们的内存地址是相同的,所以例一输出的是true。

图片.png

例二的两个字符串都是通过new的方式创建对象的,所以在堆上有两个String对象,且这两个对象指向字符串常量池中的同一个对象“wo”,如上图所示,此时str2和str3存储的对象地址就不相同,所以例二返回的是false。

String str = new String(“wo”)创建了几个对象?如果字符串常量池中没有“wo”,则该句创建了两个对象,首先会创建一个“wo”存放在字符串常量池中,其本身就是一个对象;然后会new 一个字符串对象,并将“wo”的引用返回给new出来的对象;如果字符串常量池中有“wo”,则该句只创建了一个对象,因为该句首先会查找字符串常量池中是否存在“wo”,如果存在则直接返回"wo"的引用给new出来的对象。

3 总结

==使用总结

如果是基本数据类型,==判断的是值

如果是对象类型,==判断的是对象的地址

通过直接赋值而不是new的方式给String赋值,如果字符串常量池中有该对象,则不会再创建,此时通过 == 判断,返回的是true。如:String str=“wo”;String str1=“wo”;str == str1为true.
在JDK1.6及以前版本,字符串常量池在方法区中;在JDK1.7及以后,字符串常量池在堆中。
对象的引用保存在栈中

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • idea每次新打开的项目窗口maven都要重新设置问题

    idea每次新打开的项目窗口maven都要重新设置问题

    这篇文章主要介绍了idea每次新打开的项目窗口maven都要重新设置问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • SpringBoot详解Banner的使用

    SpringBoot详解Banner的使用

    这篇文章主要介绍了超个性修改SpringBoot项目的启动banner的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • SpringBoot配置连接两个或多个数据库的实现

    SpringBoot配置连接两个或多个数据库的实现

    本文主要介绍了SpringBoot配置连接两个或多个数据库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • java中实现一个定时任务的方式

    java中实现一个定时任务的方式

    本文介绍了三种在Java中实现定时任务的方法,并推荐使用Spring Boot注解方式,介绍了如何使用`@Scheduled`注解结合Cron表达式来设置定时任务,并提供了一个示例配置文件
    2025-03-03
  • idea中导入别人的springboot项目的方法(图文)

    idea中导入别人的springboot项目的方法(图文)

    这篇文章主要介绍了idea中导入别人的springboot项目的方法(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • idea创建spring boot工程及配置文件(最新推荐)

    idea创建spring boot工程及配置文件(最新推荐)

    本文给大家介绍idea创建spring boot工程及配置文件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Spring Boot优雅使用RocketMQ的方法实例

    Spring Boot优雅使用RocketMQ的方法实例

    这篇文章主要给大家介绍了关于Spring Boot优雅使用RocketMQ的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Java利用正则取标签之间的数据

    Java利用正则取标签之间的数据

    这篇文章主要介绍了Java利用正则取标签之间的数据,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Spring Boot 3.3 实现职责链模式轻松应对电商订单流程分析

    Spring Boot 3.3 实现职责链模式轻松应对电商订单流程分析

    在电商系统中,订单处理流程包括库存校验、优惠券验证、运费计算等多个步骤,这些步骤具有顺序依赖性,为了管理这些业务逻辑,职责链模式提供了解决方案,通过链式关系将处理逻辑模块化,实现解耦和灵活扩展,本文将探讨如何结合SpringBoot实现职责链模式,优化电商订单处理流程
    2024-10-10
  • SpringBoot如何集成PageHelper分页功能

    SpringBoot如何集成PageHelper分页功能

    这篇文章主要介绍了SpringBoot如何集成PageHelper分页功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论