Java中switch对整型/字符型/字符串型具体实现细节
转自: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对整型/字符型/字符串型具体实现细节的更多相关文章
- java中字节数组byte[]和字符(字符串)之间的转换
转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...
- Java基础知识强化19:Java中switch分支语句
java中switch语句: 这里expression控制表达式的数据类型只能是byte.short.char.int四种整型类型和枚举类型,不能是boolean类型: Java7(1.7)改进了sw ...
- 品味性能之道<十一>:JAVA中switch和if性能比较
通常而言大家普遍的认知里switch case的效率高于if else.根据我的理解而言switch的查找类似于二叉树,if则是线性查找.按照此逻辑推理对于对比条件数目大于3时switch更优,并且对 ...
- 第六节:详细讲解Java中的装箱与拆箱及其字符串
前言 大家好,给大家带来详细讲解Java中的装箱与拆箱及其字符串的概述,希望你们喜欢 装箱与拆箱 封装类有:Byte , short , Integer , Character , long , Fl ...
- 【转载】C#中PadLeft函数按特定字符补足字符串长度
在C#开发过程中字符串String类处理过程中,有时字符串长度不够时,需要在左侧指定特定的字符来补足字符串长度,此时可以使用String类下的PadLeft方法对字符串的左边进行按特定的字符和特定的长 ...
- 【转载】 C#中PadRight函数以特定字符在字符串结尾补足位数
在C#开发过程中字符串String类处理过程中,有时字符串长度不够时,需要在右侧侧指定特定的字符来补足字符串长度,此时可以使用String类下的PadRight方法对字符串结尾按特定的字符补足位数.M ...
- C语言中字符型和字符串型的区别?
C语言中只有字符型类型,没有字符串型类型.字符类型用一个带符号的8位二进制编码表示,其性质与int相同,只是只有一个字节.表示字符的ASCII编码使用其中的0~127,所以要明白字符类型(char)其 ...
- java中switch、while、do...while、for
一.Java条件语句之 switch 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试的名次,给予前 4 名不同的奖品.第一名,奖励笔记本一台:第二名,奖励 IPAD ...
- 浅谈Java中switch分支语句
前言: 在程序中遇到多分支选择的时候,想必大家都喜欢用if...else if...else...语句,尤其是初学者,因为在了解switch语句之前,我也是只会用if...else语句.那么现在看完这 ...
随机推荐
- MySQL—ORM框架,sqlalchemy模块
武老师博客:ORM框架介绍 import os #1.当一类函数公用同样参数时候,可以转变成类运行 - 分类 #2.面向对象: 数据和逻辑组合在一起了 #3. 一类事物共同用有的属性和行为(方法) # ...
- python中os模块在windows下的使用
今天学习了一下Python的os模块,主要是针对文件夹和文件路径的一系列操作. 与Python内置函数相比这里这里的函数功能更多样化,功能也更强大.但是学习过程中我发现很多函数都是只适用于unix系统 ...
- Tensorflow计算加速
在tensorflow里可以通过tf.device函数来指定每个运行的设备,可以是GPU也可以是CPU,比如CPU在tensorflow里的名称为/cpu:0,即便电脑里有多个CPU,tensorfl ...
- css--父元素塌陷
当父元素内都是漂浮元素时,会造成父高度塌陷的问题.(因为等同于父元素内容为空,所以长,宽都等于空) 我们想要的页面结构是: <!DOCTYPE html> <html lang=&q ...
- For in + 定时器
Fon in for/in 语句用于循环对象属性. 循环中的代码每执行一次,就会对对数组的元素对象的属性进行一次操作. <p id = "demo"><p> ...
- 洛谷P1993 小K的农场
思路是差分约束+dfs版SPFA. 首先来思考差分约束的过程,将题目给出的式子进行转化: 农场a比农场b至少多种植了c个单位的作物, SPFA我们考虑跑最短路,那么要让SPFA中满足的式子就是if(d ...
- Windows浏览器无法连接VM虚拟机Centos并打开nginx页面
装的是centos6.7minimal版本,搜了下,需要关闭防火墙 于是 yum install iptables 然后关闭防火墙 service iptables stop 再打开浏览器,成功进入页 ...
- ctype.h
isalpha:int isalpha(char ch);检查ch是否是字母.是字母返回非0,否则返回0. iscntrl: int iscntrl(int ch); 检查ch是否控制字符(其ASCI ...
- spark中map与flatMap的区别
作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...
- 【命令】Ubuntu设置和查看环境变量
转自[Ubuntu]Ubuntu设置和查看环境变量 查看环境变量 env env命令是environment的缩写,用于列出所有的环境变量 export 单独使用export命令也可以像env列出所有 ...