A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

以下两种情况,都键入m值为你好,switch执行,if不执行,为什么?
Switch(m){
case "你好":
     ........
}

n="你好"
If(m==n){
    执行语句;
}
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端

20 个回复

倒序浏览
键入的“你好”是string类型的,第一个case“你好”表示直接输入的是“你好”就可以执行下一步,而if里面虽然m和n都是被赋值了“你好”,但m==n比较的却是m和n的地址值,这两个地址值显然是不同的,string类型有独特的比较方法,我也是小白,具体忘了是怎样比较的你要去翻一下书了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
String是引用数据类型,比较引用数据类型用他自身的equals方法。
所有放在if的判断框内的表达式结果都要为boolean值,你需要用"你好"调用equals方法比较你传入的m。
if("你好".equals(m)){}
回复 使用道具 举报
这个都是可以运行出来的。二楼讲的有点出入。String类重写了基类的equals方法,所以在比较字符串时并不是比较地址,等同于==。

来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
Object_ee 发表于 2016-12-2 18:05
这个都是可以运行出来的。二楼讲的有点出入。String类重写了基类的equals方法,所以在比较字符串时并不是比 ...

应该是“一楼”,不好意思发错了。我也小白,常看源码,API,带入程序运行,多多练。
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报
Object_ee 发表于 2016-12-2 18:05
这个都是可以运行出来的。二楼讲的有点出入。String类重写了基类的equals方法,所以在比较字符串时并不是比 ...

这个键入变量如果是成员变量,if就不能运行了,你的都是局部变量
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
勤奋小白 发表于 2016-12-3 00:27
这个键入变量如果是成员变量,if就不能运行了,你的都是局部变量

如果是成员变量,那你在main方法中swhich也执行不了吧,因为main是static的,而你的成员变量没有静态。其次,如果你成员变量都静态了,那main中,switch还是if都可以运行。最好把你跑不了的图上上来。交流交流。
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
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 使用直接赋值的方式后,只要是以后声明的字符串内容相同,则都不会再开辟新的内存空间
回复 使用道具 举报
dopamine 发表于 2016-12-2 09:07
键入的“你好”是string类型的,第一个case“你好”表示直接输入的是“你好”就可以执行下一步,而if里面虽 ...

你这样理解有误,你没明白java中提供了一个字符串常量池来保存全部的内容!
回复 使用道具 举报
本社这个问题我觉得就不对,这个场景下,理论上说都是运行的
回复 使用道具 举报
cjc147 发表于 2016-12-3 20:55
本社这个问题我觉得就不对,这个场景下,理论上说都是运行的

直接上图,请大神指教

来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
Object_ee 发表于 2016-12-3 17:04
如果是成员变量,那你在main方法中swhich也执行不了吧,因为main是static的,而你的成员变量没有静态。其 ...

图来了

来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
勤奋小白 发表于 2016-12-4 13:01
直接上图,请大神指教

new scanner是在堆内存中开辟空间,String v指向的是堆内存的地址,里边放的你键盘录入的数据。String v1 =”你好”  是在方法区的常量池中开辟空间,并指向。==在比较引用数据类型时比较的是地址,所以不执行。switch() ……case“” 括号中不存在比较,所以首先会拿到的是“你好”,再和case“”比较。这个底层应该也是用==号的,你可以查一下。所以switch执行,if不执行。一家之言,望指正。
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
Object_ee 发表于 2016-12-8 17:11
new scanner是在堆内存中开辟空间,String v指向的是堆内存的地址,里边放的你键盘录入的数据。String v1 ...

switch中有equals语句
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
勤奋小白 发表于 2016-12-9 08:06
switch中有equals语句

记得jdk1.7后,才加了string类的。1.5之前只能是转换为int类的。所以怎么可能是equals?!
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
Object_ee 发表于 2016-12-9 11:32
记得jdk1.7后,才加了string类的。1.5之前只能是转换为int类的。所以怎么可能是equals?!
...

看一下源代码吧,我昨天用了断点调试
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
Object_ee 发表于 2016-12-9 11:32
记得jdk1.7后,才加了string类的。1.5之前只能是转换为int类的。所以怎么可能是equals?!
...

equals,看一下源码比较好,我是小白不太懂,说的不对,请多多指教
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
一个引用指向常量池,一个指向堆内存吧
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
试着try 发表于 2016-12-11 23:46
一个引用指向常量池,一个指向堆内存吧

接收的应该是指向的堆内存,定义的指向常量池
Switch执行的原因是因为Switch内存在equals吗?
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马