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语句.那么现在看完这 ...
随机推荐
- 微信小程序实战练习(仿五洲到家微信版)
github地址(欢迎star):https://github.com/xiaobinwu/dj 版本:0.15.152900(暂未升级原因:升级后需要图片无法本地引用,必须使用image或是远程路径 ...
- mysql源码版安装
mysql源码版安装 创建配置文件 创建 my.ini,注意修改,如下的 设置mysql的安装目录和设置mysql数据库的数据的存放目录,设置自己本机的上的对应路径 [mysql] # 设置mysql ...
- JS中的作用域(一)-详谈
本篇文章在于详细解读JavaScript的作用域,从底层原理来解释一些常见的问题,例如变量提升.隐式创建变量等问题,在和大家一起交流进步的同时,也算对自己知识掌握的记录,方便以后复习 首先,直接捡干的 ...
- Java基本概述
1.java语言的特点 1.面向对象:基本概念(类,对象) 三大特征:封装.继承.多态 2.健壮性 3.跨平台:通过Java语言的编写的应用程序在不同的系统平台上都能可以进行运行. 2.什么是JDK. ...
- Python爬虫入门之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- python全栈开发笔记---------函数
一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...
- 数据库数据迁移 SqlServer复制到mysql
经过一番搜索,有朋友推荐用datax的,后来发现比较麻烦,需要循环每个表去复制:有推荐用Navicat的,但是方式有点行不通,会报文件打不开:无法打开Provider=SQLNCLI10.1;Pers ...
- shiro三连斩之第三斩,整合 springboot
shiro爱springboot中使用 ,还有thymeleaf前端框架.主要是如何配置 pom.xml配置依赖 <?xml version="1.0" encoding=& ...
- select下拉列表js操作兼容性问题分享
做一个下拉列表鼠标移入改变对应的图片的值, $("select").mosover(function(){ //var i=$(this).find("selected& ...
- 记一次msyql导入导致的问题
公司有个项目要导入150M大小的sql文件,但是导入时报错,去网上找答案,很多人说是因为保留字什么什么的,所以就按照sql文件里面的mysql版本又去下载了一份mysql5.6安装好,但是登陆不了,又 ...