当前位置: 首页 > news >正文

Javase补充-Arrays类的常用方法汇总

文章目录

      • 一 . 排序方法
      • 二 . 查找方法
      • 三 . 判断是否相等的方法
      • 四 . 拷贝方法
      • 五 . 填充方法

一 . 排序方法

我们第一个要介绍的就是sort方法
在这里插入图片描述
这个排序实现的底层逻辑应该是十分复杂的,以我们目前的水平体系应该无法理解,我们今天尝试用我们可以理解的一种排序算法,插入排序来模拟一下这个排序的实现

public static void swap(int[] arr,int i,int j){if(i == j){return;}arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}public static void insertSort(int[] arr) {if(arr == null || arr.length == 0){System.out.println("您的数组无法进行排序操作");return;}for (int i = 1; i < arr.length; i++) {for(int j = i; j > 0; --j){if(arr[j] < arr[j-1]){swap(arr,j,j-1);}}}}

我们第二个要介绍的是一种局部排序的方法
在这里插入图片描述

我们可以看到这个方法里面有三个参数,一个是arr(待排序的数组),一个是fromIndex,一个是toIndex,也就是从什么时候开始,和从什么时候结束,值得一提的是,我们java中这种定区间的方法一般是左闭右开,所以如果fromIndex==toIndex,也就是不进行数组的排序,…下面我们继续尝试用插入排序算法来模拟一下

 public static void insertSortOfRange(int[] arr,int fromIndex,int toIndex){//这个是我们的限制条件if(arr == null || arr.length == 0){System.out.println("您的数组无法进行排序操作");return;}else if(fromIndex > toIndex){System.out.println("起始位置还能比结束位置大???");return;}else if((fromIndex < 0 || fromIndex >= arr.length)||(toIndex < 0 || toIndex > arr.length)){System.out.println("数组下标越界...");return;}//下面才是真正的代码实现for(int i = fromIndex+1; i < toIndex; ++i){for(int j = i; j > fromIndex; --j){if(arr[j] < arr[j-1]){swap(arr,j,j-1);}}}}
public static void swap(int[] arr,int i,int j){if(i == j){return;}arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}

这里我们的技术可能还是不到位,不知道会不会出现什么bug
其实Arrays库里面还有好多sort方法的重载…这里也可以看出来方法重载的重要性…

其实Arrays类里面还提供了一个parallelSort方法,该方法的基本使用与sort方法是一致的,但是底层实现可能不同
在这里插入图片描述
下面是网上关于两种方法区别:
这是sort方法
在这里插入图片描述
这是parallelSort方法
在这里插入图片描述
范围检查方法 :
刚才我们在进行用插入排序来模拟sort方法的指定访问的时候,进行了范围的检查,实际上我们的Arrays类已经提供了一个进行范围检查的方法,如果你进行一些指定范围的原码的查看,你会发现都在调用这个方法
在这里插入图片描述

二 . 查找方法

我们目前的知识储备学过顺序查找,就是一个一个查找,时间复杂度为O(n),还有一个二分查找,时间复杂度是O(log2N),二分查找的效率要远大于顺序查找,我们Arrays类已经帮我们提供了一个二分查找的方法
在这里插入图片描述
原码其实也很简单,应该很好理解…
模拟一下

public static int binary(int[] arr,int key){int left = 0;int rigth = arr.length - 1;int mid;while(left <= rigth){mid = left + ((rigth - left)>>>1);if(arr[mid] < key) {left = mid + 1;}else if(arr[mid] > key) {rigth = mid - 1;}else{return mid;}}return -1;}

三 . 判断是否相等的方法

这个判断是否相等的方法也就是我们要介绍的equals方法
在这里插入图片描述
我们来简单的分析
首先当a == a2时,也就是二者引用同一块堆空间的时候,直接返回true
这个包括两者都是null的情况
其次就是如果其中一个为null,另外一个不是就返回false
然后又调用了一个方法对其他一般的情况进行判断…
下面我们来尝试模拟以下这个方法

public static boolean myEquals(int[] a,int[] a1){if(a == a1){return true;}if(a == null || a1 == null){return false;}if(a.length != a1.length){return false;}for(int i = 0; i <![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b13e01233e2645aeb5d6670b38dab582.png#pic_center)a.length; ++i){if(a[i] != a1[i]){return false;}}return true;}

判断局部相等的方法
在这里插入图片描述
这个我们就不进行模拟了…

四 . 拷贝方法

下面我们介绍两种方案来完成数组的拷贝
基础的for循环就不说了,过于基础了
基础库方法copyOf的分析:
下面是库函数的介绍在这里插入图片描述
下面是函数的模拟

public static int[] myCopyOf(int[] a,int newLength){//下面是一些判断的条件if(a ==  null){throw new RuntimeException("您的数组都没引用,咋拷贝啊");}else if(newLength < 0){throw new RuntimeException("新长度还能是负数?");}int[] arrCopy = new int[newLength];if(newLength <= a.length){for(int i = 0; i < newLength; ++i){arrCopy[i] = a[i];}}else if(newLength > a.length){for(int i = 0; i < a.length; ++i){arrCopy[i] = a[i];}}return arrCopy;}

注意,该库方法是用arraycopy方法来实现的
在这里插入图片描述
可以看到这个方法前面有native修饰,这就说明底层使用C/C++语言来实现的
同样的这个方法也有相应的范围方法

五 . 填充方法

在这里插入图片描述
这个方法比较简单没什么可说的…也不用再模拟了,已经告诉你实现的方案了,同时也有指定范围填充的方法
在这里插入图片描述

这一节我们应该会持续的更新,再不断学习Java的过程中不断完善相关Arrays类方法的分析与总结…

http://www.lryc.cn/news/305438.html

相关文章:

  • 微信小程序-人脸检测-眨眼驱动ESP32蓝牙设备灯
  • 怎么在wifi中实现手机和电脑文件互传
  • 07 STL 简介
  • unity学习(39)——创建(create)角色脚本(panel)——静态(static)
  • MacOS环境下用powerline配置Terminal终端
  • liunx单机项目部署
  • SQL 中如何实现多表关联查询?
  • oracle 设置权限 禁止删除用户
  • 港科夜闻|香港科大计划建立北部都会区卫星校园完善科大创新带,发展未来创新科技 未来医药发展及跨学科教育...
  • linux反弹shell简单使用
  • 前后端分离Vue+nodejs校园论坛bbs系统x450z
  • ChatGPT的能力边界在哪?
  • Sentinel微服务流量治理组件实战下
  • vue+node.js美食分享推荐管理系统 io551
  • 云原生超融合八大核心能力|ZStack Edge云原生超融合产品技术解读
  • 认识K8S
  • K8S-001-Virtual box - Network Config
  • ShardingSphere5.x 分库分表
  • cmake 项目。qt5升级 qt6 报错 error: “Qt requires a C++17 compiler 已解决
  • Flutter Engine 编译
  • 数据可视化在商业领域有哪些重要性?
  • UI风格汇:扁平化风格来龙去脉,特征与未来趋势
  • 【雷达指标】MTI/MTD性能
  • 暴雨服务器:科技创新构建高效、高质、可持续的新质生产力
  • 在 where子句中使用子查询(一)
  • kafka为什么性能这么高?
  • 安卓OpenGL添加水印并录制(二)---抖音录制原理
  • 动态绑定样式,uniapp,用三元运算动态绑定多个class类样式,动态绑定的样式可以和原始样式共存
  • 神经网络基础——激活函数的选择、参数初始化
  • ElasticSearch之聚合aggs