Long 与 Arrays 的使用注意
Long 的缓存机制
这个点应该是很多人忽略的问题,其实 Long 内部做了一个缓存,缓存的范围是-128 到 127,以下为源代码:
private static class LongCache {
static final Long[] cache = new Long[256];
private LongCache() {
}
static {
for(int i = 0; i < cache.length; ++i) {
cache[i] = new Long((long)(i - 128));
}
}
}
复制代码
LongCache 为 Long 的静态内部类,其中有一个静态初始化方法,类在加载时,则会创建缓存。根据循环次数可以看到,缓存的数是-128 到 127。
在使用的时候,新建 Long 对象也不一定会用到缓存,例如:Long.valueOf()就会使用到缓存,而 parseLong 则不会用到缓存。
Long 的比较
如果要比较两个 Long 对象是否相等,使用的方法是 equals()。
如果要比较两个 Long 对象的数值是否相等,不是使用==,==只是判断两个变量指向的内存地址是否相同。需要使用 Long.longValue(),转换为 long 类型,再进行大小比较。
Arrays-排序
Arrays 中主要用于排序的方法是 Arrays.sort(),入参可以为多种类型,包括:int、long、double 等,也可以传入自定义类型的数组,Demo 代码:
class Student{
private String name;
//构造方法略
//get、set方法略
}
public void testSort(){
List<Student> list = Lists.newArrayList(
new Student("小明"),
new Student("小红"),
new Student("小吖"),
new Student("小天")
);
Student[] array = new Student[list.size()];
list.toArray(array);
System.out.println("排序前:" JSON.toJSONString(array));
Arrays.sort(array, Comparator.comparing(Student::getName));
System.out.println("排序后:" JSON.toJSONString(array));
}
复制代码
此处虽然使用的 String 类型的 name 排序,但是现象可以看出排序的目的已经达到了,也可实现 Comparatable 重写 compare 方法进行排序。
Arrays-二分查找
Arrays.binarySearch()可以用于快速从数组中查找出对应的值。 入参类型非常多,如 byte、int、long 各种类型的数组。还是使用刚刚的例子:
public void testSort(){
List<Student> list = Lists.newArrayList(
new Student("小明"),
new Student("小红"),
new Student("小吖"),
new Student("小天")
);
Student[] array = new Student[list.size()];
list.toArray(array);
System.out.println("排序前:" JSON.toJSONString(array));
Arrays.sort(array, Comparator.comparing(Student::getName));
System.out.println("排序后:" JSON.toJSONString(array));
int index = Arrays.binarySearch(array, new Student("小吖"),
Comparator.comparing(Student::getName));
if(index<0){
//未找到
}
System.out.println("搜索结果::" JSON.toJSONString(array[index]));
}
复制代码
如果被搜索的数组是无序的,一定要先排序,否则二分搜索很有可能搜索不到,我们 demo 里面也先对数组进行了排序;
搜索方法返回的是数组的下标值。如果搜索不到,返回的下标值就会是负数,这时我们需要判断一下正负。如果是负数,还从数组中获取数据的话,会报数组越界的错误。demo 中对这种情况进行了判断,如果是负数,可以抛出异常。
评论