转自:http://www.hollischuang.com/archives/61

Java7中switch中支持的数据类型有: byte short int char String类型

其实switch是只支持一种数据类型,那就是整型:

1. byte short int  本身就是整型,可以直接按照整型进行比较

2. char的字符会依照ascii表,转换为对应的整型,然后进行switch条件选择

3. String的字符串会  先将字符串转换为hash值,   然后再对字符串进行equals方法比较,   以此来完成switch的条件选择

因为有ascii表存在,所以char类型和整数型可以进行转换, 也就是char类型可以直接赋值为整数型,整数型也可以直接赋值为字符型(无法转换的情况还没去归纳)

都说代码知识都是敲出来的,于是每种情况我都对比了下,如下图:

字节类型代码

这是字节类型的java源码,因为有字码表的存在,所以整数类型的变量也可以直接赋值字符

package compiler.demobyte;

public class Demo01 {

    public static void main(String[] args) {
byte byt1 = 'a'; switch (byt1) {
case 'a':
System.out.println("hello");
break;
case 'b':
System.out.println("world");
break;
default:
break;
}
byte byt2 = 97;
switch (byt2) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
break;
default:
break;
}
}
}

这是.class文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package compiler.demobyte; public class Demo01 {
public Demo01() {
} public static void main(String[] args) {
byte byt1 = 97;
switch(byt1) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
} byte byt2 = 97;
switch(byt2) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
} }
}

short类型代码

short类型与byte类型是一样的

package compiler.demoshort;

public class Demo01 {

    public static void main(String[] args) {
short sht = 'a';
switch (sht) {
case 'a':
System.out.println("hello");
break;
case 'b':
System.out.println("world");
break;
default:
break;
} short sht2 = 97;
switch (sht2) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
break;
default:
break;
}
}
}

这是.clas文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package compiler.demoshort; public class Demo01 {
public Demo01() {
} public static void main(String[] args) {
short sht = 97;
switch(sht) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
} short sht2 = 97;
switch(sht2) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
} }
}

int类型也是一样的,没有进行测试

char类型代码

package compiler.demochar;

public class Demo01 {

    public static void main(String[] args) {
char ch = 'a';
switch (ch) {
case 'a':
System.out.println("hello");
break;
case 'b':
System.out.println("world");
break;
default:
break;
} char ch2 = 97;
switch (ch2) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
break;
default:
break;
} }
}

生成.class文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package compiler.demochar; public class Demo01 {
public Demo01() {
} public static void main(String[] args) {
char ch = 97;
switch(ch) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
} char ch2 = 97;
switch(ch2) {
case 97:
System.out.println("hello");
break;
case 98:
System.out.println("world");
} }
}

String 类型代码

String会稍微特殊一些,分两步进行转换:

第一步: 先将字符串转换为哈希值,进行条件选择.  然后因为存在哈希值碰撞的问题, 所以在条件选择成功后, 又使用了equals方法进行内容的比较.

哈希值的表现形式是 int整型

所以实质上: String类型也是视为是int整型的比较.

java代码如下:

package compiler.demostring;

public class Demo01 {

    public static void main(String[] args) {
String str = "wor";
switch (str) {
case "hello":
System.out.println("hello");
break;
case "world":
System.out.println("world");
break;
default:
break;
}
}
}

.clas文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package compiler.demostring; public class Demo01 {
public Demo01() {
} public static void main(String[] args) {
String str = "wor";
byte var3 = -1;
switch(str.hashCode()) {
case 99162322:
if (str.equals("hello")) {
var3 = 0;
}
break;
case 113318802:
if (str.equals("world")) {
var3 = 1;
}
} switch(var3) {
case 0:
System.out.println("hello");
break;
case 1:
System.out.println("world");
} }
}

综上所述:  又回归到我们的结论:    其实switch是只支持一种数据类型,那就是整型.

