写点什么

Long 与 Arrays 的使用注意

作者:zarmnosaj
  • 2022 年 5 月 12 日
  • 本文字数:1378 字

    阅读完需:约 5 分钟

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]));
}
复制代码


  1. 如果被搜索的数组是无序的,一定要先排序,否则二分搜索很有可能搜索不到,我们 demo 里面也先对数组进行了排序;

  2. 搜索方法返回的是数组的下标值。如果搜索不到,返回的下标值就会是负数,这时我们需要判断一下正负。如果是负数,还从数组中获取数据的话,会报数组越界的错误。demo 中对这种情况进行了判断,如果是负数,可以抛出异常。

用户头像

zarmnosaj

关注

还未添加个人签名 2020.02.06 加入

还未添加个人简介

评论

发布
暂无评论
Long与Arrays的使用注意_5月月更_zarmnosaj_InfoQ写作社区