黑马程序员技术交流社区

标题: 关于“equals()”和“==”的使用总结 [打印本页]

作者: 棉/mg花/x糖    时间: 2013-5-21 16:46
标题: 关于“equals()”和“==”的使用总结
本帖最后由 棉/mg花/x糖 于 2013-5-21 16:52 编辑

关于“equals()”和“==”的使用总结

(1)str1 == str2表示比较str1与str2两个字符串是否引用同一个对象;
(2)str.equals(str2)是表示比较str1与str2两个字符串的内容是否相等;
(3)为了比较基本数据类型变量的值是否相等一般是使用“==”,但这个办法并不适用String对象(或者其
        他任何对象)。即不适用引用类型的比较

请看下面的例子:Test4.java
(1)输出结果为:
         false
         false
         true
         true
         false
         true
(2)对于str1和str3,都是引用同一个字符串常量"abc",其内容也当然相同。
        故"str1 == str3"和"str.equals(str3)"均取真值true。
(3)对于str1和str4,内容虽然相同,但引用的却不是同一对象。原因在于:
        str1引用的是的编译时就确定的字符串常量,而str4引用的是程序运行时才创建的对象。

也就是说:字符串常量"abc"是在编译时就写到内存了。

示例源码如下:
  1. package com.yb.Test;

  2. public class Test4 {
  3.     /**
  4.      * @param args
  5.      */
  6.     public static void main(String[] args) {
  7.         // TODO Auto-generated method stub
  8.         String str1 = "abc";
  9.         String str2 = "Abc";
  10.         String str3 = "abc";
  11.         String str4 = new String("abc");
  12.         System.out.println(str1 == str2);        //输出false
  13.         System.out.println(str1.equals(str2));   //输出false
  14.         System.out.println(str1 == str3);        //输出true
  15.         System.out.println(str1.equals(str3));   //输出true
  16.         System.out.println(str1 == str4);        //输出false
  17.         System.out.println(str1.equals(str4));   //输出true
  18.     }
  19. }
复制代码

作者: 棉/mg花/x糖    时间: 2013-5-21 17:22
弱弱问一下,请问资源分享能不能给技术分啊???

我每天都发一两篇知识总结进行资源分享,能不能给技术分啊???

作者: Sword    时间: 2013-5-21 20:26
棉/mg花/x糖 发表于 2013-5-21 17:22
弱弱问一下,请问资源分享能不能给技术分啊???

我每天都发一两篇知识总结进行资源分享,能不能给技术分 ...

嗯,资源分享可以加技术分,但不是所有的资源分享都能加技术分,要有一定的数量和含金量才可以加。建议楼主集中整理一下所学的知识发上来
作者: 棉/mg花/x糖    时间: 2013-5-22 09:30
Sword 发表于 2013-5-21 20:26
嗯,资源分享可以加技术分,但不是所有的资源分享都能加技术分,要有一定的数量和含金量才可以加。建议楼 ...

哦,那请问一下,您所说的集中整理是指将所有知识点放到一个帖子中呢还是放到统一指定某个板块中啊?
还有,数量要到什么程度才能给技术分啊,谢谢^_^


作者: 神之梦    时间: 2013-5-22 09:41
新手问下,楼主解释这条语句的时候,不是很明白,望详解下 System.out.println(str1.equals(str4));   //输出true

作者: 棉/mg花/x糖    时间: 2013-5-22 10:06
本帖最后由 棉/mg花/x糖 于 2013-5-22 10:17 编辑
神之梦 发表于 2013-5-22 09:41
新手问下,楼主解释这条语句的时候,不是很明白,望详解下 System.out.println(str1.equals(str4));   //输 ...


我X,技术分都25分了,还是新手,俺不信,太谦虚了吧.......

不过既然有问,就当你是考验我了:
System.out.println(str1.equals(str4));   //输出true

首先得明白boolean equals()这个方法的作用这个方法是判断括号里面和和括号外面(即字符串str1和str4)内容是否相等返回值为布尔值

这么跟你说吧:表达式str1.equals(str4))就是判断字符串常量str1字符串对象str4的内容是否相同
显然为true。

这里println(str1.equals(str4))里面的表达式的值显然为true,因此这条语句,就是告知系统输出一个“true”的布尔值。

