浮点数存储、equals和==、两种创建Sring对象区别

继续java基础的复习。。。今天主要复习浮点数在计算机中的存储过程,以及一个String对象的两种创建创建方式有何不同,以及equals方法和==判断两个对象相等时有什么区别。
Q:String s="123";和String s=new String("123");的创建方式有什么不同?
A:第一种创建方式它会在内存中创建0个或者1个对象,当JVM执行这条语句的时候它会在字符串常量池中找这个“123”对象,如果找到该字符串常量,则直接返回该字符串常量的地址或者说该字符串的引用,而不会再去创建“123”这个String对象。第二种创建方式,它则会在内存中创建1个或者2个对象,同样的当JVM在执行这条语句的时候会在字符串常量池中查找,是否有该字符串常量,如果有并且由于它是用new关键字创建的对象,则会用该字符串常量的值在堆中再创建一个String对象,此时就创建了一个“123”对象,而如果没有在字符串常量池中找到该字符串,则会在将“123”加入到字符串常量池中,然后再用该字符串常量的值进行new操作,在堆中再创建一个“123”对象,此时创建了2个“123”对象。因此这两条语句创建的对象如果进行==比较时返回的是false,无论这两条语句的顺序如何,原因在于使用new关键字,则肯定会在堆中创建一个对象。
Q:浮点数在计算机中是如何进行存储的?说一下存储过程
A:在计算机中所有的数据都是由二进制0,1表示的,在java中整数是用二进制补码表示,而在java中浮点数在计算机中的存储是按IEEE754浮点数规格化来规范的,在IEEE754规范中并没有将32位单精度浮点数命名为float,以及将64位双精度浮点数命名为double。它只是将浮点数进行了规范。具体规范如下:32位单精度浮点数在计算机中是这样存储的:它用最高的1位即第31位来表示符号位,1表示负数,0表示正数;用接下来的8位表示指数位,即23位到30位,用移码表示。最后用0-22,这23位来表示尾数,用原码表示,格式为1.xxxxx,小数点前为非0的数字,也就是1。移码的实现是在原码基础上再加一个偏移量,32位单精度浮点数的偏移量为+127(具体转换即是在该数的补码表示中将最高符号为取反即为移码)。具体存储过程如下:首先将十进制小数转化为纯二进制小数,然后将二进制小数转化为二进制指数形式(将小数点移至一个数和第二个数之间,且第一个数为1)然后将底数与指数相分离,指数部分按移码表示,底数部位也就是尾数部分按源码表示,并且将尾数部分小数点和小数点之前的1省略(这是IEEE754的一种约定,可以扩大表示的范围,及相比其他浮点数规格化可以多表示一位)然后将各个段按位补齐补0。然后以 数符+指数+尾数 这种顺序连接起来,计算机浮点数就是这种形式存储的。至于64位双精度浮点数,它最高位为数符,接下来11位表示指数,用移码表示,最后52位表示尾数按源码表示,具体存储过程和单精度类似。单精度取值范围大概在[-3.4*10^38,  3.4 * 10^38],双精度浮点数的取值范围在[-2.23*10^308~+2.23*10^308]。
Q:equals和==判断两个对象相等时有什么区别?
A:使用==来判断两个对象是否相等时,是直接比较两个对象的堆内地址,如果相等则说明这两个引用指向的是同一块内存区域。那么可能会问既然比较的是地址那么int类型又是怎样比较的?String类型又是怎么比较的?对于基本数据类型他们是作为常量放在方法区里的常量池里的。在常量池中一个常量只会对应一个地址,不管你创建多少个123这种数据它都只会在内存中存在一个地址,它们的引用都指向同一个地址,所以对于基本数据类型和String数据类型它们是可以直接用==来判断相等的。对于包装类型它们也存在常量池这种概念。比如Integer,它也有常量池范围为-128-+127在这个范围内创建创建对象由于这些值在常量池中存在,在内存中只对应一个地址,当然这里不包括使用new关键字创建的对象。而equals方法呢,可以知道equals方法是所有的父类Object类中的public方法,在Object方法中它的实现实际上就是使用==来判断相等的。但是也正是由于它是Object类的公有方法,所以子类是可以重写它的,因此在不同环境下equals的实现方法也会有差异,比如我们自定义一个Student类,我们认为如果这两个学生对象的学号相同,那么我们就认为他们是同一个学生认为他们两个对象之间equals方法的返回值为true。当然我们也可以将equals方法直接返回true,认为所有对象都是相等的。因此==判断两个对象是否相等,实际判断的是对象的堆内地址,而equals方法在没有重写Object方法中的equals方法之前它实际也就是==。但是在不同环境下的equals方法的实现方式不同它判断相等的依据也会不同。相比较equals更灵活。
全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结: 27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务