一、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. Hibernate学习笔记二:Hibernate缓存策略详解

    一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...

  2. .net 企业管理系统快熟搭建框架

          简言   本人在博客园注册也2年多了,一直没有写自己的博客,因为才疏学浅一直跟着园子里的大哥们学习这.net技术.一年之前跳槽到现在的公司工作,由于公司没有自己一套的开发框架,每次都要重新 ...

  3. C语言习题1.分别统计一下其中字母,数字,其他字符的个数。将统计的字母,数字,其他字符的个数以柱状图的形式打印

    从键盘上输入字符,(1)分别统计一下其中字母,数字,其他字符的个数, (2)将统计的字母,数字,其他字符的个数以柱状图的形式打印.例如 5 ***** *****     3 *****   **** ...

  4. 开涛spring3(6.4) - AOP 之 6.4 基于@AspectJ的AOP

    Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明. 6.4.1  启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明, ...

  5. JVM垃圾收集算法

    JVM垃圾收集 1. 判断对象是否存活 引用计数算法 对象添加一个引用计数器,每个地方引用它,计数器值加+1:当引用失效,计算器值减1:任何时刻计数器为0的对象不可能被使用.引用计数算法实现简单,高效 ...

  6. 一个Monad的不严谨介绍

    一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已,这有什么难以理解的?* 之前了解了下Monad,后来一段时间没碰,最近研究Parser用到Monad时发现又不懂了.现在重新折腾,趁着 ...

  7. Fitting Bayesian Linear Mixed Models for continuous and binary data using Stan: A quick tutorial

    I want to give a quick tutorial on fitting Linear Mixed Models (hierarchical models) with a full var ...

  8. Adobe After Effect CC2017 for Mac

    前段时间学习使用 Lottie 制作炫酷的动画,需要 Adobe After Effect 安装 bodymovin 插件,然后导出动画的 json 文件.尝试安装 AE 工具.网上查找 史蒂芬周的博 ...

  9. Python常用的第三方库

    最近学习python 做些数据挖掘相关的练习,涉及到很多第三方的库,所以做一总结. Setuptools 可以让程序员更方便的创建和发布 Python 包,特别是那些对其它包具有依赖性的状况. 我特别 ...

  10. [BZOJ1597]土地购买

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...