黑马程序员技术交流社区

标题: 小白求助,关于If和Switch得条件语句中应用String [打印本页]

作者: 勤奋小白    时间: 2016-12-2 07:57
标题: 小白求助,关于If和Switch得条件语句中应用String
以下两种情况,都键入m值为你好,switch执行,if不执行,为什么?
Switch(m){
case "你好":
     ........
}

n="你好"
If(m==n){
    执行语句;
}

作者: dopamine    时间: 2016-12-2 09:07
键入的“你好”是string类型的,第一个case“你好”表示直接输入的是“你好”就可以执行下一步,而if里面虽然m和n都是被赋值了“你好”,但m==n比较的却是m和n的地址值,这两个地址值显然是不同的,string类型有独特的比较方法,我也是小白,具体忘了是怎样比较的你要去翻一下书了

作者: Antihank    时间: 2016-12-2 10:58
String是引用数据类型,比较引用数据类型用他自身的equals方法。
所有放在if的判断框内的表达式结果都要为boolean值,你需要用"你好"调用equals方法比较你传入的m。
if("你好".equals(m)){}

作者: Object_ee    时间: 2016-12-2 18:05
这个都是可以运行出来的。二楼讲的有点出入。String类重写了基类的equals方法,所以在比较字符串时并不是比较地址,等同于==。


作者: Object_ee    时间: 2016-12-2 18:08
Object_ee 发表于 2016-12-2 18:05
这个都是可以运行出来的。二楼讲的有点出入。String类重写了基类的equals方法,所以在比较字符串时并不是比 ...

应该是“一楼”,不好意思发错了。我也小白,常看源码,API,带入程序运行,多多练。

作者: 勤奋小白    时间: 2016-12-2 22:35
谢谢各位了


作者: 勤奋小白    时间: 2016-12-3 00:27
Object_ee 发表于 2016-12-2 18:05
这个都是可以运行出来的。二楼讲的有点出入。String类重写了基类的equals方法,所以在比较字符串时并不是比 ...

这个键入变量如果是成员变量,if就不能运行了,你的都是局部变量

作者: Object_ee    时间: 2016-12-3 17:04
勤奋小白 发表于 2016-12-3 00:27
这个键入变量如果是成员变量,if就不能运行了,你的都是局部变量

如果是成员变量,那你在main方法中swhich也执行不了吧,因为main是static的,而你的成员变量没有静态。其次,如果你成员变量都静态了,那main中,switch还是if都可以运行。最好把你跑不了的图上上来。交流交流。

作者: 风云1989    时间: 2016-12-3 19:56
public class throwsDemo02 {
        public static void main(String [] args)
        {
                String m="你好";
                String n="你好";
                if(m==n){
                        System.out.println(m==n);
                }
                switch(m){
                case "你好":
                                System.out.println("你好");
                    break;
                }       
}
}
输出结果为: true 你好
当String 使用直接赋值的方式后,只要是以后声明的字符串内容相同,则都不会再开辟新的内存空间

作者: 风云1989    时间: 2016-12-3 19:59
dopamine 发表于 2016-12-2 09:07
键入的“你好”是string类型的,第一个case“你好”表示直接输入的是“你好”就可以执行下一步,而if里面虽 ...

你这样理解有误,你没明白java中提供了一个字符串常量池来保存全部的内容!
作者: cjc147    时间: 2016-12-3 20:55
本社这个问题我觉得就不对,这个场景下,理论上说都是运行的
作者: 勤奋小白    时间: 2016-12-4 13:01
cjc147 发表于 2016-12-3 20:55
本社这个问题我觉得就不对,这个场景下,理论上说都是运行的

直接上图,请大神指教


作者: 勤奋小白    时间: 2016-12-4 13:02
Object_ee 发表于 2016-12-3 17:04
如果是成员变量,那你在main方法中swhich也执行不了吧,因为main是static的,而你的成员变量没有静态。其 ...

图来了


作者: Object_ee    时间: 2016-12-8 17:11
勤奋小白 发表于 2016-12-4 13:01
直接上图,请大神指教

new scanner是在堆内存中开辟空间,String v指向的是堆内存的地址,里边放的你键盘录入的数据。String v1 =”你好”  是在方法区的常量池中开辟空间,并指向。==在比较引用数据类型时比较的是地址,所以不执行。switch() ……case“” 括号中不存在比较,所以首先会拿到的是“你好”,再和case“”比较。这个底层应该也是用==号的,你可以查一下。所以switch执行,if不执行。一家之言,望指正。

作者: 勤奋小白    时间: 2016-12-9 08:06
Object_ee 发表于 2016-12-8 17:11
new scanner是在堆内存中开辟空间,String v指向的是堆内存的地址,里边放的你键盘录入的数据。String v1 ...

switch中有equals语句

作者: Object_ee    时间: 2016-12-9 11:32
勤奋小白 发表于 2016-12-9 08:06
switch中有equals语句

记得jdk1.7后,才加了string类的。1.5之前只能是转换为int类的。所以怎么可能是equals?!

作者: 勤奋小白    时间: 2016-12-9 12:45
Object_ee 发表于 2016-12-9 11:32
记得jdk1.7后,才加了string类的。1.5之前只能是转换为int类的。所以怎么可能是equals?!
...

看一下源代码吧,我昨天用了断点调试

作者: 勤奋小白    时间: 2016-12-11 23:31
Object_ee 发表于 2016-12-9 11:32
记得jdk1.7后,才加了string类的。1.5之前只能是转换为int类的。所以怎么可能是equals?!
...

equals,看一下源码比较好,我是小白不太懂,说的不对,请多多指教

作者: 试着try    时间: 2016-12-11 23:46
一个引用指向常量池,一个指向堆内存吧

作者: 勤奋小白    时间: 2016-12-11 23:51
试着try 发表于 2016-12-11 23:46
一个引用指向常量池,一个指向堆内存吧

接收的应该是指向的堆内存,定义的指向常量池
Switch执行的原因是因为Switch内存在equals吗?

作者: wujianming    时间: 2016-12-12 00:50
5楼,你上面截图的那个代码中m1==n,两个是不相等的吧。




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