一、使用==来判断两个变量是否相等

1. 如果两个变量是基本类型变量,且都是数值类型,则只要两个变量的值相等,就将返回true

2. 如果两个变量是引用类型变量,则只有它们指向同一个对象时,才返回true

		// ex1:基本类型
int it = 65;
float fl = 65.0f;
char ch = 'A'; boolean bl1 = (it == fl); // true
boolean bl2 = (it == ch); // true // ex2:引用类型
String str1 = new String("Hello");
String str2 = new String("Hello"); boolean bl3 = (str1 == str2); // false

注:str1和str2都是引用类型变量,它们分别指向两个通过new创建的String对象,因此它们不相等。

二、使用equals方法来判断两个变量是否相等

1. equals()是Object类提供的一个实例方法,因此所有引用变量都可调用该方法来判断是否与其他引用变量相等

2. Object类提供的equals()同样要求两个引用变量指向同一个对象时才返回true,因此各子类可重写该方法来实现所需的判断标准

  • 如String类中已经重写了equals(),其判断标准是只要两个字符串所包含的字符序列相同,就返回true
		// ex:使用String类重写的equals方法来判断
String str1 = new String("Hello");
String str2 = new String("Hello"); boolean bl = str1.equals(str2); // true

3. 正确地重写equals()应满足下列条件

  • 自反性:对任意x,x.equals(x)一定返回true
  • 对称性:对任意x和y,如果y.equals(x)返回true,则x.equals(y)也返回true
  • 传递性:对任意x, y, z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)一定返回true
  • 一致性:对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回的结果应保持一致
  • 对任何不是null的x,x.equals(null)一定返回false

三、常量池

1. 当Java程序直接使用形如"Hello"的字符串直接量(包括可以在编译时就计算出来的字符串值,如"Hel" + "lo")时,JVM将会使用常量池来管理这些字符串

2. 当Java程序使用new String("Hello")时,JVM会先使用常量池来管理"Hello"直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中,换句话说,new String("Hello")一共产生了两个字符串对象

常量池专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据,它包括了关于类、方法、接口中的常量,还包括字符串常量。

		// s1直接引用常量池中的"我爱China"
String s1 = "我爱China";
String s2 = "我爱";
String s3 = "China"; // s4后面的字符串值可以在编译时就确定下来
// s4直接引用常量池中的"我爱China"
String s4 = "我爱" + "China";
// s5和s4是一样的
String s5 = "我" + "爱" + "China"; // s6后面的字符串值不能在编译时就确定下来
// s6不能引用常量池中的"我爱China"
String s6 = s2 + s3; // 使用new调用构造器将会创建一个新的String对象
// s7引用堆内存中新创建的String对象
String s7 = new String("我爱China"); boolean bl1 = (s1 == s4); // true
boolean bl2 = (s1 == s5); // true
boolean bl3 = (s1 == s6); // false
boolean bl4 = (s1 == s7); // false
  • JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本,因此s1、s4、s5都将引用常量池中的同一个字符串对象
  • 使用new String()创建的字符串对象是运行时创建出来的,它被保存在运行时内存区(即堆内存)内,不会放入常量池中

11. ==和equals方法 & 常量池的更多相关文章

  1. Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  2. 常量池之String.intern()方法

    JDK7将String常量池从Perm区移动到了Java Heap区.在JDK1.6中,intern方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中的实例.但是在JDK1.7以后,Str ...

  3. [一]class 文件浅析 .class文件格式详解 字段方法属性常量池字段 class文件属性表 数据类型 数据结构

    前言概述  本文旨在讲解class文件的整体结构信息,阅读本文后应该可以完整的了解class文件的格式以及各个部分的逻辑组成含义   class文件包含了java虚拟机指令集 和  符号表   以及若 ...

  4. String之常量池小结

    1.String 常量池 String使用private final char value[ ]实现字符串的存储,也就是说String创建对象之后不能够再次修改此对象中存储的字符串内容,因而Strin ...

  5. JVM字符串常量池StringTable

    String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式: String s2 = ...

  6. Class文件内容及常量池

    当JVM运行Java程序的时候,它会加载对应的class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中.那么这个class文件里面到底有些什么内容呢? 一.class文件内容概述 ...

  7. String类、常量池、字符串比较

    String类.常量池.字符串比较 一:String类           1.String类又称作不可变字符序列           2.String位于java.lang包中,Java程序默认导入 ...

  8. JVM体系结构之七:持久代、元空间(Metaspace) 常量池==了解String类的intern()方法、常量池介绍、常量池从Perm-->Heap

    一.intern()定义及使用 相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下: public native String inter ...

  9. 理解Java字符串常量池与intern()方法

    String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo ...

随机推荐

  1. Android Studio如何配置CURL指令一键打包apk上传至蒲公英

    Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...

  2. Python list遍历remove()时的一个小BUG

    有这样一个列表: s=list('abcdefg') 现在因为某种原因我们需要从s中踢出一些不需要的元素,方便起见这里直接以踢出所有元素的循环代替: for e in s: s.remove(e) 结 ...

  3. [20191112]oracle共享连接模式端口.txt

    [20191112]oracle共享连接模式端口.txt --//如果使用共享服务模式,你可以发现每次重启数据库对应的端口号会发生变化.# netstat -tunlp | egrep "A ...

  4. tomcat的一些优化及报错

    以下为转发来,具体地址为 http://blog.csdn.net/chen3888015/article/details/7432488 环境centos5.7 tomcat6 http://apr ...

  5. tensorflow dataloader 相关内容

    Tensorflow dataloader 相关调研:数据读取是训练的开始,是非常关键的一步:下面是调研时搜集到的一些相关链接: 十图详解tensorflow数据读取机制 https://zhuanl ...

  6. JVM-6-垃圾回收算法

    三如何垃圾回收   GC(Garbage Collection)垃圾回收算法 标记清除    速度快,但是会产生内存碎片: 标记整理    解决了标记清除内存碎片的问题,但是每次都得移动对象,因此成本 ...

  7. 6.jenkins构建任务3-java项目

    java项目 部署java的maven项目 1.检查插件,新版的jenkins默认就会安装  maven的插件 没有的话手动安装一下. Maven Integration plugin 2.安装环境 ...

  8. 201871010108-高文利《面向对象程序设计(java)》第十四周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...

  9. C++ 的 +,加号重载示例

    #include <iostream> // overloading "operator + " // 要考虑加法的形式 // a+1 // a+a // 1+a // ...

  10. DirectShow 获取音视频输入设备列表

    开发环境:Win10 + VS2015 本文介绍一个 "获取音频视频输入设备列表" 的示例代码. 效果图 代码下载 代码下载(VC2015):Github - DShow_simp ...