java系列之 原生数据类型 (二)

2014-11-24 10:14:28 · 作者: · 浏览: 1
808
Double: size:64, Max:1.7976931348623157E308, Min:4.9E-324


有几点要注意


Boolean类型没有size属性,所以说大小是未定的。
JAVA里面的类型都是带符号的,而且是所有平台都是一样的长度。
Character类型的最大最小值的定义是


[java]
public static final char MIN_VALUE = '\u0000';
public static final char MAX_VALUE = '\uffff';

public static final char MIN_VALUE = '\u0000';
public static final char MAX_VALUE = '\uffff';所以char类型是可以指定中文的,如


[java]
char c1 = 'a';
char c2 = '我';

char c1 = 'a';
char c2 = '我';

还有一点疑问:为什么Integer和Float都是32位的,float的最大值比int的最大值大这么多?3.4028235E38是科学计数法,远远大于2147483647。答案就是一个是32位有符号的补码整数,一个是32 位 的单精度 IEEE 754 浮点数。但我不知道这有什么区别,烦知道的大拿不吝赐教。这2个东西有什么不一样,内存里面存放是如何的。

原生类型的特性(优势):


存放位置是放在栈里面,不需要用到堆,存储比较快。
不可变,包括包装类都是不可变的(全部是final)。

不可变的意思是说内存里面的值一旦被设置后就不会改变,如果要改变就会另外开辟一个位置存放新的值,但旧的值还在。如


[java]
int i1 = 1;
int i2 = 1;
i2 = 2;

int i1 = 1;
int i2 = 1;
i2 = 2;


第1,2行里面,i1和i2是一样的值,他们实际是指向同一个内存空间(虽然2个变量,实际一个空间),第2行i2修改成其他值的时候,i2就指向了一个新的内存空间,里面是2。


关于这个结论,不知道方法有没有可以通过代码来验证呢?知道的兄弟在评论里面说一下。


string类型的内存读写机制和这个一样。


BigDecimal:


float和double不能存在精准的浮点数值,如果需要用到小数,可以使用BigDecimal。


[java]
float f1 = 0.999999999999f;
float f2 = 0.000000000001f;

System.out.println((1.0f - f1) == f2);
System.out.println((f1 + f2) == 1.0f);

float f1 = 0.999999999999f;
float f2 = 0.000000000001f;

System.out.println((1.0f - f1) == f2);
System.out.println((f1 + f2) == 1.0f);
输出第一个为false,第2个为true。具体原因没有深究。(这个例子不知道恰不恰当)


使用BigDecimal能精确运算浮点数。但使用构造函数需要小心,要使用字符串类型的构造函数。


[java]
BigDecimal bd1 = new BigDecimal("0.12345");
BigDecimal bd2 = new BigDecimal(0.12345);

System.out.println(bd1);
System.out.println(bd2);

BigDecimal bd1 = new BigDecimal("0.12345");
BigDecimal bd2 = new BigDecimal(0.12345);

System.out.println(bd1);
System.out.println(bd2);输出


[java]
0.12345
0.123450000000000004174438572590588591992855072021484375

0.12345
0.123450000000000004174438572590588591992855072021484375

java没有运算符重载,所以使用BigDecimal对象后,加减乘除就要调用对象的方法啦(add,subtract,multiply,divide),还有其他的方法自己查看提示即可。


数字进制:


一般使用都是10机制,8进制的是0开头,16进制是0x开头,这个和java script是一样的。有时候不小心容易出错。如 0100 和 100 就是不一样的值。


自动拆箱引发的空指针:


这是个工作上遇到的例子,简单写个样例代码。(不考虑规范和合理性。)


[java]
public class NullPointerDemo
{

public static void main(String[] args)
{
HashMap map = new HashMap();

int count = getCount(map.keySet()); // 这行报空指针错误
System.out.println(count);
}

private static Integer getCount(Collection keys)
{
if (keys == null || keys.isEmpty())
{
return null;
}

return keys.size();
}

}

public class NullPointerDemo
{

public static void main(String[] args)
{
HashMap map = new HashMap();

int count = getCount(map.keySet()); // 这行报空指针错误
System.out.println(count);
}

private static Integer getCount(Collection keys)
{
if (keys == null || keys.isEmpty())
{
return null;
}

return keys.size();
}

}运行报空指针错误。在这行
[java]
int count = getCount(map.keySet());

int count = getCount(map.keySet());根据经验,马上是断定map为空,才会抛出空指针,但实际上不是。反编译一看即知道缘由。反编译后,上面这行对应的代码是


[java]
int count = getCount(map.keySet()).intValue();

int count = getCount(map.keySet()).intValue();可见这行跑空指针