你真的理解Java的基本数据类型吗?

来源:互联网 发布:js自动切换图片 编辑:程序博客网 时间:2024/05/16 11:43

1. 低范围向高范围会出错
int a = 5;a = a - 1.0;

上面的代码是错误的。因为表达式里最大范围是double,因为无特殊说明,这样的小数是double,这样a-1.0是个double型的,赋值给int 是不允许的。

所以 

float f = 1.0;

也是错误的。

但是,对于 int , byte, short,char在各自范围内的是允许的。

正确: 

byte b = 1;
错误:

byte b = 8888;

2. 数值的下划线分隔

double a = 1.908_155_850

上面的代码是Java7新增的规范,设计的目的是为了让程序员更清楚看清长数字。

3. 除0真的安全吗?

很多比较java和C++/c等的书籍都会提到java的安全机制,比如除以0会得到Infinity,而不会抛出异常。

System.out.println(5/0);

在运行上述代码时是会有异常的。因为只要除以浮点0才会得到无穷大。

4. switch里能写什么?

一般的swith里只能写 int ,byte,short,char四个,但java7允许增加String类型。

5. 装箱、拆箱

JDK1.5后提供了自动装箱、拆箱操作,它的意思是你可以将一个基本数据类型直接和包装类型进行赋值。

要指出,虽然包装数据类型的变量是引用类型,但其实例可以和基本数据类型进行比较。如

new Integer(5) < 9;

在介绍.equals时许多书上都会提到,引用类型是不能直接比较相等的。比如:

Integer a = new Integer(5);Integer b = new Integer(5);System.out.println(a==b);

输出结果是false。但是若改为:

Integer a = 5;Integer b = 5;

结果又如何?运行结果是true。但是下面结果输出是false。

Integer a =300;Integer b =300;

这就让人困惑了。实际上我们查阅Integer的源代码可以发现,

系统在装箱时把-128到127范围内的int装箱后放入了一个i数组中,所以如果一个数字在这个范围内进行装箱后是可以直接比较的。

6. 常量池

以String为例,"Hello"直接量和new String("Hello")有什么区别呢?当直接使用如“Hello”等字符串直接量(包括编译时就已经计算出的),JVM会使用常量池(Constant pool)来管理它们,而使用String的构造器,新创建的String对象被保存在堆内存。也就是说,new String(“Hello")一共产生了两个对象。

比如,

String s1 = "Hello" + ”world“;String s2 = "Hell"+"o"+"world";System.out.println(s1==s2);

上面的结果是true.

因为JVM常量池保证相同的字符直接量只有一个,不会产生多个副本。因此s1,s2所引用的字符串可以在编译期间确定下来,且是常量池里同一个对象。

下面结果如何呢?

String s3="!";String s4="Helloworld!";String s5=s1+s3;

s4==s5输出是false。因为s5的值在编译时是无法确定的。除非s3和s4是final,这样就相当于一个简单的宏替换。


原创粉丝点击