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

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. [20191101]完善vim的bccalc插件8.txt

    [20191101]完善vim的bccalc插件8.txt --//今天移植bccalc插件到linux,发现一些问题.我自己已经在windows下使用一段时间,从来没有在linux下测试.看来很少人 ...

  2. 小程序npm(初级篇)

    小程序npm NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NP ...

  3. linux 命令之touch

    转自:http://www.maomao365.com/?p=2037 一.touch命令简介touch的命令功能说明: 1 可以通过touch新建一个文件; 2 可以修改文件的时间戳; 3 可以批量 ...

  4. mssql sqlserver text、image字段类型无法使用DISTINCT的处理方法分享

    转自: http://www.maomao365.com/?p=9775  摘要: 下文简述sqlserver数据库中 text image类型无法使用distinct的处理方法分享 实验环境:sql ...

  5. LINUX中查看、添加、删除PATH以及永久添加PATH

    1.查看PATH变量 echo $PATH 会出现: 路径1:路径2:路径3 2.添加PATH变量 export PATH=$PATH:新添加的路径 用此方法添加的PATH,在关闭或者重启LINUX后 ...

  6. spring mongodb用法

    A field annotated with @Id (org.springframework.data.annotation.Id) will be mapped to the '_id' fiel ...

  7. JS运动---运动基础(缓冲运动)

    (1)手风琴效果 分析: (2)基础缓冲运动 接下来取整 原因: px为计算机识别的最小单位,1px无法再往下拆分.所以css如果取值200.5px,解析时计算机会自动将其改为200px注意:这里的数 ...

  8. Java Web 学习(6) —— Spring MVC 之校验器

    Spring MVC 之校验器 数据验证 一个典型的 Spring MVC 应用会同时应用到 formatters/converters 和 validators. 在调用 controller 期间 ...

  9. HttpClient之用CloseableHttpClient发送post请求

    使用HttpClient发送请求的一般步骤(1) 创建HttpClient对象.(2)创建请求方法的实例,并指定请求URL.如果需要发送GET请求,创建HttpGet对象:如果需要发送POST请求,创 ...

  10. java之运算符的优先级

    优先级 运算符 结合性 1 () [] 从左往右 2 ! +(正) -(负) ++ -- 从右往左 3 * / %  从左往右 4 << >> >>> 从左往 ...