java中的Arrays类[概述]

Arrays类

概述:

Arrays类中包含了许多关于数组操作的静态方法

  • Arrays类中的方法都是静态方法
  • Arrays类中的方法都是静态方法,也就说明了Arrays中的方法没有一个是重写的方法

Arrays类位于java.util包中

  • java.util包中都是一些工具类,这些工具类大多数都是静态方法
  • java.util包中的Arrays类中的方法都是静态方法,都是通过类名进行调用

equals();

Arrays类中的equals(X x1,X x2 )方法中一次要传递两个参数(x1和x2)来进行比较

  • 因为Arrays类中的所有方法都是静态的(包括equals()方法),所以我们是通过类名进行调用的,所以就要传递两个参数进行比较
  • 而Object类中(父类中)是通过对象名进行调用的equals方法(),也就是Object类中的equals方法是非静态的,所以我们就通过对象名调用,这个时候我们就只需要再找一个对象来和调用这个方法的对象比较

sort();

  • 这里的传入的参数可以是一个(数组名),只传一个数组就是这个数组整个排序
  • 也可以是(数组,开始排序的位置(fromIndex),结束排序的位置(toIndex))
    • 这里的开始排序的位置到结束排序的位置,我们选取具体排序的区间时不是直接就在这个区间就排序,而是在左闭右开区间来排序
    • 这里三面两个方法其实在底层调用的方法相同,只是如果我们只传了一个数组名的话,那么我们就会将fromIndex默认为0,将toIndex默认为length-1;

特殊情况:

如果我们要对一个自定义对象类型的数组进行排序,我们直接调用Arrays.sort()方法在这个方法中传递这个数组名可不可以呐?

  • 答案是不可以,而且会报出一个运行时异常(ClassCastException(类型转换异常)),这里会说明你这个自定义类型的对象无法转型为Comparable类型

那为什么不能转型呐?

  • 我们知道,引用类型的转型需要满足的第一个条件是什么?----是转型对象和目标对象要存在继承关系,那么也就是说明我们这个自定义类和Comparable没有继承或者实现关系,所以我们就要去继承或者去实现这个Comparable<泛型>
    • 其实,Comparable<泛型>是一个接口
  • 那么我们要能够转型成功,也就是要用这个自定义类实现Comparable<泛型>接口
    • 实现了这个接口之后我们就可以转型成功了

但是要注意,我们实现了这个接口,并且我们这个自定义类不是一个抽象类,那么也就是说明我们必须要实现这个接口中的所有的抽象方法

  • 那么我们要如何去实现这个接口中的抽象方法
    • 这里,这个抽象方法是: compareTo(<泛型> o);
    • 这个方法的返回值是int型
      • 这里的返回值无非就是<0,=0,>0,通过这三种状态来判断我们两个比较的值哪个大哪个小
    • 我们实现的接口中的<泛型>是什么类型的, 那么这个重写方法的<泛型>就是什么类型

而我们在重写这个方法时,我们要在这个方法体中来完成什么事情呐?

  • 这里我们要知道这个compareTo()方法就是判断前后两个数的大小
    • 所以我们要做的就是返后对象的属性之间的一个差值,也就是做一个减法
      • 但是做减法只有基本数据类型中的一部分数据类型可以做减法
      • 那么像字符串就做不了减法,那么这个时候如果我们要进行比较的属性是字符串类型的话我们要怎么办?
        • 我们直接可以调用字符串中的compareTo()方法
        • 为什么字符串有compareTo()方法呐?
          • 因为我们字符串类在API文档中如果你去查阅你就会发现,String类,已经是实现了Comparable接口了,这里由于已经是确定了要比较字符串类型的值,那么这里的泛型就应该是<String 0>,并且肯定也已经实现了compareTO()方法

binarySearch();

  • 在调用这个方法前我们一定要先为数组排好序
  • 这个方法的返回值为int类型
    • 如果是查询到了(返回一个非负数),那么就会返回这个查询值在数组中的索引
    • 如果是查询不到(返回一个负数),那么就会返回这个查询值应该在这个数组的位置(也就是返回 -(low+1))

这个方法传递的参数也可以是有很多种,这些工具类中的方法一般都有很多重载的方法

  • 比如这个方法可以是传递数组名和我们想要查询的值

    • eg:

      Arrays.binarySearch(a,10);  //这里的a是一个数组,10是我们想要查找到的值
      
  • 这个方法也可以是传递数组名,我们想要开始查找的索引,我们想要结束查找的缩影,我们想要查找的值(注意:这里的查找区间也是左闭右开区间)

    • eg:

      /*
      这里的a是一个数组,这里的0使我们要开始查找的位置,这里的6使我们结束查找的位置,这里的5使我们要查找的值,开始查找的位置在底层代码中用fromIndex,结束查找的位置在底层代码中使用toIndex表示
      
      这里我们结束查找的位置是6,但是我们由于是左闭右开区间,所以我们我们在只查找到了索引为5的位置
      */
      Arrays.binarySearch(a,0,6,5); 
      

为什么总是左闭右开区间?

  • 因为我们默认遍历总是从0-遍历到length-1,而我们这些重载方法在基层又可能是同一种方式来解决问题的,所以我们一般传进来toIndex也是遍历到toIndex-1的位置,所以就是左闭右开区间

copyOf();

  • 这个方法的返回值是一个数组类型

copyOf()方法是传入两个参数,第一个是传入原数组名,第二个是传入新数组长度

  • 这个方法的功能就是返回一个新的数组,并且将原数组赋值到新数组中

    • 这种模式也叫做扩容模式
  • Arrays类中的方法都不是重写的方法,所以说数组对象在进行输出时也是调用了toString()方法但是调用的这个toString()不是重写的方法,而是object类中继承下来的toString()方法,这个时候输出的就是这个对象的包名.类名@哈希码值的十六进制字符表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值