1.float类型在Java中占用4字节,long类型在Java中占用8个字节,为什么float类型的取值范围比long类型的取值范围还大?
答案:作为一个常识,我们都知道浮点型在内存中占用的是4个字节的空间,而long型占用的是8个字节的空间。可是为什么4个字节的float型的最大值会大于long型的最大值呢?
我们都知道,float类型的范围是:一3.403E38~3.403E38。而long类型的范围是:-2^63~2^63-1(大概是9*10^18)。
我以前也是简单的记住就算完事了,对于它为什么会这样却没有考虑过。
下面给大家分享一下我现在的理解:
long整型数,在内存中占用8个字节共64位,它表示的数值有2的64次方,平分正负,数值范围是负2的63次方到正2的63次方-1。
而float在内存中占4个字节,共32位,但是浮点数在内存中是这样的:
V=(-1)^s * M * 2^E
浮点数的32位不是简单的直接表示大小,而是按照一定的标准分配的。
其中第1位,符号位,即S。
接下来的8位,指数域,即E。
剩下的23位,小数域,即M,M的取值范围为[1,2)或[0,1)。
也就是说,浮点数在内存中的二进制值不是直接转换为十进制数值的,而是按照上述公式计算而来,通过这个公式,虽然只用到了4个字节,但是浮点数却比长整型的最大值要大。
这也就是为什么在数据转换的时候,long类型转换为float类型的根本原因所在!
2.使用”+“可以连接两个字符串(String对象),那么,是怎样进行连接的?
答案:字符串是Java程序中最常用的一种数据结构之一。在Java中的String类已经重载的"+"。也就是说,字符串可以直接使用"+"进行连接,如下面代码所示:
String s = "abc" + "xyz";下面让我们先看看如下的代码:
public class Test { public static void main(String[] args) { String s = "abc"; String ss = "is" + s + "man" + 5; System.out.println(ss); } }
上面的代码将会输出正确的结果。从表面上看,对字符串和整型使用"+"号并没有什么区别,但事实真的如此吗?下面让我们来看看这段代码的本质。
我们首先使用反编译工具(如jdk带的javap、或jad)将Test反编译成Java Byte Code,其中的奥秘就一目了然了。在本文将使用jad来反编译,命令如下:
jad -o -a -s d.java TestSimplePlus.class
反编译后的主要代码如下:
import java.io.PrintStream; public class Test { public static void main(String args[]) { String s = "abc"; String ss = (new StringBuilder("is")).append(s).append("man").append(5).toString(); System.out.println(ss); } }
从上面的代码很容易看出,虽然在源程序中使用了"+",但在编译时仍然将"+"转换成StringBuilder,并且使用了该对象的append()方法来实现字符串的连接。因此,我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。
3.正在添加......