==和equals方法:
Java程序中判断两个变量是否相等有两种方式:
一、利用 == 运算符:
1.1、如果两个变量是基本类型变量,且都是数值型(不一定要求数值类型完全相同),则只要两个变量的值相同,就返回true
1.2、对于两个引用类型变量,只有它们指向同一个对象时,== 判断才会返回true
1.3、== 运算符不可用于比较类型上没有父子关系的对象
代码示例:
import static java.lang.System.*;
public class EqualTest{
public static void main(String[] args){
int it=65;
float f1=65.0f;
out.println("65和65.0f是否相等?"+(it==f1)); char ch='A';
out.println("65和A是否相等?"+(it==ch)); String str1=new String("hello");
String str2=new String("hello");
out.println("str1和str2是否相等?"+(str1==str2));
out.println("str1是否equals str2?"+(str1.equals(str2))); //-由于java.lang.String与EqualTest类没有继承关系,下面代码会编译错误
//out.println("hello"==new EqualTest());
}
}
运行结果:

知识点拓展:
1、String str=“hello”;
2、String str=new String("hello");
如上两行代码中的两个变量str的区别:
1行代码中的“hello”被称为 字符串直接量(在编译时就计算出来的字符串值),JVM通过 常量池 来管理这些字符串
2行中的 new String("hello"),当使用这种定义方式时,JVM会先使用常量池来管理“hello”直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中,
换句话说,new String("hello") 一共产生了两个字符串对象
常量池(constant pool):专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据,包括了关于类、方法、接口中的常量,还包括字符串常量,如下代码示例:
import static java.lang.System.*;
public class CompareTest{
public static void main(String[] args){
//-a直接引用常量池中的"张三李四"
String a="张三李四";
String b="张三";
String c="李四"; //-d后面的字符串值在编译时就确定下来了
//-d直接引用常量池中的"张三李四"
String d="张三"+"李四"; //-e后面的字符串值在编译时就确定下来了
//-e直接引用常量池中的"张三李四"
String e="张"+"三"+"李四"; //-f后面的字符串值不能在编译时就确定下来了
//-f不能直接引用常量池中的字符串
String f=b+c; //-使用new调用构造器会重新创建一个新的String对象
//-g引用堆内存中新创建的String对象
String g=new String("张三李四"); out.println(a==d);//-true
out.println(a==e);//-true
out.println(a==f);//-false
out.println(a==g);//-false
}
}
总结:
1、JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本
2、例如上面代码中a、d、e所引用的字符串可以在编译期就确定下来,因此他们都将引用常量池中同一个字符串对象,所以用 == 运算符计算是返回 true 的
3、使用 new String()创建的字符串对象是运行时创建出来的,它被保存在运行时内存区内(即堆内存内),不会放入常量池中
二、利用 equals()方法:
1、equals()方法是Object类提供的一个实例方法,所有引用变量都可以引用这个方法判断与其它引用变量是否相等
2、判断是否相等的标准与 == 没有区别,都是看引用变量是否指向相同的对象,从这个作用上来说equals()方法没有太大意义
3、equals()方法最大的意义是可通过重写该方法,实现自定义的相等判断,如:String类就重写了equals()方法:只要两个字符串所包含的字符序列相等,即判断相等,返回true
重写equals()方法,实现两个类相等:
class Person{
//-重写Object类的equals()方法
public boolean equals(Object o){
//-相等规则自己定义
return true;
}
}
class Dog{
//-空类
}
public class OverrideEquals{
public static void main(String[] args){
Person p=new Person();
System.out.println(p.equals(new Dog()));
System.out.println(p.equals(new String("张三")));
}
}
运行结果:

