浮点数存储、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更灵活。
全部评论

相关推荐

迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
04-16 19:19
已编辑
合肥大学 Java
刷了100道题的大老虎很想提桶:27届现在早没日常hc了,不可能找到的,等暑假9月吧
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-29 15:00
教授A:“你为什么要讲这么久,是要压缩我们对你的评议时间吗?你们别以为这样就能够让我们对你们少点意见。” “从你的发言和论文格式就能知道你的性格啊。”……. 感觉被狠狠霸凌了。
码农索隆:“教授您好,首先我想回应您提出的两点疑问。” “关于我讲解时间较长的问题:这绝非为了压缩各位老师的评议时间。这份毕业设计是我过去几个月倾注了全部心血的作品,从构思、实验、调试到撰写,每一个环节都反复打磨。我深知时间宝贵,所以选择详细讲解,是希望能更完整、清晰地展示它的核心创新点、实现过程和验证结果,确保老师们能充分理解它的价值和我的努力。我完全理解并重视评审环节的意义,也做好了充分准备来听取各位老师的专业意见和批评。几个月的研究都坚持下来了,我怎么可能害怕老师们的点评呢?今天站在这里,正是抱着虚心学习、诚恳求教的态度而来。” “如果我的展示确实超时,影响了后续流程,烦请老师们随时示意,我会立刻调整。我非常期待并预留了充足的时间,希望能听到老师们宝贵的建议和深入的讨论。” “其次,关于您提到‘从发言和论文格式就能知道我的性格’。教授,我对此感到非常困惑和不安。学术研究和答辩的核心,难道不应该是作品本身的质量、逻辑的严谨性、数据的可靠性和结论的合理性吗?论文格式有明确的规范要求,我尽最大努力遵循了这些规范。如果格式上存在疏忽或不足,这属于技术性、规范性的问题,恳请老师们具体指出,我一定认真修改。但将格式问题或个人表达风格(如讲解时长)直接上升为对个人性格的评判,甚至以此作为质疑我学术态度和动机的依据,这让我感到非常不公平,也偏离了学术评议应有的客观和严谨原则。” “我尊重每一位评审老师的专业权威,也衷心希望能得到老师们对我的工作内容本身的专业指导和批评指正。任何基于研究本身的意见,无论多么尖锐,我都会认真聆听、反思并改进。但我恳请老师们,能将评议的焦点放在我的研究本身,而不是对我个人进行主观的推断或评价。谢谢各位老师。”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务