首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java为什么InputStream#read()返回一个int而不是一个字节

首先字节正好是8位,所以使用8位的char类型数据来与字节数据相互一一对应是最好的选择?但是为何方法InputStream#read()需要返回int类型值?...首先,我们要完成一个EOF(End of File)判断,Java中就是以-1来表示数据读完了,但是如果返回的char类型值,那么根本没有-1这个数值;如果换种方式,返回一个特殊的char值,比如char...的-1值,那么就占用了此字符,如果字节数据恰好对应-1值,那么就无法被正确读出,且会被错误认为i字节数据读好了,这就是返回int类型值的原因,当然,字节数据被转为int表示,需要高24位布零。...其次,既然只是如上的需求,那么为什么返回short值? 实际上Java内存模型,对于short以及int类型值,都是占据32位的内存空间的。...Java虚拟机使用偏移量(实际上是32位原始单元格大小的倍数)对堆栈和对象字段进行建模。因此,当您将局部变量或对象字段声明为(例如)一个字节时,变量/字段将像int一样存储32位单元

1.2K20

Java为什么不同的返回类型不算方法重载?

从方法签名的组成规则我们可以看出,方法的返回类型不是方法签名的组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回值类型不同的方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名的一部分?...总结 同一个类定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载。方法重载的典型使用场景是 String 的 valueOf 方法,它有 9 种实现。...方法返回类型不能作为方法重载的依据,因为它不是方法签名的组成部分。...参考资料:《出高效》

3.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

为什么Java没有为空字符串设置访问API | Java Debug 笔记

为什么Java没有为空字符串设置访问API?...=========================熟悉Java的朋友都知道,当我们通过双引号创建字符串的时候,Java 会将字符串存储常量池中以供我们下次使用但是为什么String类不为我们提供一个对空字符串的引用因为这样做至少可以节省了编译的时间...我个人认为这某种意义上来说这有点“代码味道”所以说,关于String的空字符一说Java是否有更加复杂的涉及考虑还说设计者没有考虑到这个问题回答1===String.EMPTY是12个字符,而"...他并不是你想的哪样可以现获取到空字符串然后通过类似StringBuilder或者StringBuffer来操作他然后再获取到String补充说明一下,我觉得适当的类中提供常量以供使用是完全可取的。...一个""到底是真的就是空内容?还是开发者忘记写上内容了。所以建议自己全局类上建立一个空的String。 其他地方引用。 我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

13010

面试官太难伺候?一个try-catch问出这么多花样

大家都知道TCF,执行到return的时候会先去执行finally的操作,然后才会返回来执行return,那这里为啥会是1?我们来反编译一下字节文件。...答案是2不是1。 我们再来看下该程序的字节指令 通过对比发现,第6行一个是iload_1,一个是iload_0,这是由什么决定的?...块包含return语句,则不会对try块返回的值进行保护,而是直接跳到finally语句中执行,并最后finally语句中返回返回值是finally块改变之后的值; finally 为什么一定会执行...细心地小伙伴应该能发现,上边的字节指令图中第4-7行和第9-12行的字节指令是完全一致的,那么为什么会出现重复的指令?...让我们回归到最初的问题上,为什么finally代码的字节指令会重复出现三次

40050

Java源代码到字节的转换过程,Javac编译器是如何处理异常的

Java源代码到字节的转换过程,Javac编译器会对异常进行处理。具体的处理方式如下:源代码中出现的异常会被编译器捕获和检查。...如果源代码的代码块可能抛出异常,编译器会检查这些代码块是否包含try-catch或者throws声明来处理这些异常。如果异常被try-catch块捕获,编译器会生成适当的字节来处理这些异常。...如果找到合适的try-catch块,编译器会生成相应的字节来处理异常。如果异常最终未被捕获,编译器会生成字节来创建异常对象并抛出异常。这会导致程序的执行终止,并将异常传播到调用者的异常处理机制。...总之,Javac编译器会生成适当的字节来处理源代码中出现的异常。这可以包括生成异常表和生成异常处理代码来捕获和处理异常,或者抛出异常到调用者链的异常处理机制

16830

JVM之程序计数器

