[初级]Java中的switch对整型、字符型、字符串的具体实现细节
转载自 [初级]Java中的switch对整型、字符型、字符串的具体实现细节
Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进。到目前为止switch支持这样几种数据类型:byte
short
int
char
String
。但是,作为一个程序员我们不仅要知道他有多么好用,还要知道它是如何实现的,witch对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?String类型呢?有一点Java开发经验的人这个时候都会猜测switch对String的支持是使用equals()方法和hashcode()方法。那么到底是不是这两个方法呢?接下来我们就看一下,switch到底是如何实现的。
一、switch对整型支持的实现
下面是一段很简单的Java代码,定义一个int型变量a,然后使用switch语句进行判断。执行这段代码输出内容为5,那么我们将下面这段代码反编译,看看他到底是怎么实现的。
public class switchDemoInt {public static void main(String[] args) {int a = 5;switch (a) {case 1:System.out.println(1);break;case 5:System.out.println(5);break;default:break;}}
}
//output 5
反编译后的代码如下:
public class switchDemoInt
{public switchDemoInt(){}public static void main(String args[]){int a = 5;switch(a){case 1: // '\001'System.out.println(1);break;case 5: // '\005'System.out.println(5);break;}}
}
我们发现,反编译后的代码和之前的代码比较除了多了两行注释以外没有任何区别,那么我们就知道,switch对int的判断是直接比较整数的值。
二、switch对字符型支持的实现
直接上代码:
public class switchDemoInt {public static void main(String[] args) {char a = 'b';switch (a) {case 'a':System.out.println('a');break;case 'b':System.out.println('b');break;default:break;}}
}
编译后的代码如下: `public class switchDemoChar
public class switchDemoChar
{public switchDemoChar(){}public static void main(String args[]){char a = 'b';switch(a){case 97: // 'a'System.out.println('a');break;case 98: // 'b'System.out.println('b');break;}}
}
通过以上的代码作比较我们发现:对char类型进行比较的时候,实际上比较的是ascii码,编译器会把char型变量转换成对应的int型变量
三、switch对字符串支持的实现
还是先上代码:
public class switchDemoString {public static void main(String[] args) {String str = "world";switch (str) {case "hello":System.out.println("hello");break;case "world":System.out.println("world");break;default:break;}}
}
对代码进行反编译:
public class switchDemoString
{public switchDemoString(){}public static void main(String args[]){String str = "world";String s;switch((s = str).hashCode()){default:break;case 99162322:if(s.equals("hello"))System.out.println("hello");break;case 113318802:if(s.equals("world"))System.out.println("world");break;}}
}
看到这个代码,你知道原来字符串的switch是通过equals()
和hashCode()
方法来实现的。记住,switch中只能使用整型,比如byte
。short
,char
(ackii码是整型)以及int
。还好hashCode()
方法返回的是int
,而不是long
。通过这个很容易记住hashCode
返回的是int
这个事实。仔细看下可以发现,进行switch
的实际是哈希值,然后通过使用equals方法比较进行安全检查,这个检查是必要的,因为哈希可能会发生碰撞。因此它的性能是不如使用枚举进行switch或者使用纯整数常量,但这也不是很差。因为Java编译器只增加了一个equals
方法,如果你比较的是字符串字面量的话会非常快,比如”abc” ==”abc”。如果你把hashCode()
方法的调用也考虑进来了,那么还会再多一次的调用开销,因为字符串一旦创建了,它就会把哈希值缓存起来。因此如果这个siwtch
语句是用在一个循环里的,比如逐项处理某个值,或者游戏引擎循环地渲染屏幕,这里hashCode()
方法的调用开销其实不会很大。
好,以上就是关于switch对整型、字符型、和字符串型的支持的实现方式,总结一下我们可以发现,其实swich只支持一种数据类型,那就是整型,其他数据类型都是转换成整型之后在使用switch的。
[初级]Java中的switch对整型、字符型、字符串的具体实现细节相关推荐
- java中的switch的参数类型
java中的switch没有C#的方便,C#中,string都可以用.java.C++中只能用整型. Java 7之前,switch后面的括号里面只能放int类型的值,注意是只能放int类型,但是放b ...
- Java 中的 switch 语句
一.switch基础语法 switch(表达式){ case 表达式常量1:语句1: break: case 表达式常量2:语句2: break: ...... case 表达式常量n:语句n: br ...
- java数值型转字符型_Java中数值型,字符型及字符串的相互转换
Java中数值型,字符型及字符串的相互转换由广州疯狂软件教育java培训分享: 刚开始学习Java不就前些时日被转换问题搞得有点凌乱在这里整理一下. 1.字符型与数值型之间的转换 (1)要将一个整数转 ...
- Java中的Switch用法
1,在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样), 在java1.7后支持了对string的判断 public cla ...
- java中switchcase用法,java中的switch case语句使用详解
java中的switch case语句 switch-case语句格式如下: ? swtich()变量类型只能是int.short.char.byte和enum类型(JDK 1.7 之后,类型也可以是 ...
- java字符型常量可以改变_在JAVA语言中,下列正确的字符型常量是
在JAVA语言中,下列正确的字符型常量是 答:'9' 智慧职教: 引发COVID-19疾病的新冠病毒的核酸类型是(? ? ? ). 答:RNA 仍然是长期制约我国经济社会发展的关键性问题之一 答:人口 ...
- 一文读懂Java中File类、字节流、字符流、转换流
一文读懂Java中File类.字节流.字符流.转换流 第一章 递归:File类: 1.1:概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. ...
- Java中switch对整型/字符型/字符串型具体实现细节
转自:http://www.hollischuang.com/archives/61 Java7中switch中支持的数据类型有: byte short int char String类型 其实swi ...
- java中怎么输入长整型_c语言如何输入长整型 scanf输入长整型
C语言中无符号长整型数的输入输出格式是什么? 整数变量的分类:basic integer:int short integer:short int long int将修饰符unsigned添加到上述三个 ...
最新文章
- 顺序表-插入一个元素x后保持该顺序表L递增有序排序(查找+元素后移插入)
- 两条曲线所围成的面积_人教版数学六年级上册 5.3:圆的面积(一) 微课视频|知识点|课件解析|同步练习...
- network location awareness启动不了_【新手看过来】无钥匙启动功能
- HDU 5617 Jam's maze dp+滚动数组
- Android----使用代码 建立gprs 闹钟 连接
- mysql 执行存储过程_MySQL存储过程的3种循环
- MySQL UNION 与 UNION ALL 语法与用法
- phalapi 数据库锁_phalApi数据库操作
- STM32采集电阻触摸贴膜
- Python中的*self,*self._args, **kwargs
- 二元函数洛必达求极限_(整理)二元函数极限的求法.
- mediatek无线usb网卡驱动 linux,Ralink雷凌USB无线网卡驱动5.1.7.0版 Ralink雷凌USB无线网卡驱动5.1.7.0版 无线网卡驱动 雷凌...
- ASP.NET4.0尚未在Web服务器上注册
- 01_ue4进阶_PBR材质
- mac版eclipse连接mysql_将Eclipse连接到mysql mac os x jdbc驱动程序
- JavaScript 中的BOM对象
- Set 中 toArray()
- u盘硬盘数据损坏丢失如何恢复?高恢复率高的数据恢复软件
- 已声明“XXX”,但从未读取其值,vscode 如何关闭ts报错
- qt读取文件里的数据并做折线图 并鼠标触碰显示
热门文章
- [Redis6]发布和订阅
- [Java基础]生产者和消费者模式概述与案例分析
- 表空间oracle查询,Oracle表和表空间查询
- Python 推导,内含,迭代器
- fusionsphere读音_hydroxyapatite
- 【LOJ#572】Misaka Network 与求和(莫比乌斯反演/杜教筛/min_25筛)
- Codeforces Round #285 (Div. 2) D. Misha and Permutations Summation 康托展开 + 线段树
- AGC011D - Half Reflector(模拟)
- Acwing 277. 饼干
- [USACO09FEB]Revamping Trails G