一、equals和==的区别

1.1、equals之string字符串的比较

1.1.1、源码如下图

if (this == anObject) {
            return true;
  }

当两者是同一地址的时候,则直接返回true,即相等,若两者有一者不是string类型,则跳过两个if,返回false;

由源码可知,字符串先比较的是两者的大小,若不等,则直接返回false;当长度相等时,进而将字符串转为char数组来对每一个字符进行比较,由此可见,equals比较的是字符串的值是否想等。

1.2、equals之对象的比较

说明:若该对象没有重写Object的equals,则默认引用object的equals方法,源码如下

当是对象(没有重写equals)进行比较,则此时比较的是两者的地址是否相等

package com.qm.test.equals;

import org.junit.Test;

public class EqualsDemo {
    
    @Test
    public void test1(){
        EqualsDemo e1 = new EqualsDemo();
        EqualsDemo e2 = new EqualsDemo();
        EqualsDemo e3 = e1;
        System.out.println(e1.equals(e2));//等同e1==e2,false
        System.out.println(e1.equals(e3));//等同e1==e3,true
        System.out.println(e2.equals(e3));//等同e2==e3,false
    }
}

测试结果分析:

1、因为e1和e2都是直接new对象,即在堆内存中开辟空间,两者地址肯定不一样,当两者进行equals比较时,返回false。

2、因为e1直接把它的栈引用,赋给了e3(即,e3也指向e1在开辟的空间),两者比较时返回true。

3、e2与e3相比较同1.

注意:若互相比较的对象,重写了equals方法,则按照重写的进行比较

2.1、==的比较

2.1.1、基本数据类型·

当要比较的对象时基本数据类型(java中数据类型,大致分为两类,一,基本数据类型(八个),二、引用数据类型类型(也可称复合数据类型)),则此时返回的结果是与equals一样,比较的是值是否相等,而不是地址,

2.1.2、引用数据类型

当引用数据类型是基本数据类型的包装类型时,两者进行==比较,也是比较的是值是否相等。 可自行查看源码。

当是其他的数据类型时,则比较的是两者在堆内存中的地址是否相等(即是否指向同一个堆内存)。


二、String类的说明

2.1、String类的创建

String a1 = new String("a1");当程序运行后则会发生这几件事,先在string常量池中查询有没有a1字符串,若没有则创建a1字符串,且将其放入常量池中,若有,则不创建,然后,由于使用了new关键字,则会在堆内存中开辟空间,然后在栈内存中有该堆内存的引用(可以理解为堆内存的地址,被栈内存的a1掌握),同时该值为a1,
 String a2 = "aaa";,先去查看常量池中有没有aaa字符串,若有,则直接将该引用地址赋给a2,若没有,则创建且放入常量池,再将引用地址赋给a2,

若考虑性能问题,建议使用后者创建字符串。

2.2、string类的值的比较

public class EqualsDemo
{
    public static void main(String[] args)
    {
        String s1 = new String("xx");
        String s2 = new String("xx");
        String s3 = “xx”;
        System.out.println(s1 == s2);//false
        System.out.println(s1.equals(s2));//true
        System.out.println(s1.equals(s3));//true

    }
}

说明:

1、s1==s2,比较的是堆内存地址是否相等,由于两者都单独在堆内存中开辟了空间,所以返回false,s1.equals(s2),比较的是值,即返回true。

2、s1.equals(s3),由于创建s1时,xx字符串已经在常量池中,存在,所以直接把该引用赋给s3,两者值相等。

3、若s3发生改变,如s3=s3+"bb";则先会在常量池中查找xxbb,没有则创建,同时将该引用赋给s3,但注意的是xx字符串,并没有在string常量池中消失。


个人总结

由于这是本人第一篇博文,语言表达、文字排版上难免有点欠缺,请大家多多谅解,若有错误的地方,恳请,诸位指正。谢谢!