它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 字节解释器工作时就是通过改变这个计数器的值来选取吓一需要执行的字节指令 它是唯一一个...java虚拟机规范没有规定任何OOM(OutOfMemoryError)情况的区域 四、代码示例 创建一个Java类 public class PCRegisterTest { public...五、面试常问 1.使用PC寄存器存储字节指令地址有什么用? ​...因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行 ​ JVM的字节解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节指令 2.PC寄存器为什么会设定为线程私有...由于CPU时间片轮限制,众多线程并发执行过程,任何一个确定的时刻,一个处理器或者多核处理器的一个内核,只会执行某个线程的一条指令。 这样必然导致经常中断或恢复,如何保证分毫无差

1.4K40

虚拟机字节执行引擎

所谓的「虚拟机字节执行引擎」其实就是 JVM 根据 Class 文件给出的字节指令,基于栈解释器的一种执行机制。通俗点来说,也就是 JVM 解析字节指令,输出运行结果的一个过程。...方法调用的本质 描述「字节执行引擎」之前,我们先从汇编层面看看基于栈帧的方法调用是怎样的。...这里的解决办法是,call 指令的第一步就是将返回地址压栈,然后向 sayHell 方法执行,这里我们看不到它压栈的过程,被集成为一条指令了。...所以我们的 Java 毋庸置疑使用的是栈。 运行时栈帧结构 Java ,一个栈帧对应一个方法调用,方法需涉及到的局部变量、操作数,返回地址等都存放在栈帧的。...编译器为我们生成的方法调用指令,选择调用的是静态类型的对应方法,但是为什么最终的结果却调用了是实际类型的对应方法

96880

虚拟机字节执行引擎

所谓的「虚拟机字节执行引擎」其实就是 JVM 根据 Class 文件给出的字节指令,基于栈解释器的一种执行机制。通俗点来说,也就是 JVM 解析字节指令,输出运行结果的一个过程。...方法调用的本质 描述「字节执行引擎」之前,我们先从汇编层面看看基于栈帧的方法调用是怎样的。...这里的解决办法是,call 指令的第一步就是将返回地址压栈,然后向 sayHell 方法执行,这里我们看不到它压栈的过程,被集成为一条指令了。...所以我们的 Java 毋庸置疑使用的是栈。 运行时栈帧结构 Java ,一个栈帧对应一个方法调用,方法需涉及到的局部变量、操作数,返回地址等都存放在栈帧的。...编译器为我们生成的方法调用指令,选择调用的是静态类型的对应方法,但是为什么最终的结果却调用了是实际类型的对应方法

49840

如何实现一个短链接服务 | 短链接生成原理

不过该方法生成的短码位数是固定的,也不存在连续生成的短有序的情况。 普通随机数 该方法是从62个字符串随机取出一个6位短的组合,然后去数据库查询该短是否已存在。...如果已存在,就继续循环该方法重新获取短,否则就直接返回。 该方法是最简单的一种实现,不过由于 Math.round()方法生成的随机数属于伪随机数,碰撞的可能性也不小。...对于过期数据的处理,可以新增短链的时候判断当前短链的失效日期,将每天到达失效日期的数据HBase单独建一张表,有新增的时候判断失效日期放到对应的HBase表即可,每天只用处理当天HBase表的失效数据...如何转 当我们浏览器里输入 http://bit.ly/a3300 时 DNS首先解析获得http://bit.ly的IP 地址 当DNS 获得IP 地址以后(比如:12.34.5.32),会向这个地址发送...这里有个小的知识点,为什么要用 301 跳转而不是 302 呐? 知识点:为什么要使用302跳转,而不是301跳转? 301是永久重定向,302是临时重定向。

15.7K30

Java代码是如何被CPU狂飙起来的?

另外需要注意的是.class并不是一次性全部加载到内存,而是Java应用程序需要的时候才会加载。...魔数与文件版本 魔数的作用就是告诉JVM自己是一个字节文件,你JVM快来加载我吧,对于Java字节文件来说,其魔数为0xCAFEBABE,现在知道为什么Java的标志是咖啡了吧。...方法返回地址:当一个方法执行完毕后,JVM会将记录的方法返回地址数据置入程序计数器,这样字节执行引擎可以根据程序计数器的地址继续向后执行字节指令。...CPU接收到中断请求后,会停止当前的任务,并转而执行中断处理程序,这个处理程序是由操作系统提供的。中断处理程序会根据中断类型,执行相应的操作,并返回到原来的任务继续执行。...中断返回过程,CPU会将处理完的结果保存在寄存器,然后从栈中弹出被中断的程序的现场信息,恢复之前的现场状态,最后再次执行被中断的程序,继续执行之前被中断的指令。 那么CPU又是如何响应中断的

37311

自己动手DIY一台2.4G简易频谱仪

我之前也是发布了《制作HackCube的坎坎坷坷》。这次带来的是一个简易的频谱仪。 说先要说一下为什么要制作这个小东西。 1. 为了装13 2....主控检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址和一位R/W); 3....主控检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址和一位R/W); 3....停止信号STOP 时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正变),停止信号也必须是变信号。 4....这里的解释还是https://www.cnblogs.com/yan0837/articles/1202374.html 为什么要说这个协议,目前IIC的通信相对与其他一些高速的通信协议来说还是比较慢的

