java中有8种基本的数据类型,其中每一种数据类型都对应了一种包装类。java是纯面向对象的语言,在java中的一切东西都可以用对象的形式表示,包括java中的基本数据类型。包装类中除了Integer和Character外,其他的包装类都是以java中的基本数据类型的首字母大写命名的。
每个包装类中都有一个静态的方法来将java的基本数据类型转换为包装类,这个静态方法接受一个对应的基本类型参数然后返回一个包装类的引用:
int i = 10; Integer i1 = Integer.valueOf(i);
还有一个实例方法xxxValue()返回该包装类对应的基本数据类型:
Integer i1 = new Integer(1); int i2 = i1.intValue();
其中把基本的数据类型转换成包装类型我们习惯将其称之为装箱,把包装类型转换为基本类型我们称之为拆箱。在java5之后java引入了自动装箱和拆箱,我们在代码中可以直接把基本数据赋值給包装类由java编译器来帮我们调用对应的valueOf方法和xxxValue方法。
在包装类中除了toString方法还有几个常用的和String有关的方法。除了Character外,每个包装类中都有一个静态的ValueOf(String s)方法接受一个字符串返回一个包装类。
Integer i2 = Integer.valueOf("1");
还有一个静态的parseXXX(String)方法根据字符串返回基本的数据类型,如:
int i = Integer.parseInt("1");
还有一个静态的toString方法根据基本的数据类型返回一个字符串:
String s = Integer.toString(1)
在java中每一个类都有一个共同的父类Object。在Object类中有两个方法分别是:euqals和hashCode方法。首先我们先来介绍一下equals方法:equals方法是用来判断当前对象和传入的参数对象是否相等。其中两个比较的是对象的内存地址也就是说当两个引用指向同一个对象时这个方法才会返回true。这个equals的默认实现显然不符和我们的需求,所以我们需要在我们自己创建的对象中重写这个方法。在java的包装类中就默认重写了这个方法,例如:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
这里需要注意的是最好不要用equals方法来判断两个Float或者两个Double是否相等,因为在java中比较浮点类型是将其转换成二进制比较只有两个浮点数的二进制完全相同才会返回true。我们知道在计算机中小数的计算是不精确的所以有时会出现虽然数学运算的结果相同但是计算机的运行结果却不相同导致方法返回结果和我们预期的不同。
介绍完equals方法我们在来介绍一下hashCode方法。hashCode返回对象的一个hash值,其中一个对象的hashCode值是不能改变的,不同的对象hashCode值可以相等但是最好不等。这里我们需要知道,对于两个对象如果,如果equals方法返回true那么hashCode值就必须一样,相反如果两个对象的hashCode相等,那么equals方法可以返回true也可以返回false。hashCode的默认实现一般是将对象的内存地址转换为整数。由于equals方法和hashcode方法的关系,当我们重写equals方法时也必须重写hashCode方法。关于equals方法和hashCode方法我会在java容器中在详细的介绍。