浮点数存储、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更灵活。
博客
32132
07-14 363
07-12 295
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值