2.2K10

使用ASM实现简单的AOP

ASM是一个java字节操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以类被加载入 Java 虚拟机之前动态改变类行为(摘自网友翻译)。...Java bytecode instruction listings 里面非常详尽的介绍了字节指令以及字节指令对栈帧的影响(这个特别重要)!...这其实有几个比较有意思的点,第一个就是为啥要压入adviceId而不是压入adviceListener,主要是AdviceAdapter的上下文中,使用ASM很难获取到adviceListener的实例变量...转而使用adviceId进行标识然后从静态Map获取。...由于java没有异常处理语句,字节执行过程异常的跳转完全靠异常表完成,那么这句话的意思也可以理解为向异常表添加一种异常 handler,该handler的起始部分为beginLabel ~ endLabel

1.6K30

Spring杂谈 | 从桥接方法到JVM方法调用

如果你认真看了上面的代码,你应该就会知道上面例子的特殊之处在于: 子类对父类的方法进行了重写,并且子类方法返回值类型跟父类方法的返回值类型不一样!!!! 那么到底是不是这个原因导致的?...如果大家感兴趣的话,推荐阅读周志明老师的《深入理解Java虚拟机》 ” 字节分析 接下来我们就通过一段字节的分析来看看JVM到底是如何调用方法的,这里就以我们前文中第一个例子的代码来进行分析。...字节图解1 ? 字节分析2 ? 字节分析3 接下来就要执行invokevirtual指令,执行这个指令我们将操作数栈的状态放大来看看 ?...为什么不能识别? 嗯,我也没办法回答这个问题,JVM在对方法覆盖的定义就是这样,必须要方法签名相同。 但是Java对于重写的定义?...只是要求方法的返回值类型相同就行了,正是因为这二者的差异,导致了编译器不得不生成一个桥接方法来进行平衡。 那么到底是不是这样

1.5K20

java字节byte code简介

简介 Byte Code也叫做字节,是连接java源代码和JVM的桥梁,源代码编译成为字节,而字节又被加载进JVM运行。...字节怎么生成,怎么查看字节,隐藏在Byte Code背后的秘密是什么?快跟小师妹一起来看看吧。 Byte Code的作用 小师妹:F师兄,为什么Java需要字节?...然后相应的运行环境执行。那么有没有可能,不需要JVM,不需要机器,而是直接在对应的平台上执行字节? ? 爱因斯坦说过没有想像力的灵魂,就像没有望远镜的天文台。 ?...一般来说Java processor不会实现全部的字节的功能,只会提供部分的实现。 查看Byte Code字节 小师妹:F师兄,那使用javac编译过后的class文件跟字节有什么关系?...小师妹:F师兄,你说class文件是byte code,为什么IDE打开的时候,直接显示的是反编译出来的源文件? 小师妹,这是IDE的一个便利功能。

1.4K31

金三银四遇寒冬,朋友却怒刷 6 个大厂的 Offer ,面霸是如何做到的?

