黑马程序员技术交流社区

标题: 关于“==”运算符的使用 [打印本页]

作者: woshihq    时间: 2014-5-24 01:07
标题: 关于“==”运算符的使用
本帖最后由 woshihq 于 2014-5-25 15:50 编辑

初学Java,想问下为什么我这段代码运行不出正确的结果呢??
String  a=hello ;
String  b=hello;
if(a==b)
System.out.printf("a和b字符串相同");
“==”不是应该指两者相等时使用的吗???求解!!!

作者: BigKarel    时间: 2014-5-24 01:18
不是==的问题,你声明的是字符串要加上“”才行
作者: felixzr    时间: 2014-5-24 01:37
1.定义的String类型需要“”
2println写错
作者: 沉默的爱    时间: 2014-5-24 01:54
首先,,我想说的是,楼说指出的问题都是对的!!String赋值时要加上“”才表示是字符串!打印语句应该是
System.out.println();  或者是System.out.print();不同之处在于一个换行,一个不换行!
之后我要说的是一些基本的解决问题的办法,在编译时报错,它会指出你错在哪一行,是什么类型的错误,还有,,一些小错误会引起连锁反应!所以,编译报错时就可以有相应的办法!!如果不是运行时的错误,一般都能看得懂!它指出在哪行错了,你就去哪行找,,反复找几遍,再看看书上相应的示例,,应该就能找到问题的所以,但是有一点要注意,就是中文输入法和英文输入法是有区别的,有时不太容易找出来,最简单的办法就是,如果你实在是没有找到那行的错误,就检查一下输入法,把代码重新敲一遍!!查错误时,应该从报错的第一个开始得,,因为有的错误会起连锁反应,有时报很多错,但你改掉第一个,,就所有问题都解决了!

这是个人一点点经验,不喜勿喷!!!
作者: 编程学徙    时间: 2014-5-24 04:14
本帖最后由 编程学徙 于 2014-5-24 04:16 编辑

关于在字符串比较中equals方法和“==”运算符的不同之处。
首先,假定有字符串a和b.
a==b   这个boolean表达式,只要a和b 当中字符串内容相同,则值为true,否则,值为false;
a.equals(b)  这个boolean表达式,只有当a和b引用的是同一片内存时(同一片内存,字符串当然相同),其值才为true,否则,值都为false;

以下是代码验证:
  1. <blockquote>class Str01
复制代码
class Str01
{
        public static void main(String[] args)
        {
                String a = "hello";
                String b = "hello";
                String c = new String("hello");
                if(a==b)
                {
                        System.out.printf("a和b引用同一片内存\n");
                }
                else
                {
                        System.out.printf("a和b不引用同一片内存\n");
                }
                if(a.equals(b))
                {
                        System.out.printf("a和b字符串相同\n");
                }
                else
                {
                        System.out.printf("a和b字符串不同\n");
                }
                if(a==c)
                {
                        System.out.printf("a和c引用同一片内存\n");
                }
                else
                {
                        System.out.printf("a和c不引用同一片内存\n");
                }
                if(a.equals(c))
                {
                        System.out.printf("a和c字符串相同\n");
                }
                else
                {
                        System.out.printf("a和c字符串不同\n");
                }
        }
}



以下是运行结果:



12133.jpg (53.66 KB, 下载次数: 101)

12133.jpg

作者: 想飞的鱼    时间: 2014-5-24 08:26
首先说说==的用法,它属于比较运算符,结果是boolean类型的,如果是基本数据类型的话,比较的是==两边的值,如果是引用数据类型的话,比较的是引用变量指向的那个地址值。另外对于字符串你要用双引号引起来,如果是比较字符串的内容是否相同的话就用equals方法,具体代码如下,希望帮到你
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s1 = "hello";//字符串要用双引号引起来
  6.                 String s2 = "hello";
  7.                 /*
  8.                 这是比较s1和s2是否指向同一个对象,因为字符串对象一旦被初始化就不能被改变,所以
  9.                 在内存中只有一个"abc"对象,s1和s2都指向它
  10.                 */
  11.                 if (s1 == s2)
  12.                         System.out.println("s1 == s2");
  13.                 else
  14.                         System.out.println("s1 != s2");
  15.                 /*
  16.                 如果比较字符内容是否相同的话就用equals方法了,
  17.                 String类中复写了Object类的equals方法,用于比较字符串内容是否相同
  18.                 */
  19.                 if (s1.equals(s2))
  20.                         System.out.println("s1和s2的内容相同");
  21.                 else
  22.                         System.out.println("s1和s2的内容不同!");
  23.         }
  24. }