java equals和==区别及string类的说明的更多相关文章

  1. Java基础(31):String的大小写转换、分离成数组、==与equals()的区别(String类)

    继续来看 String 类常用的方法,如下代码所示: 运行结果: 那么,“==” 和 equals() 有什么区别呢? ==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象 eq ...

  2. Java基础(32):String与StringBuilder、StringBuffer的区别(String类)

    在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...

  3. java equals 和 == 区别

    equals 可以重写, == 不可重写 equals 是方法 equals 是 Object 的方法. 基本作用:判断两个对象是否为引用 public class Object { // 省略部分代 ...

  4. Java学习笔记19(String类)

    String代表字符串,在Java中,所有的字符串字面值都作为此类的实例实现 字符串的特点以及简单的原理分析: package demo; /* * String类的特点: * 所有的"&q ...

  5. Java技术——你真的了解String类的intern()方法吗

    0.引言 什么都先不说,先看下面这个引入的例子:   String str1 = new String("SEU")+ new String("Calvin") ...

  6. Java中是否可以继承String类,为什么

    Java中,是否可以继承String类?为什么? 答案: 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变. public final class ...

  7. Java学习笔记21(String类补充:正则表达式)

    正如python的re模块,不过Java和Python的正则表达式有一些区别,这里做简单介绍,具体的细节可以参考网上其他的文章: 功能:可以用于检验一个字符串,比如验证用户名,验证密码格式,验证是否是 ...

  8. Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)

    1.获取指定字符串中大小写和数字的个数: package demo; public class StringTest { public static void main(String[] args) ...

  9. java学习笔记15(String 类,StringBuffer)

    /* * String类的特点: * 所有的""都是String的对象 * 字符串一旦创建就是常量,不能改变 */ public class StringDemo { public ...

随机推荐

  1. 如何搭建易企秀H5平台?

    导读 易企秀如何开启伪静态支持? 一秀如何开启伪静态? 下载易企秀源码 oschina: http://git.oschina.net/jsper/html5Editor Windows下搭建环境 安 ...

  2. 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)

    我们已经学会构建自己的镜像了.接下来的问题是如何在多个 Docker Host 上使用镜像. 这里有几种可用的方法: 用相同的 Dockerfile 在其他 host 构建镜像. 将镜像上传到公共 R ...

  3. 无锁atomicInteger

    AtomicInteger可以保证硬件上的原子操作 1.主要原理 CAS操作 在进行数据更新的时候,会进行与内存中的地址进行比较,若预期值与内存中的值相同,则进行数据上的更新,若值不同,则更新失败,  ...

  4. 浅谈 Java 主流开源类库解析 XML

    在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...

  5. SDN学习之实现环路通信

    在对OpenFlow协议有了一定了解以后,开始尝试如何通过Ryu控制器实现网络中的通信.根据协议,我们知道,当数据信息首次传输到交换机时,由于交换机不存在该数据信息所对应的流表,因此,会触发Packe ...

  6. leetcode算法题(JavaScript实现)

    题外话 刷了一段时间的codewars的JavaScript题目之后,它给我最大的感受就是,会帮助你迅速的提升你希望练习的语言的API的熟悉程度,Array对象.String对象等原生方法,构造函数. ...

  7. nginx安装文档

    1.   安装依赖包 yum -y install pcre-devel yum -y install openssl-devel yum -y install gcc yum -y install ...

  8. 解析PHP面向对象的三大特征

    class BenHang extends Card{ /*构造函数与及构造的继承*/ function __construct($cardno,$pwd, $name,$money){ parent ...

  9. DDD理论学习系列(5)-- 统一建模语言

    DDD理论学习系列--案例及目录 1.引言 上一节讲解了领域模型,领域模型主要是将业务中涉及到的概念以面向对象的思想进行抽象,抽象出实体对象,确定实体所对应的方法和属性,以及实体之间的关系.然后将这些 ...

  10. Page directive must not have multiple occurrences of pageencoding

    一个jsp文件中不能同时出现两个 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #932192 } pageE ...