Java中switch对整型/字符型/字符串型具体实现细节的更多相关文章

  1. java中字节数组byte[]和字符(字符串)之间的转换

    转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...

  2. Java基础知识强化19:Java中switch分支语句

    java中switch语句: 这里expression控制表达式的数据类型只能是byte.short.char.int四种整型类型和枚举类型,不能是boolean类型: Java7(1.7)改进了sw ...

  3. 品味性能之道<十一>:JAVA中switch和if性能比较

    通常而言大家普遍的认知里switch case的效率高于if else.根据我的理解而言switch的查找类似于二叉树,if则是线性查找.按照此逻辑推理对于对比条件数目大于3时switch更优,并且对 ...

  4. 第六节:详细讲解Java中的装箱与拆箱及其字符串

    前言 大家好,给大家带来详细讲解Java中的装箱与拆箱及其字符串的概述,希望你们喜欢 装箱与拆箱 封装类有:Byte , short , Integer , Character , long , Fl ...

  5. 【转载】C#中PadLeft函数按特定字符补足字符串长度

    在C#开发过程中字符串String类处理过程中,有时字符串长度不够时,需要在左侧指定特定的字符来补足字符串长度,此时可以使用String类下的PadLeft方法对字符串的左边进行按特定的字符和特定的长 ...

  6. 【转载】 C#中PadRight函数以特定字符在字符串结尾补足位数

    在C#开发过程中字符串String类处理过程中,有时字符串长度不够时,需要在右侧侧指定特定的字符来补足字符串长度,此时可以使用String类下的PadRight方法对字符串结尾按特定的字符补足位数.M ...

  7. C语言中字符型和字符串型的区别?

    C语言中只有字符型类型,没有字符串型类型.字符类型用一个带符号的8位二进制编码表示,其性质与int相同,只是只有一个字节.表示字符的ASCII编码使用其中的0~127,所以要明白字符类型(char)其 ...

  8. java中switch、while、do...while、for

    一.Java条件语句之 switch 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试的名次,给予前 4 名不同的奖品.第一名,奖励笔记本一台:第二名,奖励 IPAD  ...

  9. 浅谈Java中switch分支语句

    前言: 在程序中遇到多分支选择的时候,想必大家都喜欢用if...else if...else...语句,尤其是初学者,因为在了解switch语句之前,我也是只会用if...else语句.那么现在看完这 ...

随机推荐

  1. python - 闭包,迭代器

    一.第一类对象 1.函数名的运用     函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量     1.函数名的内存地址 def func1(): print('你是谁,你来自哪里 ...

  2. es6,es7,es8

    概述 ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言.目前JavaScript使用的ECMAScript版本为ECMAScript-262. ECMAScript 标 ...

  3. css--样式表的引入方法

    html引用css方法如下1.直接在div中使用css样式(内链)2.html中使用style自带式(嵌入)3.使用@import引用外部CSS文件(外部引入)4.使用 link引用外部CSS文件 推 ...

  4. Linux虚机安装配置Tomcat

    d第一步:下载Tomcat包,网址http://tomcat.apache.org/ 选择tar.gz包下载,并传到虚机中 第二步:解压下载好的Tomcat包 命令:tar -zxvf apache- ...

  5. ORACLE,DECODE函数和排名函数DENSE_RANK函数的使用

    这几天写一个报表的页面,从很恶心的数据结构中做一个聚合函数的查询,结构大概是这个样子的: 所以有:对数据group by t.id,t.name.t.course 这样三层排序,然后用函数去取值. d ...

  6. 【基于微信小程序的社区电商平台】Alpha迭代心得

    项目团队:小豆芽 开发周期:11.5-12.2(Alpha版本) 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决问题:当前电商平台卖家买家角 ...

  7. webpack - minipack 打包原理

    code:https://github.com/ronami/minipack 看了https://www.youtube.com/watch?v=Gc9-7PBqOC8总结一下 工具和环境: nod ...

  8. Scanner类、Random类、ArrayList 类

    1.1 什么是Scanner类一个可以解析基本类型和字符串的简单文本扫描器. 例如,以下代码使用户能够从 System.in 中读取一个数: Scanner sc = new Scanner(Syst ...

  9. C++二维数组、指针、对象数组、对象指针

    项目中用到,随手记一下: 1.二维数组.与指针 创建二维数组指针的方式: a.已知一维的大小 1 int **array=new int *[rows]; 2 (for int i=0;i<ro ...

  10. TCP聊天工具的实现

    由于本人天生愚钝,所以关于聊天工具的编程一直都没学会,尽管网上教程一大堆,但是关于IdTCPClient  IdTCPServer 的不多,今天终于学会一些,分享给像我一样纠结的小伙伴,下一步学习多线 ...