首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >想知道switch是怎么判断条件的吗

想知道switch是怎么判断条件的吗

作者头像
PhoenixZheng
发布于 2018-08-07 08:39:50
发布于 2018-08-07 08:39:50
90700
代码可运行
举报
运行总次数:0
代码可运行

有一天,小A的朋友小呼面试回来,愁眉不展。

"难道面试不顺利?"小A心想。于是问小呼都问了什么。小呼说,面试官问了个奇怪的问题,

"Java的switch能不能判断string"

小呼当时就内心一喜,这不是明摆着的问题嘛!

"当然可以,java7就可以了"

"那它是怎么实现的呢"

"这个…没了解过"

面试官微微一笑,

"好的回去等通知吧"

"然后我就一直在想这个问题了",小呼说

"其实啊,你听我说…",于是小A跟小呼解释了起来

Java swtich的语法

大家都知道switch可以用在于条件判断,但是在java7之前都只能接受byte short int char,就像下面这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaSwitch {
  public static void switchMethod(int i) {
    switch(i) {
      case 1:
        break;
       case 2:
        break;
       default:
        break;
    }
  }
}

Java7之后我们可以用String来进行判断了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaSwitch {
  public static void switchMethod(String i) {
    switch(i) {
      case "Hello":
        break;
       case "World":
        break;
       default:
        break;
    }
  }
}

那么当它比较的时候是对字符串进行比较的吗?其实不是的,我们看下编译后的字节码就明白

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void switchMethod(java.lang.String);
   Code:
      0: aload_0
      1: astore_1
      2: iconst_m1
      3: istore_2
      4: aload_1
      5: invokevirtual #2                  // Method java/lang/String.`hashCode:()`I
      8: lookupswitch  { // 2
             69609650: 36
             83766130: 50
              default: 61
         }
     36: aload_1
     37: ldc           #3                  // String Hello
     39: invokevirtual #4                  // Method java/lang/String.`equals`:(Ljava/lang/Object;)Z
     42: ifeq          61
     45: iconst_0
     46: istore_2
     47: goto          61
     50: aload_1
     51: ldc           #5                  // String World
     53: invokevirtual #4                  // Method java/lang/String.`equals`:(Ljava/lang/Object;)Z
     56: ifeq          61
     59: iconst_1
     60: istore_2
     61: iload_2
     62: lookupswitch  { // 2
                    0: 88
                    1: 91
              default: 94
         }
     88: goto          94
     91: goto          94
     94: return
}

我们只需要注意到Sting的hashCode,还有equals方法,就能明白。进行判断的时候,首先把case里的比较条件转换成hashCode,同样的传进来的String也被转换成hashCode, 然后再进行条件判断。所以其实switch对String的判断原理,也是通过整型进行判断的。

总结

switch的判断,其实是对整型的判断。Java7中新增的对String的支持,实际上是先将String进行hashCode,然后再判断的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Codeforces Round #561 (Div. 2)
C. 求min(|X-Y|,|X+Y|) <= min(X,Y) <= max(X,Y) <= max(|X-Y|,|X+Y|)
用户2965768
2019/06/14
3730
CodeForces 651B Beautiful Paintings
B. Beautiful Paintings time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output There are n pictures delivered for the new exhibition. The i-th painting has beauty ai. We know that a visito
ShenduCC
2018/04/26
7470
Codeforces #576 div 2 ABCD
A.暴力 #include <bits/stdc++.h> using namespace std; int a[1000005]; int main() { int n,x,y,mi=0; scanf("%d %d %d",&n,&x,&y); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=n;i++){ int fg = 1; for(int j=i-x;j<=i+y;j++){ if(j<1||j>n|
用户2965768
2019/08/14
2590
「2017 Multi-University Training Contest 2」2017多校训练2
给定数组a[1..n]和b[1..n],b[i]在[1~n]内。要得到a[n+1..2n],每次选b数组的一个,令a[i]为j=b[k]到i-1位置中最大的a[j]-j。求a[n+1..2n]总和最大值。
饶文津
2020/06/02
3870
「2017 Multi-University Training Contest 2」2017多校训练2
ZOJ 3607 Lazier Salesgirl (枚举)
Lazier Salesgirl Time Limit: 2 Seconds Memory Limit: 65536 KB Kochiya Sanae is a lazy girl who makes and sells bread. She is an expert at bread making and selling. She can sell the i-th customer a piece of bread for price pi. But she is so lazy th
ShenduCC
2018/04/26
5010
UCF Local Programming Contest 2015 A~~H
题目链接 A 水题: #include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; int a[15]; int main(){ int t; cin>>t; while(t--){ bool flag1 =0; bool flag2 =0; for(int i=1;i<=10;i++){ cin>>a[i]; if(a[i] == 18) flag1 = 1; if(a[i] == 17)
杨鹏伟
2020/09/10
3150
AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)
A. Diversity time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output Calculate the minimum number of characters you need to change in the string s, so that it contains at least k different letters, or pr
Angel_Kitty
2018/04/09
7030
AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)
codeForces #575 div3
A - Three Piles of Candies 题意:就是给了三堆糖,两个人,每人哪一堆,然后第三堆用来补充,最终要达到两个人的糖的数量一样多。 思路:水题,签到
杨鹏伟
2020/09/11
3090
Codeforces Round #327 div2
  有一段长度为l的路,两个人分别在两个端点,1, l。 现在已知每个人的速度为p,q. 求第一个人(初始位置在1)在他们第二次相遇的时候的位置。
