11. ==和equals方法 & 常量池
一、使用==来判断两个变量是否相等
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方法 & 常量池的更多相关文章
- Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 常量池之String.intern()方法
JDK7将String常量池从Perm区移动到了Java Heap区.在JDK1.6中,intern方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中的实例.但是在JDK1.7以后,Str ...
- [一]class 文件浅析 .class文件格式详解 字段方法属性常量池字段 class文件属性表 数据类型 数据结构
前言概述 本文旨在讲解class文件的整体结构信息,阅读本文后应该可以完整的了解class文件的格式以及各个部分的逻辑组成含义 class文件包含了java虚拟机指令集 和 符号表 以及若 ...
- String之常量池小结
1.String 常量池 String使用private final char value[ ]实现字符串的存储,也就是说String创建对象之后不能够再次修改此对象中存储的字符串内容,因而Strin ...
- JVM字符串常量池StringTable
String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式: String s2 = ...
- Class文件内容及常量池
当JVM运行Java程序的时候,它会加载对应的class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中.那么这个class文件里面到底有些什么内容呢? 一.class文件内容概述 ...
- String类、常量池、字符串比较
String类.常量池.字符串比较 一:String类 1.String类又称作不可变字符序列 2.String位于java.lang包中,Java程序默认导入 ...
- JVM体系结构之七:持久代、元空间(Metaspace) 常量池==了解String类的intern()方法、常量池介绍、常量池从Perm-->Heap
一.intern()定义及使用 相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下: public native String inter ...
- 理解Java字符串常量池与intern()方法
String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo ...
随机推荐
- Android Studio如何配置CURL指令一键打包apk上传至蒲公英
Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...
- Python list遍历remove()时的一个小BUG
有这样一个列表: s=list('abcdefg') 现在因为某种原因我们需要从s中踢出一些不需要的元素,方便起见这里直接以踢出所有元素的循环代替: for e in s: s.remove(e) 结 ...
- [20191112]oracle共享连接模式端口.txt
[20191112]oracle共享连接模式端口.txt --//如果使用共享服务模式,你可以发现每次重启数据库对应的端口号会发生变化.# netstat -tunlp | egrep "A ...
- tomcat的一些优化及报错
以下为转发来,具体地址为 http://blog.csdn.net/chen3888015/article/details/7432488 环境centos5.7 tomcat6 http://apr ...
- tensorflow dataloader 相关内容
Tensorflow dataloader 相关调研:数据读取是训练的开始,是非常关键的一步:下面是调研时搜集到的一些相关链接: 十图详解tensorflow数据读取机制 https://zhuanl ...
- JVM-6-垃圾回收算法
三如何垃圾回收 GC(Garbage Collection)垃圾回收算法 标记清除 速度快,但是会产生内存碎片: 标记整理 解决了标记清除内存碎片的问题,但是每次都得移动对象,因此成本 ...
- 6.jenkins构建任务3-java项目
java项目 部署java的maven项目 1.检查插件,新版的jenkins默认就会安装 maven的插件 没有的话手动安装一下. Maven Integration plugin 2.安装环境 ...
- 201871010108-高文利《面向对象程序设计(java)》第十四周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...
- C++ 的 +,加号重载示例
#include <iostream> // overloading "operator + " // 要考虑加法的形式 // a+1 // a+a // 1+a // ...
- DirectShow 获取音视频输入设备列表
开发环境:Win10 + VS2015 本文介绍一个 "获取音频视频输入设备列表" 的示例代码. 效果图 代码下载 代码下载(VC2015):Github - DShow_simp ...