Java常用类01 包装类
Java常用类
一. 基本类型的包装类
-
Java是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本数据转化成对象,以便于操作。比如∶将基本数据类型存储到Object[]数组或集合中的操作等等。
-
为了解决这个不足,Java在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。
-
他们都位于
java.lang
包下,对应关系如下表:
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
-
上面8个类,除了
Boolean
和Character
以外都是数字类型,他们都是抽象类java.lang.Number
的子类。而Number类提供了intValue()
,longValue
等一系列抽象方法,所以几个数字类饿包装类都可以相互想转型。 -
以下是几个使用包装类的实例,其他包装类类似,大家可以自行学习。
package konoha.commonClass.packageClass; //整型的包装类 public class ClassInt { public static void main(String[] args) { Integer i = 1; ////自动装箱,JDK1.5之后的特性,使用了valueOf()方法 System.out.println("i: " + i.toString()); Integer a = new Integer(3); //通过new方法新建一个Integer对象 Integer b = Integer.valueOf(3); //通过valueof方法新建一个Integer对象 //推荐的构造方式 System.out.println("A: " + a + " B: " + b); System.out.println("============================="); int c = a; //从包装类到基本类型会自动解包 System.out.println("C: " + c ); System.out.println("============================="); Integer d = Integer.valueOf("898"); //从字符串转换数字 //Integer e = Integer.valueOf("898", 8); radix参数表示什么? //还可以使用Integer.parseInt()方法 System.out.println("10进制:" + d ); System.out.println("=============== =============="); //把包装类转化成字符创,使用toString()方法 System.out.println("toString()方法转换为字符串: " + d.toString()); System.out.println("============================="); //包装类定义了一些常用的常量 System.out.println("Int Max value: " + Integer.MAX_VALUE); System.out.println("Int Min value: " + Integer.MIN_VALUE); System.out.println("Integer Value Type: " + Integer.TYPE); System.out.println("============================="); //相同值的包装类 Integer m = 500; Integer n = Integer.valueOf(500); System.out.println(m.equals(n)); } }
package konoha.commonClass.packageClass; //布尔型的包装类 public class ClassBoolean { public static void main(String[] args) { Boolean a = true; Boolean b = Boolean.valueOf("false"); Boolean c = new Boolean(true); System.out.println(a+", " + b + ", " + c); System.out.println("============================="); System.out.println("a hashCode: " + a.hashCode()); System.out.println("a toString: " + a.toString()); System.out.println("a.equals(c): " + a.equals(c)); System.out.println("============================="); /** * Boolean实例的compareTo()方法 * 两个bool值相同返回 0 * 值为true的对象调用compareTo()方法和false比较返回 1 * 值为false的对象调用compareTo()方法和true比较返回 -1 */ System.out.println("compareTo method"); System.out.println("a.compareTo(true): " + a.compareTo(true)); System.out.println("a.compareTo(false): " + a.compareTo(false)); System.out.println("b.compareTo(false): " + b.compareTo(false)); System.out.println("b.compareTo(true): " + b.compareTo(true)); } }
-
包装类的基本作用:提供了基本数据类型,包装类,和字符串类型之间的数据转化。
-
缓存问题:先看如下的代码,分析一下他的输出是什么。
package konoha.commonClass.packageClass; public class TestCache { public static void main(String[] args) { Integer a = 24; Integer b = 24; Integer m = 354; Integer n = 354; System.out.println("m == n : " + (m == n)); //false System.out.println("m.equal(n) : " + (m.equals(n))); //true System.out.println("a == b : " + (a == b)); //true System.out.println("a.equals(b) : " + (a.equals(b))); //true } }
前面两个输出很好理解,由于我们新建了两个对象,a,b是两个对象的引用,
a==b
比较是两个引用值,所以肯定是false。而equals()
方法根据源码可以看出比较两个的值是否相等,所以是true。那第二个的输出是怎么回事呢?我们前面提到过自动装箱使用的是
valueOf()
方法创建的包装类。那么valueOf()
是怎么实现新建类的呢?下面是valueOf()
的源码:public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
发现里面有一个关于
IntegerCache
的判断条件满足条件的话他返回一个IntegerCache
类中cache
数组的一个元素。也就是说,在-128~127这个范围类的数使用自动装箱时都是返回了一个已经创建好的对象,所以其实a,b两个引用其实指向了一个对象,所以a==b
返回了true。了解更多详细的信息,可以查看Integer类的源码。