熙世
2019/07/14
3690
codeforces round #257 div2 C、D「建议收藏」
由于横切+竖切(或竖切+横切)会对分割的东西产生交叉份数。从而最小的部分不会尽可能的大。
全栈程序员站长
2022/07/10
2330
【队伍训练3】Codeforces Round #661 (Div. 3)
A 签到 #include<bits/stdc++.h> #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; int a[105]; int main(){ ios int n,t; cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i];
杨鹏伟
2020/09/10
3520
POJ 1252 Euro Efficiency
意大利是说给你几个基本的货币,组成 1~100 所有货币,使用基本上的货币量以最小的。
全栈程序员站长
2022/07/06
1950
Educational Codeforces Round 45 (Rated for Div. 2)
第一次打cf,确实有很多不适应的地方,第一题上来把$n$和$m$看反了,然后特判的时候写的是$M % N$,直接wa到飞
attack
2019/01/30
3790
Codeforces 1323 div2题解ABC
B. Count Subrectangles 当时没做出来: 预处理: 首先统计 a序列和 b序列 的所有连续 1 区间长度, a 序列第 i 个连续 1 的区间length 为Ai ,b 序列第 i 个连续 1 的区间length 为Bi 考虑 k 的每一个约数 d。 则有, d×kd 这个矩形的个数就是 (Ai−d+1) *(Bi−kd+1) ,对k的每一个因子d计算后求和即可。 解答: 然后排序后二分输出。
风骨散人Chiam
2020/10/28
2180
Codeforces Round #326 div2
  Duff 很喜欢吃肉, 每天都要吃,然而她又懒得下楼。 可以买很多放在家里慢慢吃。然而肉价每天都在变化,现给定一个n, 表示有多少天,然后第i天吃ai kg的肉, 当天的价格为pi。
熙世
2019/07/14
4270
Codeforces Round #313 (Div. 2)
大半年没有打Codeforces , 昨天开始恢复打Codeforces, 简直是, 欲语泪先流啊。
熙世
2019/07/15
4220
Codeforces Round #313 (Div. 2)
Codeforces Round #665 (Div. 2)
B题贪心构造,尽量别想太复杂,要不很容易绕不出来,可以分类讨论一下或者自己构造几个数组找找规律。
ACM算法日常
2020/08/26
4090
Codeforces Round #321 div2
好像前几场的题解忘记写了, Orz 状态太差, 平均出两题   都不好意思写了 , 连掉4场, 都要哭晕了。
熙世
2019/07/15
3630
Codeforces #567 ABC
A. 个数就不说了,第二个值 有多余的凑起来能再买一个就把还需要钱少的输出否则为0
用户2965768
2019/07/08
8940
Codeforces Round #360 div2
  有d天, n个人。如果这n个人同时出现, 那么你就赢不了他们所有的人, 除此之外, 你可以赢他们所有到场的人。
熙世
2019/07/14
3960
相关推荐
Codeforces Round #561 (Div. 2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验