当前位置:  编程技术>java/j2ee

java中equals和等号(==)的区别浅谈

    来源: 互联网  发布时间:2014-10-24

    本文导语:  java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值。 2.复合数据类型(类)   当他们用(==)进行比较的时候,比...

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方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

代码如下:

 publicclass TestString {
 publicstaticvoid main(String[] args) {
 String s1 ="Monday";
 String s2 ="Monday";
 if (s1 == s2)
 {
 System.out.println("s1 == s2");}
 else{
 System.out.println("s1 != s2");}
 }
 }

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

代码如下:

publicclass TestString {
publicstaticvoid 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.再次更改程序:
代码如下:

publicclass TestString
{
publicstaticvoid 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命名空间javax.rmi.corba接口stubdelegate的类成员方法: equals定义及介绍
  • java equals函数用法详解
  • java命名空间java.awt类displaymode的类成员方法: equals定义及介绍
  • java的equals和==的比较示例
  • java命名空间javax.swing枚举rowfilter.comparisontype的类成员方法: equal定义及介绍
  • java中"==" 与equals方法的使用
  • java命名空间javax.xml.datatype类datatypeconstants的类成员方法: equal定义及介绍
  • java String 类的一些理解 关于==、equals、null
  • java命名空间java.text类dateformat的类成员方法: equals定义及介绍
  • java中 == 与 equal 的区别讲解
  • java命名空间java.text类dateformatsymbols的类成员方法: equals定义及介绍
  • 基于Java字符串 "==" 与 "equals" 的深入理解
  • java命名空间java.text类decimalformatsymbols的类成员方法: equals定义及介绍
  • java中hashCode方法与equals方法的用法总结
  • java命名空间java.text类parseposition的类成员方法: equals定义及介绍
  • java命名空间java.text类decimalformat的类成员方法: equals定义及介绍
  • java命名空间java.text类fieldposition的类成员方法: equals定义及介绍
  • java命名空间java.text类numberformat的类成员方法: equals定义及介绍
  • java命名空间java.security类permission的类成员方法: equals定义及介绍
  • java命名空间java.lang类stacktraceelement的类成员方法: equals定义及介绍
  • java命名空间java.net类urlstreamhandler的类成员方法: equals定义及介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 编程技术其它 iis7站长之家
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3