正是行业寒冬使得他们能够借机吸引到优秀的人才来提高人力资源的厚度,马太效应同样人才市场存在。...结合以上数据,对各位身处互联网中心的程序员们来说几点建议: 1、稳字当头,跳槽可以但不能乱,一定要优选互联网头部优质公司,比如阿里腾讯和字节跳动。...那么,程序员应从哪些方面来提升自己的核心技术能力? 以我朋友为例,他之前一家中型的互联网公司做Java研发相关工作,工作主要就是做些业务代码的增删改查,偶尔也帮公司搭下技术框架。...(1) 要具备扎实的Java基础 这里所谓扎实的Java基础不是我们通常所理解的Java语法、面向对象的概念,而是能深刻理解Java的多线程开发,熟练使用NIO技术优化网络编程,了解JVM的底层机制,具备底层性能调优的能力...(5) 沟通合作的能力 程序员的战斗,往往不是一个人的战斗,我们如何在一个平台下高效的去重,进行代码review,对功能进行调整、debug,做到统一的规划下步步为营,混乱的堆代码的过程中找到自己的记录

50270

一文带你读懂JVM类加载机制

加载 加载阶段主要查找并加载类的二进制数据, 类加载器通过一个类的完全限定名查找此类字节文件,并利用字节文件创建一个class对象....加载阶段, 虚拟机需要完成以下三件事情: 通过一个类的全限定名来获取其定义的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 Java堆中生成一个代表这个类的java.lang.Class...当前类加载器尝试寻找Class文件,如果找到则执行第6步,如果找不到则执行第7步 从文件载入Class,成功后至第8步 抛出ClassNotFountException异常 返回对应的java.lang.Class...之外; 字节验证undefined通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的....这里所设置的初始值通常情况下是数据类型默认的零值(如0、0L、null、false等)而不是Java代码中被显式地赋予的值.

39720

Python数据挖掘简介

为什么用Python进行数据挖掘?” 我曾经使用过C、C++、Java、C#编程,实际从事IT项目开发已7年多时间。...感觉编写C程序就像是刚打过蜡的舞场内快舞—容易摔跤,C++则难学更是难用,Java很多方面就像是C++,而C#则是升级版的Java,直到用了Python后,才明白原来编程也可以如此轻松,如此幸福,...03 — 为什么用Python进行数据挖掘?...Python程序语言与数据挖掘可以说是“珠联璧合”,因为使用Python编程技巧进行数据挖掘至少有以下四个优势: 一、解释型语言方便调试:Python与Java类似,是一门解释型编程语言,源代码要通过其解释器转换为字节...二、跨平台编程作业:只要平台安装有用于运行Python字节的虚拟机,那么Python便可以跨平台运行。这点和Java虚拟机相似。

72790

JavaSE的自动装箱和自动拆箱

8字节 Double char 2字节 Character boolean 未定 Boolean Java属于面向对象语言那么为什么会出现非对象类型数据(基础类型),因为基础数据类型是的虚拟机的运行速度更快而且占用内存更少...详情内容可以参见:Java为什么需要保留基本数据类型 为什么要有装箱&拆箱 JavaSE5之前我们创建爱你Integer对象: Integer i = new Integer(10); 从JavaSE5...使用了IntegerCache 返回缓存对象的引用,否则new一个新的对象。 看到上面这个答案,有些同学就会想到:除过Integer之前还有其他的基础数据类型,那么其他的类型是否也是专业那个的?...我们知道操作"=="的两个数都是数据包装类型对象的引用的话,那么则是用来比较两个引用所指向的对象是不是同一个;而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。...为什么,因为"=="两边引用数据类型必须一致,要不然无语错误。 所以我们得到上边题目的答案是:true、false。

44030

30 张图,以 DEBUG 方式深入理解线程的底层运行原理

这一点 Java 虚拟机规范的描述是:所有的对象实例以及数组都要在堆上分配。...《深入理解 Java 虚拟机:JVM 高级实践与最佳实战 - 第 2 版》给出了答案:如果线程正在执行的是一个 Java 方法,程序计数器记录的就是正在执行的虚拟机字节指令的地址;如果正在执行的是...而加载进来的这些字节信息,就存储方法区。看下图,这里为了各位理解方便,我就不写字节了,直接按照代码来,大家知道这里存的其实是字节就行: ?...那么这个参数 args 的值从哪里来?没错,就是从堆 new 出来的: ? 而 main 方法的返回地址就是程序的退出地址。...再来看程序计数器,上文说过,如果线程正在执行的是一个 Java 方法,程序计数器记录的就是正在执行的虚拟机字节指令的地址,也就是说此时 method1(10) 对应的字节指令的地址会被放入程序计数器

37200
领券