Java中==和equals方法
Java程序中测试两个变量是否相等有两种方式:1、== ;2、equals()方法
当使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是基本数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就返回true。
但对于两个引用类型的变量,只有他们指向同一个对象时,==判断才会返回true。==不可用于比较类型上没有父子关系的两个对象。
public class EqualTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int it = 65;
float fl = 65.0f;
System.out.println("65和65.0f是否相等?" + (it == fl));
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1是否与str2相等?" + (str1==str2));
System.out.println("str1是否与str2相等?" + (str1.equals(str2)));
}
}
结果如下:
65和65.0f是否相等?true
str1是否与str2相等?false
str1是否与str2相等?true
解析:对于str1和str2,因为它们都是引用类型变量,它们分别指向两个通过new关键字创建的String对象,因此str1和str2两个变量不相等。
对初学者而言,String还有一个非常容易迷惑的地方,“hello”直接量和new String("hello")有什么区别?JVM将会使用常量池来管理这些字符串;当使用new String("hello")时,JVM会先使用常量池来管理“hello”直接量,再调用String类的构造函数来创建一个新的String对象,新创建的String对象被保存在堆内存中,换句话说,new String("hello")一共产生两个字符串变量。
常量池
常量池专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据。包括关于类、方法、接口中的常量,还包括字符串常量。
public class EqualTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "helloworld";
String s2 = "hello";
String s3 = "world";
String s4 = "hello"+"world";
String s5 = s2+s3;
String s6 = new String("helloworld");
System.out.println("s1是否与s4相等?" + (s1==s4));//true
System.out.println("s1是否与s5相等?" + (s1==s5));//false
System.out.println("s1是否与s6相等?" + (s1==s6));//false
}
}
JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本。故例子中s1和s4所引用的字符串可以在编译期就确定下来。它们引用常量池中同一个字符串对象。
使用new String()创建出来的字符串对象时运行时创建出来的,它被保存在运行时内存区(堆内存),不会放到常量池中。
但很多时候希望,程序判断两个引用变量是否相等时,也希望有一种类似“值相等”的判断规则,并不严格要求两个引用变量指向同一对象,可以利用equal()方法。
equal()方法是Object类提供的一个实例方法,因此所有引用变量都可以调用该方法来判断是否与其他引用变量相等。但使用该方法判断两个对象相等的标准与使用==运算符没有区别,同样要求两个引用变量指向同一个对象才会返回true。如果采用自定义的相等标准,则可采用重写equals方法实现。
String已经重写了equals()方法,判断两个字符串相等的标准:只要两个字符串所包含的字符序列相同。
class Person
{
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdStr() {
return idStr;
}
public void setIdStr(String idStr) {
this.idStr = idStr;
}
private String name;
private String idStr; public Person(){}
public Person(String name , String idStr)
{
this.name = name;
this.idStr = idStr;
}
public boolean equals(Object obj)
{
if(this == obj)
return true;
if(obj != null && obj.getClass() == Person.class)
{
Person personobj = (Person)obj;
if(this.getIdStr().equals(personobj.getIdStr())){
return true;
}
}
return false;
}
}
public class OverrideEqualsRight { public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person("xiaoming","123");
Person p2 = new Person("xiao","123");
Person p3 = new Person("da","12345");
System.out.println("p1和p2是否相等?"+p1.equals(p2)); System.out.println("p2和p3是否相等?"+p2.equals(p3));
} }
p1和p2是否相等?true
p2和p3是否相等?false
Java中==和equals方法的更多相关文章
- 关于Java中的equals方法
关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?
Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
- JAVA中复写equals方法
在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...
- JAVA中“==”与equals()方法区别
equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...
- 如何在Java中避免equals方法的隐藏陷阱
摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...
- 如何重写Java中的equals方法
Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...
- java中的equals方法
这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...
- Java中的equals方法和自定义比较器
Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...
随机推荐
- spring自动注入是单例还是多例?单例如何注入多例?
单例和多例的区别 : 单例多例需要搞明白这些问题: 1. 什么是单例多例: 2. 如何产生单例多例: 3. 为什么要用单例多例 4. 什么时候用单例, ...
- jexus System.BadImageFormatException Details: Non-web exception. Exception origin (name of application or object): App_global.asax_ai3fjolq.
Application ExceptionSystem.BadImageFormatExceptionInvalid method header format 0Description: HTTP 5 ...
- Python中的引用传参
Python中函数参数是引用传递(注意不是值传递).对于不可变类型,因变量不能修改,所以运算不会影响到变量自身:而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量. 引用传参一: >& ...
- [daily]gtk程序不跟随系统的dark主题
问题描述: 我的系统主题是dark的.在使用mysql-workbench是,里边的一些线条就跟随了系统文字的主要使用了灰白色. 这样在白色画布里就看不见这些线条了. 方法: 设置mysql-work ...
- Init wms goodlocation data
insert goodlocation: CREATE PROCEDURE [dbo].[sp_insert_goodlocation] -- Add the parameters for the s ...
- css实现三角形相关
1.css样式面包屑导航条实现矩形和三角箭头拼接 .cssTest { font-family: PingFangSC-Regular; font-size: 16px; color: #333333 ...
- ES6的字符串和数值的扩展
字符串扩展 对于处理大于两个字节(大于0xffff)的字符,let str =’\u{20bb7}abc’ ES5中的遍历 for(let i=0;i<str.length;i++){ con ...
- OSPF(Open Shortest Path First)
1.概述 路由协议OSPF全称为Open Shortest Path First,也就开放的最短路径优先协议,因为OSPF是由IETF开发的,所以所有厂商都可以用. OSPF的流量使用IP协议号. O ...
- 【托业】【怪兽】TEST03
101. engage [ɪnˈgeɪdʒ] v.参与 102. toner [ˈtəʊnə(r)]n.碳粉匣 103. surveillance [sɜ:ˈveɪləns]n.监控 105. i ...
- C#基础加强(9)之对象序列化(二进制)
介绍 对象序列化是将对象转换为二进制数据(字节流),反序列化是将二进制数据还原成对象.对象的非持久态的,不仅在程序重启.操作系统重启会造成对象的丢失,就是退出函数范围等都可能造成对象的消失,而序列化与 ...