复制代码

作者: 张志民    时间: 2014-5-24 08:37
String赋值时要加上“”,==对于引用型变量比较的是地址值
作者: 没壳的蜗牛    时间: 2014-5-24 14:31
学习了!
作者: 丁绍然    时间: 2014-5-24 15:25
你没加双引号啊,String的==是比较字符串存放的地址。应该用a.equals(b),
这才是比较字符串的内容。看到后面就知道了
作者: Blackay    时间: 2014-5-24 15:44
==是比较的地址 明显a和b指向的地址不同啊
作者: woshihq    时间: 2014-5-25 00:02
谢谢,我明白了
作者: woshihq    时间: 2014-5-25 00:03
丁绍然 发表于 2014-5-24 15:25
你没加双引号啊,String的==是比较字符串存放的地址。应该用a.equals(b),
这才是比较字符串的内容。看到 ...

谢谢,我只知道该怎么用了
作者: woshihq    时间: 2014-5-25 00:04
想飞的鱼 发表于 2014-5-24 08:26
首先说说==的用法,它属于比较运算符,结果是boolean类型的,如果是基本数据类型的话,比较的是==两边的值 ...

3q!!!!!!!!!!!
作者: java木    时间: 2014-5-25 00:06
“==”该运算符号是比较两个个对象的地址值是否相等。你比较的两个字符串类容是相同的,但他们适量个对象,在内存中的地址值是不可能相同的。
作者: ZHao.Xiao    时间: 2014-5-25 00:23
比较的是数据在内存存放的位置
作者: ★魔_➩τ咒    时间: 2014-5-25 02:46
你定义字符串要加双引号的亲!
作者: 27ZJQ    时间: 2014-5-29 15:57
学习了!
作者: fenzheng    时间: 2014-5-29 15:59
定义String 要加"",第二,java里面好像没有printf()的打印方法,这个是c语言的,你弄错了,system,out.println()才是对的
作者: Sevenette    时间: 2014-5-29 18:11
String  a="hello" ;
String  b="hello";
这里的问题
作者: 13556793092    时间: 2014-5-29 18:23
你的代码无法正确运行时因为你在定义字符串的时候没有加"".
“==”在引用变量中是用来比较两者的地址值是否相等
正确代码解析如下:
//第一次创建String类a对象hello,并将该对象存放在字符串常量池中
String  a="hello" ;
//当第二次出现同样的字符串时,直接引用第一次创建出来的字符串
String  b="hello";
//由于a,b都指向的是同一个字符串,因此a的地址值和b的地址值相等,执行if语句打印
if(a==b)
System.out.printf("a和b字符串相同");
作者: woshihq    时间: 2014-5-29 22:11
13556793092 发表于 2014-5-29 18:23
你的代码无法正确运行时因为你在定义字符串的时候没有加"".
“==”在引用变量中是用来比较两者的地址值是否 ...

谢谢!!!!!!!!!!!!!!
作者: 钟翠翠    时间: 2014-6-14 17:23
Java中==号比较的是字符串的内存地址,一般用x.equals(y) 来比较字符串是否一样
作者: 霜林醉zhx    时间: 2014-6-15 00:29
字符串hello要写成"hello"
作者: 掌柜的--刘饮    时间: 2014-6-19 00:07
想飞的鱼 发表于 2014-5-24 08:26
首先说说==的用法,它属于比较运算符,结果是boolean类型的,如果是基本数据类型的话,比较的是==两边的值 ...

学习了。给力:)
作者: 906822773    时间: 2014-6-22 09:02
==是逻辑运算符
作者: uu993    时间: 2014-6-22 09:23
编程学徙 发表于 2014-5-24 04:14
关于在字符串比较中equals方法和“==”运算符的不同之处。
首先,假定有字符串a和b.
a==b   这个boolean表 ...

正解,以后遇到不明白的事情,可以自己写代码实验一下,运行出来的都是正解~
作者: 小周务商    时间: 2014-6-22 09:32
大哥。字符串为什么不加双引号?
作者: NOTHANKYOU    时间: 2014-8-7 18:41
                                              拿金币
作者: GYSWL    时间: 2014-8-8 07:25
String的==是比较字符串存放的地址。equals是比较字符串的内容
作者: yl82846094    时间: 2014-8-26 18:57
我看到printf了,呵呵,好熟悉的感觉,这个不是C语言里面的么?
作者: 静水流华    时间: 2014-8-31 17:57
编程学徙 发表于 2014-5-24 04:14
关于在字符串比较中equals方法和“==”运算符的不同之处。
首先,假定有字符串a和b.
a==b   这个boolean表 ...

