2019独角兽企业重金招聘Python工程师标准>>>

java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
  他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
  对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

1 public class TestString {
2  public static void main(String[] args) {
3 String s1 = "Monday";
4 String s2 = "Monday";
5 if (s1 == s2)
 6 {
7 System.out.println("s1 == s2");}
8 else{
9 System.out.println("s1 != s2");}
10 }
11 }

编译并运行程序,输出:s1 == s2说明:s1 与 s2 引用同一个 String 对象 -- "Monday"!
2.再稍微改动一下程序,会有更奇怪的发现:

public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}

我们将s2用new操作符创建
程序输出:
s1 != s2
s1 equals s2
说明:s1 s2分别引用了两个"Monday"String对象

3. 字符串缓冲池
原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
将s2引用s1所引用的对象"Monday"
第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创建在内存中。他们的值相同,但是位置不同,一个在池中游泳一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?

4.再次更改程序:

public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
s2 = s2.intern();
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}

这次加入:s2 = s2.intern();
程序输出:
s1 == s2
s1 equals s2
原 来,(java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方 法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。

转载于:https://my.oschina.net/HerrySun/blog/509168

理解“==”和“equals()”相关推荐

  1. 深入理解== 和 equals 的区别

    深入理解== 和 equals 的本质区别 简介 区别: 图解: 注意点: 源码分析: 总结 分享一波:程序员赚外快-必看的巅峰干货 简介 初学者常常被"= ="和'equals ...

  2. 02 理解==与Equals()的区别及用法 1214

    02 理解==与Equals()的区别及用法 01 02 03

  3. 运用简单的超市购物车系统,理解重写equals、hashcode的意义

    更多干货见博主个人网站:https://blog.zhenglin.work 运用简单的超市购物车系统,理解重写equals.hashcode的意义,以及map的学习 商品类: 先编写一个商品类,要有 ...

  4. Java源码解析:深入理解==和equals()

    1.结论 1.1 == 1.所有原始数据类型,比较的是值 2.所有的对象比较的是内存地址 注意点:Integer类有对象池[-128,127] 1.2 equals()方法 1.未重写的equals( ...

  5. 关于 hashcode 和 equals

    首先需要明白 hashCode() 和equals是Object类中已经被定义好的,所以在java中定义的任何类都有这两个方法.其中原始的equals()方法是用来比较两个对象的地址值,而原始的has ...

  6. equals()方法详解

    Java语言中equals()方法的使用可以说比较的频繁,但是如果轻视equals()方法,一些意想不到的错误就会产生.哈哈,说的有点严重了~ 先谈谈equals()方法的出身.equals()方法在 ...

  7. “==”和equals()那些事

    在最初学习Java时候,经常会看到类似于"=="和equals()的比较这种说法,那时候,不知道在哪里听到的说法是,一个比较地址一个比较值...,显然这个说法是极其不严谨的,回过头 ...

  8. StringUtils.isBlank,equals与==的判断参数分析

    StringUtils之isBlank分析 StringUtils之equals分析 String.equals报java.lang.NullPointerException 本篇为总结篇,看不懂结合 ...

  9. 题库明细 C#语言和SQL Server

    题库明细 C#语言和SQL Server 第一个C#程序 石振威 了解C#常用关键字(32道) 掌握变量的定义和使用方法(20道) 掌握C#控制台程序的结构组成(20道) 能够使用using和name ...

最新文章

  1. luogu P3393 逃离僵尸岛(点权最短路 + 多源BFS)
  2. 四十三、文件存储空间管理
  3. hadoop生态搭建(3节点)-05.mysql配置_单节点
  4. react ,ant Design UI中table组件合并单元格并展开详情的问题
  5. NanoPi NEO Air使用二:固件烧录
  6. 获得客户端的时区(get client-side time zone by JS)
  7. fon在计算机网络中代表什么,计算机网络自顶向下方法第一章学习
  8. 炒房客共识:深圳楼市要撑不住了
  9. java异常及错误处理大纲
  10. Android工程的目录说明
  11. Kafka学习之(四)PHP操作Kafka
  12. weblogic部署静态网页
  13. 复数中欧拉公式与计算机,欧拉公式
  14. 我的世界java版tp_神奇的tp指令 我的世界tp指令的用法
  15. 最大流 edmonds carp
  16. Mac电脑如何通过终端隐藏应用程序?
  17. Student Alcohol Consumption学生酒类消费
  18. 微信小程序之小程序审核
  19. matlab仿真igbt,逆变器用IGBT吸收电路的Matlab仿真研究
  20. 年金、净现值NPV、IRR、现值PV、终值FV、EAR等常见概念

热门文章

  1. java int越界_用位运算判断int类型变量越界
  2. Visual Studio 2017强制更新方法
  3. java ssh文件下载_Java使用SSH从远程服务器下载文件
  4. C什么k什么_G、D、C、Z、T、K、L、Y,这些字母和火车级别有什么关系
  5. gets会读取回车键吗_Linux Shell 读取从键盘输入的数据
  6. Google Expeditions项目今年获得AR支持
  7. android开发常见的设计模式,Android开发有哪些常用设计模式?
  8. matlab多径误差包络,MIMO-OFDM系统添加多径信道仿真结果误差很大
  9. springboot定时发送短信_springboot 整合websocket实现消息推送(主动推送,具体用户推送,群发,定时推送)...
  10. 英特尔挖走苹果M1芯片功臣,他主导苹果放弃x86架构