有意义的去判断两个类相等。代码示例:
class Penson{
private String name;
private String id;
public Penson(){
}
public Penson(String name,String id){
this.name=name;
this.id=id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setId(String id){
this.id=id;
}
public String getId(){
return this.id;
}
public boolean equals(Object obj){
if(this==obj){
return true;
}
//-obj.getClass()==Penson.class用到了反射基础,暂时不用深究
if(obj!=null&&obj.getClass()==Penson.class){
//-强制转换,把将要比较的参数转换成Penson类,便于后面获取类变量id
Penson penson=(Penson)obj;
//-只有两个对象的id相等,才判定相等
if(this.getId().equals(penson.getId())){
return true;
}
}
return false;
}
}
public class OverrideEqualsRight{
public static void main(String[] args){
Penson p1=new Penson("张三","9527");
Penson p2=new Penson("李四","9527");
Penson p3=new Penson("王五","9526");
//-p1与p2的id相等,返回true
System.out.println(p1.equals(p2));
//-p1与p2的id不等,返回false
System.out.println(p1.equals(p3));
}
}
运行结果:

通常而言,重写equals()方法应满足下面的条件:
1、自反性:对任意x,x.equals(x)一定返回true
2、对称性:对任意x、y,如果x.equals(y)返回true,那么y.equals(x)一定返回true
3、传递性:对任意x、y、z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)一定返回true
4、一致性:对任意x、y,如果对象中用于等价比较的信息值没有发生改变,那么无论调用x.equals(y)多少次,返回的结果应该始终保持一致,要么一直true,要么一直false
5、对任何不是null的x,x.equals(null)一定返回false
==和equals方法:的更多相关文章
- List<T>Find方法,FindAll方法,Contains方法,Equals方法
假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...
- [java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]> [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...
- java中的equals()方法重写
如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...
- java提高篇(十三)-----equals()方法总结
equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
- equals()方法
equals()方法是根类Object中的一个方法,子类可以根据需要重写该方法(比如:String类). 一.Object类中的equals()方法实现如下: public boolean equal ...
- C#中==与Equals方法的区别
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...
- java重写equals方法
@Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...
- 重写Object类中的equals方法
Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...
- java中hashCode方法与equals方法的用法总结
首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...
随机推荐
- php 编程笔记分享
php获取POST数据的三种方法php 图片加水印源代码php+ajax+json的一个最简单实例php 汉字转拼音源码php遍历目录,生成目录下每个文件的md5值并写入到结果文件中php实现linu ...
- solr亿万级索引优化实践(四)
本篇是这个系类的最后一篇,但优化方案不仅于此,需要后续的研究与学习,本篇主要从schema设计的角度来做一些实践. schema.xml 这个文件的作用是定义索引数据中的域的,包括域名称,域类型,域是 ...
- Django之模板Template
模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视 ...
- Linux 各类设置、配置、使用技巧参考,Linux使用集锦
========== 参考格式 (新增记录时,复制粘贴在下)============= [日期]: <标题> 参考链接ref1: 参考链接ref2: 正文: ========== 参考格式 ...
- OpenACC kernels
▶ 使用 kernels 导语并行化 for 循环 ● 一重循环 #include <stdio.h> #include <time.h> #include <opena ...
- discuz 标签详解
Discuz 模板标签说明 Discuz! 的模板采用近似 PHP 表达式的语法,基本都是可识别的HTML,但涉及到变量和动态内容时,基本形式下: <!-{ 代码内容 }-> 逻辑元素包围 ...
- RocketMQ初探(五)之RocketMQ4.2.6集群部署(单Master+双Master+2m+2s+async异步复制)
以下部署方式结合众多博友的博客,经过自己一步一步实际搭建,如有雷同,侵权行为,请见谅...其中遇到不少的坑,希望能帮到更多的人,现在很少能找到一份完整版4.2.6版本的搭建教程了,如果你有幸遇见,那么 ...
- Tomcat 多项目管理
有时我们会在一个服务下存在多个项目的情况,为了统一管理和服务运行安全考虑,有时候我们需要重新部署一个项目但又不能停掉其它项目,就可以用manager进行管理. Tomcat manager和Root访 ...
- vue基础——Class与Style绑定
Class与Style绑定 操作元素的class列表和内联样式是数据绑定的一个常见的需求. 因为它们都是属性,所以我们可以用v-bind来处理它们:只需要通过表达式计算出字符串结果即可.不过,字符串拼 ...
- javascript的typeof返回哪些数据类型
javascript的typeof返回哪些数据类型 1.返回数据类型 undefined string boolean number symbol(ES6) Object Function 2.强制类 ...