java switch char_Java7中Switch为什么只支持byte、short、char、int、String
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 classswitchDemoInt {public static voidmain(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 classswitchDemoInt
{publicswitchDemoInt()
{
}public static voidmain(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 classswitchDemoInt {public static voidmain(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 classswitchDemoChar
{publicswitchDemoChar()
{
}public static voidmain(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 classswitchDemoString {public static voidmain(String[] args) {
String str= "world";switch(str) {case "hello":
System.out.println("hello");break;case "world":
System.out.println("world");break;default:break;
}
}
}
对代码进行反编译:
public classswitchDemoString
{publicswitchDemoString()
{
}public static voidmain(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 char_Java7中Switch为什么只支持byte、short、char、int、String相关推荐
- java的switch_Java中Switch用法代码示例
一.java当中的switch与C#相比有以下区别 注:在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样), 在java1.7 ...
- java选择语句中switch的用法(详细介绍)
一.什么时候用switch? 在java中控制流程语句是由选择语句.循环语句.跳转语句构成.选择语句包括 if 和 switch,在过多的使用 if 语句嵌套会使程序很难阅读,这时利用 switch ...
- 使用php中的switch,php中switch语句用法详解_PHP
本文介绍php中的switch语句的用法,它跟其他语句中的switch用法差不多的,但注意有有一个break语句. PHP中switch语句的标准语法: switch (expression) { c ...
- Java中的byte[]/char[]/int/String数据类型转换
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51743969 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...
- Java中switch都可以支持哪些数据类型
Java中switch都可以支持哪些数据类型 在JDK1.5之前,switch循环只支持byte short char int四种数据类型. JDK1.5 在switch循环中增加了枚举类与byte ...
- java switch 类型_Java switch case数据类型原理解析
这篇文章主要介绍了Java switch case数据类型原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 中 switch cas ...
- 29-java中Switch参数可以是什么?
在jdk1.6以及jdk1.6版本以下,只支持可以自动转型为int基本数据类型的数据:byte,short,char,int jdk1.5以及以上版本,支持Enum类型. jdk1.7版本加入新特性, ...
- java里equals_Java中equals和==的区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==), ...
- java==和=_java中==和 equal区别
明确概念: 对象的引用:当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称为该对象的实体,而对象中存放着引用(地址),以确保该实体由该对象操作使用. 一.????比较对象为基本数据类型 ...
最新文章
- Docker学习之网络篇
- php nl2br() 函数
- mySQL(关系型数据库管理系统)编辑
- 计组-输入输出系统小结
- Joint Detection and Identification Feature Learning for Person Search
- python中的常量_Python中的变量和常量
- Ubuntu 20.04 安装CUDA11.1 和cudnn 8.0.5
- opencv3 学习三 - 图像输入输出显示等
- as 插件GsonFormat用法(json字符串快速生成javabean)
- [译] Promise A+ 标准
- 2021-09-08推荐系统有如下三大类算法
- 基于Vue实现魔方矩阵排列效果
- 00003__位图简介
- 第3章 栈和队列 练习题
- Python线性分类
- 融合DE 端和FE端数据,利用小波变换生成时频图,再分别利用DCNN、KNN和DNN进行对比实验(python代码)
- 小觅智能亮相CAIS 2019 荣登最具商业价值AI企业百强榜
- springboot+elasticsearch+neo4j+vue+activiti数字知识库管理系统
- 十八、从Django入手
- jquery:选择器【基础选择器、层级选择器、属性选择器和方法操作、过滤选择器、筛选选择器和方法,可见性过滤选择器】
热门文章
- EXCEL文件上传与下载
- 2.5亿被腰围改变的中国人,哪个省胖子最多?
- linux项目运行日志查看,Linux项目部署、后台启动和终止运行及查看日志信息_MQ...
- python 基础教程:字符串内建函数之大小写的区别
- Python 下载的九种方法
- 这五种 Python 字符串连接方式,你都知道吗?
- 编写python高质量python代码的59个有效方法
- Python super超类方法
- gdi在固定范围内绘图_寿光计算机绘图CAD学费诚信经营
- web前端入门学习 css(5)(浮动)(ps切图)(css属性书写顺序)(学成在线网站案例)