ACDBBB 2024-07-03 10:44 采纳率: 0%
浏览 2

Arrays.binarySearch()函数不能用来查找Integer型数组吗

Arrays.binarySearch()这个函数,只能用来查找int[]数组的数据,不能用来查找Integer[]数组中的数据吗?

代码如下:

public static void main(String[] args) {
        Integer[] arrI = {1, 11, 34, 54, 66, 87, 99};
        Integer[] arrII = {99, 98, 76, 64, 44, 12, 9};
        int[] arrIII = {1, 11, 34, 54, 66, 87, 99};

        System.out.println("________________________________");
        System.out.println(Arrays.binarySearch(arrI, 66));
        System.out.println(Arrays.binarySearch(arrIII, 66));
    }

我知道binarySearch()函数使用的时候数组必须有序,设定的两个数组,除了数组类型不同其他都相同。
为什么int[]型数组就能找到66,返回4,而Integer[]型数组就找不到66,返回的是-8.
这是啥原因啊
运行结果:

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-03 10:44
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    Arrays.binarySearch() 函数确实可以用于 Integer[] 类型的数组,但是它在处理 int[]Integer[] 数组时的行为可能会有所不同,这主要是由于 Integer 类型的特殊行为。

    在 Java 中,int 是基本数据类型,而 Integer 是包装类。Integer 类型的对象可以缓存,这意味着 -128127 范围内的 Integer 对象会被自动缓存,并且多次创建相同值的 Integer 对象时,实际上是引用相同的缓存对象。这被称为自动装箱和拆箱。

    当你使用 int[] 数组调用 Arrays.binarySearch() 时,你实际上是在查找一个原始的 int 值。而当你使用 Integer[] 数组时,你查找的是 Integer 对象的引用。如果数组中的 Integer 对象和你要搜索的 Integer 对象不是同一个缓存对象,即使它们的值相同,binarySearch() 也会认为它们不相等。

    在你的代码中,arrIarrIII 包含相同的整数值,但是 arrI 中的是 Integer 对象,而 arrIII 中的是 int 原始类型值。当你在 arrI 中搜索 66 时,你实际上是在搜索一个 Integer 对象,而这个对象可能与数组中的 Integer 对象不是同一个实例。这就是为什么 Arrays.binarySearch() 返回 -8,表示没有找到元素。

    要解决这个问题,你可以确保 Integer 数组中的元素是按照自然顺序排序的,并且使用 IntegercompareTo 方法来比较元素。或者,你可以将 Integer 对象转换为它们的原始 int 值进行比较,例如:

    Integer toFind = 66;
    int index = Arrays.binarySearch(arrI, toFind);
    if (index < 0) {
        System.out.println("Element not found");
    } else {
        System.out.println("Element found at index: " + index);
    }
    

    这里,我们将 66 包装在一个 Integer 对象中,并使用这个对象调用 binarySearch()。这样,即使 arrI 中的 Integer 对象是缓存的,比较也应该是正确的。

    参考链接:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月3日

悬赏问题

  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 为什么在iis上部署网站,服务器可以访问,但是本地电脑访问不了
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像