equals与== 经常用于比较,用法如下:字符串比较相同用equals,普通数值(基本数据类型)比较用==, contentEquals下面讲

理论准备:

java的基本类型如int.float,double等,执行int a = 5,时,在内存中直接存储的是5这个数字,而使用new关键字创建

一个对象时比如String str = "123",内存中先储存的是一个引用变量str,他存储的是一个指向"123"这个对象的内存地址

1. == 比较的是什么?

== 比较的是数值本身,所以使用==比较基本类型

对于非基本类型, == 比较的是他们的内存地址是否相同(即是否指向同一个对象)

接下来看这段代码

第一个为true的原因是因为字符串的缓冲池,创建s1的引用对象"123"时,将其放入了缓冲池中,所以当我们String s2="123";时

是把s2这个引用指向了缓冲吃中的"123".所以s1与s2的内存地址相同,上面说了 == 对于非基本类型比较的是内存地址所以

输出结果是true

而第二个false是因为new关键字是创建新的对象,在内存的堆中创建了两个String对象,其值都是"123",s1,s2分别指向这两个对象

所以s1与s2储存的内存地址依旧不同,此外由于上面已经在缓冲池中有了"123"这个对象,所以new String("123")只是在堆中创建对象

不会把这个对象添加到缓冲池中

第三个false,s1指向缓冲池中的"123",s2是在堆中又新创建了一个值为"123"的对象,二者内存地址当然不同,所以是false

小结:可以看到只要使用new关键字创建字符串,就一定会在堆中创建一个新的对象,并检测缓冲池中是否有该对象,无则添加

而直接赋值的方式创建字符串是把该对象(如果缓冲池中没有)添加到字符串缓冲池中.有则从缓冲池中返回该对象的引用

2.equals

默认的equals方法效果和==相同,有Object中的equals源码为证

而一些类重写了该方法,比如String中的equals方法,使用String的equals方法时要注意,它比较的是字符串

说明:这里的value指的字符数组,是他们拼接成的字符串,可以看到987行比较时是对字符数组的每一个值进行比较,也就是说String的equals比较的是

字符串的内容是否相同,这与==作用于非基本类型时比较内存地址是不同的

3.contentEquals 与equals

contentEqualsn方法比较的是任何实现了CharSequence接口的对象,而equals源码里有一行代码(上图已标注,978行),

所以equals方法比较的是字符串,只有要比较的对象是字符串并且内容相同时才会返回true

contentEquals的源码就不贴了,感觉这个方法用的不太多,有兴趣可以自己研究

over.

java equals == contentEquals的更多相关文章

  1. 总结Java equals()和hashCode()的联系

    Java equals()和hashCode()的联系 如果两个对象是相等的,那么它们必须有相同的哈希码. 如果两个对象具有相同的哈希码,他们可能相等,可能不相等. 如果两个对象是不同的类的实例 他们 ...

  2. java equals和==的区别

    大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...

  3. java equals 和 "==" 比较

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  4. Java equals 和 hashcode 方法

    问题 面试时经常会问起字符串比较相关的问题, 总结一下,大体是如下几个: 1.字符串比较时用的什么方法,内部实现如何? 2.hashcode的作用,以及重写equal方法,为什么要重写hashcode ...

  5. Java equals的一个坑

    public class StringEqualsObject { public static void main(String[] args) { String name="Tom&quo ...

  6. java equals和==区别及string类的说明

    一.equals和==的区别 1.1.equals之string字符串的比较 1.1.1.源码如下图 if (this == anObject) {            return true;  ...

  7. java :equals()和hashcode()方法的结合使用

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  8. java equals()方法

    java基础学习总结--equals方法 一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class Te ...

  9. java equals 和 == 的区别

    )1. == 可以用来比较基本类型以及引用类型.在基本类型中 == 比较的是两个变量的值是否相等.在引用类型中,== 比较的是两个对象的内存地址是否相等. )2. equals 只能用来比较引用类型. ...

随机推荐

  1. C++、Objective-C 混合编程

    在XCODE中想使用C++代码,你须要把文件的扩展名从.m改成.mm.这样才会启动g++编译器. 我们来看个測试代码: [java] view plaincopy class TestC { priv ...

  2. 【回文】leetcode - Shortest Palindrome

    题目: Shortest Palindrome Given a string S, you are allowed to convert it to a palindrome by adding ch ...

  3. HDU 4911 Inversion 树状数组求逆序数对

    显然每次交换都能降低1 所以求出逆序数对数,然后-=k就好了.. . _(:зゝ∠)_ #include<stdio.h> #include<string.h> #includ ...

  4. SQL或HQL预编译语句,可以防止SQL注入,可是不能处理%和_特殊字符

    近期项目在做整改,将全部DAO层的直接拼接SQL字符串的代码,转换成使用预编译语句的方式.个人通过写dao层的单元測试,有下面几点收获. dao层代码例如以下 //使用了预编译sql public L ...

  5. Cocos2d-x 3.1.1 学习日志10--一进来你就知道了Box2D了

    error LNK2019: 无法解析的外部符号 "public: __thiscall b2Draw::b2Draw(void)" (? ?0b2Draw@@QAE@XZ),该符 ...

  6. tcpdump抓包和scp导出以及wireshark查看

    [命令和工具] tcpdump scp wireshark  (1)tcpdump sudo tcpdump -i eth0 -w /home/tcpdump/1.pcap host 10.214.1 ...

  7. ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...

  8. 数据加密,android客户端和服务器端可共用

    安卓中,不管是内网还是外网,数据的传输首要考虑就是安全问题,尤其是用户信息,以及各种密码等敏感信息. 所以说,对数据的加密是很有必要的,尤其是当下物联网蓬勃发展的今天,数据安全尤为重要. 数据加密的方 ...

  9. 解决vue.js修改数据无法触发视图

    data:{checkValue:{}}that.checkValue[key] = [] 赋值无法实时改变变量:(数据其实最终被修改,但是并没有触发检测从而更新视图)原因:Vue 不能检测到对象属性 ...

  10. qt关键字高亮

    qt的高亮显示主要是使用qsyntaxhighlighter类,由于qsyntaxhighlighter是抽象基类,所以需要继承并自己实现 //头文件 #ifndef MARKDOWN_HIGHLIG ...