详解:Java字符串类型"switch"的底层原理
前言:
最近更新得会比较频繁,希望大家见谅哦!
也感谢关注我的人,我会更加更加努力去做的!
基础
我们现在使用的Java的版本,基本上是都支持String类型的。当然除了String类型,还有int、char、byte、short、enum等等也都是支持的。然而在其底部实现中,还是基于 整型的,也就是int、byte、short这些类型。
我们先来看一下int的一个简单例子,主要部分源代码
public static void main(String [] args){
int n = ;
switch (n){
case :
break;
case :
break;
case :
break;
default:
}
}
再使用javac命令编译,javap命令反编译之后得到如下关键部分字节码:
0: iconst_2
1: istore_1
2: iload_1
3: tableswitch { // 1 to 3
1: 28
2: 31
3: 34
default: 37
}
28: goto 37
31: goto 37
34: goto 37
37: return
我们可以直接把class文件反编译成源代码,可以直接将class文件拖进IDEA,得到如下代码:
public static void main(String[] var0) {
byte var1 = 2;
switch(var1) {
case 1:
case 2:
case 3:
default:
}
}
这里总的来说和源代码变化不大,只是将int类型都转化为了byte类型。这里转化的原因,在于我们最初的case里面的值刚好在byte的范围之内。如果case的值稍微大点,它可能就会转化为short类型,再大点,就直接是int类型了。需要注意的是switch里面不支持float、long这些类型。
String类型讲解
有了上文的理解之后,下面应该会简单许多。
同样的,还是先上源代码
public static void main(String [] args){
String str = "sdf";
switch (str){
case "aaa":
break;
case "ccc":
break;
case "bbb":
break;
default:
}
}
然后编译之后丢进IDEA反编译得到反编译的代码
public static void main(String[] var0) {
String var1 = "sdf";
byte var3 = -1;
switch(var1.hashCode()) {
case 96321:
if (var1.equals("aaa")) {
var3 = 0;
}
break;
case 97314:
if (var1.equals("bbb")) {
var3 = 2;
}
break;
case 98307:
if (var1.equals("ccc")) {
var3 = 1;
}
}
switch(var3) {
case 1:
case 0:
case 2:
default:
}
}
可以看到,String类型的switch,转换为了字符串的哈希比较,而其哈希返回的正是int类型。hash相同的情况再通过equals方法对比字符串的值,因此引进局部变量var3,是很有必要的。
最后,感谢大家读到了这里
我是小架,
我们下篇文章见!
详解:Java字符串类型"switch"的底层原理的更多相关文章
- 详解JAVA字符串类型switch的底层原理
基础 我们现在使用的Java的版本,基本上是都支持String类型的.当然除了String类型,还有int.char.byte.short.enum等等也都是支持的.然而在其底部实现中,还是基于 整型 ...
- 第三节:带你详解Java的操作符,控制流程以及数组
前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...
- 「跬步千里」详解 Java 内存模型与原子性、可见性、有序性
文题 "跬步千里" 主要是为了凸显这篇文章的基础性与重要性(狗头),并发编程这块的知识也确实主要围绕着 JMM 和三大性质来展开. 全文脉络如下: 1)为什么要学习并发编程? 2) ...
- 详解Java GC的工作原理+Minor GC、FullGC
详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
- 详解Java中的clone方法
详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...
- java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...
- 超全详解Java开发环境搭建
摘自:https://www.cnblogs.com/wangjiming/p/11278577.html 超全详解Java开发环境搭建 在项目产品开发中,开发环境搭建是软件开发的首要阶段,也是必 ...
- 实例详解 Java 死锁与破解死锁
锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...
随机推荐
- Scala比较器---Ordered与Ordering
1.Ordered 和 Ordering Scala提供两个特质(trait)Ordered与Ordering用于比较.其中,Ordered混入(mix)Java的Comparable接口,而Orde ...
- pdfium
https://github.com/SubtleCow/AccessControlListsintheDOM/tree/4673d995e5614bc682cecd22f9b2919b2360273 ...
- 05-人脸识别-FaceNet的感性认识
源码链接:https://github.com/davidsandberg/facenet 论文链接:https://arxiv.org/pdf/1503.03832.pdf B站大神视频解读论文:h ...
- 微信小程序警告:Now you can provide attr "wx:key" for a "wx:for" to improve performance.
那是因为在<block wx:for-items="{{imgUrls}}">中不存在wx:key="imgUrls"所以才导致报了个警告. 写成& ...
- 求职-如何选择offer
如何选择offer呢?下面我们从这几部分一起聊聊: HR问你目前拿到哪几个offer了怎么回答好? 选择小公司还是大公司? 为什么刚入行不要去没有人带的部门? 正式员工.合同工和外包人员有什么区别? ...
- [LeetCode] 264. Ugly Number II 丑陋数之二
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- [LeetCode] 227. Basic Calculator II 基本计算器之二
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- GreenPlum 大数据平台--segment 失效问题排查
01,segment 检查一: 在master节点上检查失效的segment 正常情况下: :::: gpstate:greenplum01:gpadmin-[INFO]:-Starting gpst ...
- Django初见
什么市WEB应用? 所谓的web应用就是我们基于浏览器打开的一个个网页(对应网址得到的内容) 软件开发架构 C/S架构: 客户端/服务端 B/S架构:浏览器/服务器 所有的B/S架构本质上就是C/S架 ...
- pyqt 调用QT设计师创建的对话框
一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 二.实验步骤 2.1 ...