您的位置:首页 > 编程语言 > Java开发

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

2013-09-28 00:02 225 查看
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,这样就相当于一个简单的宏替换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java