转自:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html

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"添加到字符串池中,然后再返回它的引用。

)

java equals 区别_Java中equals和==的区别相关推荐

  1. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  2. java equals 的区别_java中equals和==的区别是什么-百度经验

    在jdk1.5以上的版本中,基本类型和封装类能自动转化,与String类型的对象和字符串常量类似. Integer i1 = 123;        Integer i2 = 123          ...

  3. java equals比较_Java中equals()和==的比较

    今天写点简单点的吧,equals和==的作用都是作比较,但==是条件运算符,而equals是一个继承了object类的方法,也就是说所有类都有一个equals方法,我们先来看一下equals方法在ob ...

  4. java null和 的区别_java中null和的区别

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...

  5. java 非法重载_JAVA中重写和重载区别

    重写和重载区别 重写方法的规则如下: 参数列表:必须与被重写方法的参数列表完全匹配. 返回类型:必须与超类中被重写的方法中声明的返回类型或子类型完全相同 访问级别:一定不能比被重写方法强,可以比被重写 ...

  6. c语言equals用法,C# 中 equals( ) 和 == 的区别和用法

    Equals: 下面的语句中,x.y 和 z 表示不为 null 的对象引用. * 除涉及浮点型的情况外,x.Equals(x) 都返回 true. * x.Equals(y) 返回与 y.Equal ...

  7. java和equals区别_JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们"实际意义上相等",比较的是内容,而不是引 ...

  8. java equals equalsignorecase 性能_Java中equals()、equalsIgnoreCase()和==的区别

    用久了C#,在Java中,判断一个字符串还是习惯性的用了==,但是总是不能按照正确的判断分支运行,后来才想起来Java中是有equals的,然后就有引出了equalsIgnoreCase. 这三种的正 ...

  9. JAVA中equals空_Java中为什么查询空字符串跟判断是否为null的时候可以不用equals?...(亲测)

    if(id!=null&&id!="") 代码中经常这样写,空字符串跟null 都不用equals吗? 首先,你的 id!="" 这种写法是错误 ...

最新文章

  1. VS2010与Qt设置出现红线提示
  2. RGB图像重建非刚性物体三维形状(CVPR)
  3. 近期活动盘点:2019第六届世界互联网大会、面向智慧城市的人本尺度城市形态:理论方法与实践讲座、高级管理人员AI大数据能力研修班...
  4. corda_使用Spring WebFlux从Corda节点流式传输数据
  5. 部署项目,所谓“部署”到底是在干什么?
  6. php常量变量连接,PHP常量及变量区别原理详解
  7. 国科大prml13-概率图(CRF,HMM)
  8. ip, tcp, udp, icmp header
  9. pthread_detach():主线程与子线程分离,子线程结束后,资源自动回收
  10. CMU和谷歌联手放出XL号Transformer!提速1800倍 | 代码+预训练模型+超参数
  11. linux下看io等待时间,Linux下用iostat探测IO使用情况
  12. java treemap_Java TreeMap的排序
  13. 计算机的组成 —— 主板
  14. 在网页中加入透明flash代码
  15. 遥感式雷达监测水位流速设备
  16. 【Unity2D入门教程】简单制作一个弹珠游戏之制作场景①(开场,结束,板子,球)
  17. 商业模式新生代_【骆新荐书】商业模式新生代
  18. SQL 校验身份证号格式
  19. P4924 [1007]魔法少女小Scarlet
  20. mysql源生插入数据_php+mysql源生连接数据库和增删改查数据

热门文章

  1. Android Widget 中ListView加载网络图片
  2. 浅谈Python http库 httplib2
  3. Linq中的Where与SkipWhile
  4. .NET简谈组件程序设计之(手动同步)
  5. [Java] Overrid 方法重写
  6. event loop、进程和线程、任务队列
  7. Ooui:在浏览器中运行.NET应用
  8. linux常用运维命令【转】
  9. tortoisesvn › prefer local prefer repository
  10. 使用python 的paramiko制作堡垒机