6.2 java.lang包的更新
Java 7对java.lang包的更新也比较多,主要涉及基本类型的包装类、进程使用和线程类。下面分别具体介绍。
6.2.1 基本类型的包装类
Java 7对基本类型的包装类做了一些更新,以更好地满足日常的开发需求。第一个更新是在基本类型的比较方面,Boolean、Byte、Short、Integer、Long和Character类都添加了一个比较两个基本类型值的静态compare方法,比如Long类的compare方法可以用来比较两个long类型的值。这个compare方法更多是作为“语法糖衣”而存在的,可以简化进行基本类型数值比较时的代码。在Java 7之前,如果需要对两个int数值x和y进行比较,一般的做法是使用代码“Integer.value(x).compareTo(Integer.value(y))”,而在Java 7中可以直接使用“Integer.compare(x, y)”。
对于字符串内部化(string interning)技术,开发人员可能并不陌生,采用这种技术是常见的优化策略,可以提高字符串比较时的性能,是一种典型的空间换时间的做法。Java也采用了这种技术。在Java中,包含相同字符的字符串字面量引用的是相同的内部对象。String类也提供了intern方法来返回与当前字符串内容相同但已经被包含在内部缓存中的对象引用。在对被内部缓存的字符串进行比较时,可以直接使用“==”操作符,而不需要用更加耗时的equals方法。比如,在代码清单6-5中,第一个字符串比较的结果为true,第二个字符串比较的结果为false,第三个字符串比较的结果为true。第二个字符串比较如果使用equals方法进行,那么结果也是true。
代码清单6-5 字符串内部化的示例
public void stringIntern(){
boolean value1="Hello"=="Hello";
boolean value2=(new String("Hello")=="Hello");
boolean value3=(new String("Hello").intern()=="Hello");
}
Java 7把这种内部化机制扩大到了-128到127之间的数字。根据Java语言规范,对于-128到127范围内的short类型和int类型,以及\u0000到\u007f范围内的char类型,它们对应的包装类对象始终指向相同的对象,即通过“==”进行判断时的结果为true。为了满足这个要求,Byte、Short、Integer类的valueOf方法对于-128到127范围内的值,以及Character类的valueOf方法对于0到127范围内的值,都会返回内部缓存的对象。如代码清单6-6所示,在使用了内部缓存的情况下,由于第一个比较操作的数值是在-128到127之间,因此Integer类的valueOf方法返回的是同一个缓存对象,value1的值为true;而第二个比较操作的数值超出了默认的缓存范围,因此valueOf方法返回的是两个不同的对象,value2的值为false。
代码清单6-6 Integer类的内部化的示例
public void numberCache(){
boolean value1=Integer.valueOf(3)==Integer.valueOf(3);
boolean value2=Integer.valueOf(129)==Integer.valueOf(129);
}
如果希望缓存更多的值,可以通过Java虚拟机启动参数“java.lang.Integer.Integer-Cache.high”来进行设置。例如,使用“-Djava.lang.Integer.IntegerCache.high=256”之后,数值缓存的范围就变成了-128到256,再次运行代码清单6-6会发现,value2的值变成true,因为129处于修改之后的缓存范围之内。