java7 switch语句中使用字符串的背后原理

先看下代码及反编译后的代码:

/**
 * @author doctor
 *
 * @time 2015年3月28日 下午3:26:06
 */
public class StringForSwitch {

	@Rule
	public ExpectedException ex = ExpectedException.none();

	@Test
	public void test_string_switch() {
		String result="";

		switch ("doctor") {
		case "doctor":
			result = "doctor";
			break;

		default:
			break;
		}

		assertThat(result, equalTo("doctor"));
	}

	 
}

反编译后的代码:

public class StringForSwitch {
    @Rule
    public ExpectedException ex = ExpectedException.none();

    public StringForSwitch() {
    }

    @Test
    public void test_string_switch() {
        String result = "";
        String var2 = "doctor";
        switch("doctor".hashCode()) {
        case -1326477025:
            if(var2.equals("doctor")) {
                result = "doctor";
            }
        default:
            Assert.assertThat(result, IsEqual.equalTo("doctor"));
        }
    }
}

1.字符串类型在switch语句中利用hashcode的值与字符串内容的比较来实现的.

2.因为字符串的哈希值可能重复,哈希函数设计的不好吧.故还得需要进一步比较字符串的内容.

3.编译器层面的语法糖而已,实质没变,switch还是比较的整数.

4.jdk1.8.0_40环境下.

时间: 2024-10-17 23:41:27

java7 switch语句中使用字符串的背后原理的相关文章

java7 语法糖 之 switch 语句中的string

Jdk7新增的switch 语句中常量可以string类型, 例如: @Test public void test_1(){ String string = "hello"; switch (string) { case "hello": System.out.println(string); break; default: throw new IllegalArgumentException("非法参数"); } } 语法糖的背后,其实用的对待

java中switch语句中的defaul条件的位置

在java中switch语句中,每个case分支就是一个入口,如果都没有满足条件,那么将会走到default分支中.那么这个default分支的位置会不会影响到执行的流程呢? package com.app.statement; import java.util.Scanner; /**  * Created by charles on 2015/7/12.  */ public class SwitchTest {     public static void main(String[] ar

在 case 语句中使用字符串

在 case 语句中使用字符串 非常遗憾 Delphi 的 case 语句不支持字符串, 但我觉得这也可能是基于效率的考量;如果非要在 case 中使用字符串, 也不是不可以变通, 这里提供了五种方法. 本例效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, ExtCtrls;

switch语句中break的巧用

大家都知道,break的作用就是终止它所在的switch语句后循环语句的执行.在这里呢,我们不去探讨break在循环里的终止作用,也不去回忆在循环里是跳出本层循环,不去研究它与continue或者return的区别.在这里,我们简简单单的谈一下,它在switch语句中的利用. 有这样一道编程题目:输入某年某月某日三个值,判断这是这一年的第几天.一般的情况,我们会这样写代码: #include<stdio.h> void main() { int year,month,day,num; prin

C++中switch 语句中的变量声明和

switch 内部的变量定义: 1 int i = 1; 2 switch(i) 3 { 4 case 0: 5 string str; //error 6 int val1 = 0; //error 7 int val2; //right 8 int val3; val3 = 0; //right 9 case 1: 10 val2 = 9; 11 cout << val2 << endl; 12 } <C++ Primer> P163: 如果在某处一个带有初始值的变

1.3.1 switch 语句中的 String

switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Java 7规范中增加了String,毕竟它也是常量类型: Demo: public class CoinSwitchString { public static void main(String[] args) { printDay("Sunday"); printDay("Tue

swift switch语句中的标签语句

当我们在遍历中使用switch语句时有时需要终止整个遍历的进行而不是switch语句,那么标签语句的实现就是很有必要的 //可以使用标签来标记一个循环体或者switch代码块,当使用break或者continue时带上这个标签,可以控制该标签代表对象的终端或者执行,适合复杂真的控制流程 /* 要求在遇到异常数据时直接终止循环 */ var score = [96,83,43,101,66,70,-5,99] First:for s in score {//定义标签First switch s/1

sql语句中截取字符串

今天在开发过程中因为要用到合并单元格,在程序里实现了以后,查出来的数据太长,都把格式撑大了,后来想想可以在sql语句查询的时候就截取,就去网上找了一下,挺好用,就转了过来: 合并单元格: /// <summary>    /// 合并GridView中某列相同信息的行(单元格)    /// </summary>    /// <param name="GridView1">GridView</param>    /// <para

JDK7的新特性——switch语句可以用字符串语句

1 //jdk7.0中switch可以使用字符串做条件 2 public class TestSwitch02 { 3 public static void main(String[] args){ 4 String a = "向良峰"; 5 6 switch(a){//JDK 7的新特性,表达式可以是字符串! 7 case "哔哩哔哩": 8 System.out.println("输入的是哔哩哔哩"); 9 break; 10 case &q