作者: 神之梦    时间: 2013-5-22 10:15
棉/mg花/x糖 发表于 2013-5-22 10:06
我X,技术分都25分了,还是新手,俺不信,太谦虚了吧.......

不过既然有问,就当你是考验我了:

技术分和技术完全是两码事,技术分靠逛论坛回答问题,提出技术方面的问题就很容易获得。。。还有很多其他的获得方式,像楼主这样发资源分享的技术帖,也是so easy获得的

我还在看Java基础,String这个对象的引用还没了解到,不过视频中老师使用频繁,对楼主那句话不理解的地方:
楼主说的是equals()比较的是内容。但是str4是对象的引用,也就是说equals(str4)传入的实参应该是一个地址值,而str1我可以理解为一个存有字符串的变量吗?如果这样,为什么结果还是true?
主要就是equals()这个方法比较的到底是引用的地址值,还是引用指向的对象内的值??
作者: Sword    时间: 2013-5-22 10:24
本帖最后由 Sword 于 2013-5-22 10:26 编辑
棉/mg花/x糖 发表于 2013-5-22 09:30
哦,那请问一下,您所说的集中整理是指将所有知识点放到一个帖子中呢还是放到统一指定某个板块中啊?
还 ...

楼主,集中整理是说你可以定期将所学知识点整理一下,对多线程的总结、集合框架的总结、IO流的总结概述等等,比如说多线程的总结单独发一个帖子是可以的,最好整理的是一块知识点;如果是单个零散的知识点,比如说重载和重写的比较、还有就像你发的这个帖子,可以将几个知识点整理成一个帖子,数量没有限制,最好不要少于三个,还是发在20期的版块就行。

如果是学习资料分享的话,要有一定的数量可以加技术分,但是如果说今天发一个jdk6.0文档的资源分享,明天发一个PDF的电子书资源分享,这样是不能加分的,不过大家反应好的话可以给加金币,金币可以用来下载别人分享的付费资料,也是不错的 。

其实也没有具体的规定,只要你的资源和学习总结有价值,都有一定的奖励,只是奖励不同而已,现在只要不是靠资源分享刷技术分,就像上面说的一个帖子发一个学习文档之类的。一般好的资源分享都给加技术分了,希望楼主继续努力,加油!
作者: 棉/mg花/x糖    时间: 2013-5-22 10:27
本帖最后由 棉/mg花/x糖 于 2013-5-22 10:33 编辑
神之梦 发表于 2013-5-22 10:15
技术分和技术完全是两码事,技术分靠逛论坛回答问题,提出技术方面的问题就很容易获得。。。还有很多其他 ...


严格的说,理解为字符串变量更恰当,因为从面向过程设计的角度来说,它和普通变量的定义没啥区别。
这里,我不得不在强调一下,对于引用类型,“==”判断的才是地址equals()判断的却是内容!!!

尽管str4是引用对象,str1是字符串变量(如你所说),那么equals()则是对他们里面内容进行判断,显然为true。
相反,“==”才是对他们的地址进行判断,显然为false。

但如果“==”两边是基本数据类型,则是对具体值进行判断,而不是地址。

另外,要注意:方法boolean equals()方法仅适用于字符串内容的判断,不适用于基本数据类型的判断。

例如:
int a = 3,b = 5;
System.out.println(a.equals(b));  //会报错,程序通不过

作者: 棉/mg花/x糖    时间: 2013-5-22 10:37
Sword 发表于 2013-5-22 10:24
楼主,集中整理是说你可以定期将所学知识点整理一下,对多线程的总结、集合框架的总结、IO流的总结概述等 ...

好的,明不白了,定不负汝望!谢谢^_^

作者: 棉/mg花/x糖    时间: 2013-5-22 10:39
神之梦 发表于 2013-5-22 10:15
技术分和技术完全是两码事,技术分靠逛论坛回答问题,提出技术方面的问题就很容易获得。。。还有很多其他 ...

equals() 引用的是对象的具体值:)
作者: Sword    时间: 2013-5-22 10:51
棉/mg花/x糖 发表于 2013-5-22 10:37
好的,明不白了,定不负汝望!谢谢^_^

不客气,都是应该做的:handshake




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2