“==”表示的是引用值相同,equals表示的是两个对象的内容是否相同
作者: 静水流华    时间: 2014-8-31 18:03
想飞的鱼 发表于 2014-5-24 08:26
首先说说==的用法,它属于比较运算符,结果是boolean类型的,如果是基本数据类型的话,比较的是==两边的值 ...

“hello”在内存中是存放在栈中还是存放在堆中,
作者: 段sir!    时间: 2014-9-14 23:12
你的hello要加上“”,才是字符串。加上就可以了
作者: pj1988    时间: 2015-1-5 23:23
大神们就是牛,顶一个。。。。。。。。。。。。。。
作者: wenyu    时间: 2015-2-12 14:50
首先,没有加“”号;其次java中没有printf,java中是print或者println;还有一点,你的a比b多了一个空格……
作者: 黑马小夏    时间: 2015-3-12 00:17
已经学习,感学楼主
作者: 麻仁博    时间: 2015-3-22 13:27
本帖最后由 麻仁博 于 2015-3-22 13:38 编辑

我的理解: 应该是说  a 和 b 这俩个 变量  用== 相比较的话  是在比较他们的地址,因为 给a b 赋值,意思就是开辟出一个内存存放这个值,然后这个值存放的地方有一个地址,再将这个地址 给 a 和b 。所以你不能直接将a 和b 相比。 我复制了下 你的代码运行 貌似也是不可以。。好像是你那个 if(a==b)那里 有错 中英语状态下 输入字符有误? 我自己重新打了一遍就可以了。。

作者: 初夜告白    时间: 2015-4-2 15:31
加油加油加油。。。。。。。。。。。。。。。
作者: 初夜告白    时间: 2015-4-2 15:35
想飞的鱼 发表于 2014-5-24 08:26
首先说说==的用法,它属于比较运算符,结果是boolean类型的,如果是基本数据类型的话,比较的是==两边的值 ...

很厉害啊................
作者: 叶松ye    时间: 2015-4-5 13:08
了解了。
作者: WangHe9527    时间: 2015-4-14 22:21
String a = "hello";  要这么定义    String是字符串类型   需要加双引号标识
作者: 闪电无忧    时间: 2015-6-6 22:25
看看大家的交流,受益匪浅啊
作者: 周飞飞    时间: 2015-6-25 08:49
字符串虽然相等但是他是两个不同的对象,String a = "hello" 相当于String  a = new String("hello"),或者String a = new String (); a ="hello"
作者: 菩提本无树    时间: 2015-7-7 22:40
"=="是比较运算符,结果是boolean类型,两边如果是基本数据类型,比较的是"=="两边的值;如果两边是引用数据类型,比较的则是引用变量指向的那个地址值而不是所引用数据的值。
作者: 王小战    时间: 2015-7-16 14:39
String是引用类型,==比较的是哈希值(相当于内存地址),两个的字符串开辟了不同的内存空间,用String类的
equals()方法比较的是字符串值
作者: 岁月草-    时间: 2015-8-15 14:31
布尔类型的表达结果吧
作者: Z攻城狮    时间: 2015-8-16 06:37
受益良多
作者: 舒玉琛    时间: 2015-9-12 20:50
学习了  
作者: 卓依    时间: 2015-10-11 12:52
还有一点是因为String是重写了Equals方法,从而实现的是比较字符串的值是否相等.
作者: 江汉    时间: 2016-4-9 07:14
判断是否相等
作者: yxpzzl    时间: 2016-4-16 00:09
简单来讲."=="是运算符,不能用于此处
作者: 老人与海    时间: 2016-4-16 13:35
a和b引用同一块内存时才相同
作者: fanhongwei1105    时间: 2016-5-24 00:17
你没加双引号啊,String的==是比较字符串存放的地址。应该用a.equals(b),
这才是比较字符串的内容。看到后面就知道了
作者: linguoqun    时间: 2016-8-2 22:31
是的,==是用来判断左右两边是否相等。而=(一个等于号)则是赋值符号,将右边的值赋给左边。
作者: 亮仔开发    时间: 2017-3-3 17:49
定义字符串a和b时,所赋的值应该加上双引号,另外==比较String类型的数据时,比较的是堆内存中 的地址值是否相等。==只有在比较基本数据类型时,比较的才是其值是否相等。
作者: chentudong    时间: 2017-4-2 23:03
字符串要加双引号,引用类型==比较地址值是否相同,基本类型比较的是值是否想同。b.equals(a);才是判断两个字符串是否相等(区分大小写)




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