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

news2024/11/16 3:41:40

文章目录

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

一 . 排序方法

我们第一个要介绍的就是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.coloradmin.cn/o/1468866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nodejs+vue图书阅读评分个性化推荐系统

此系统设计主要采用的是nodejs语言来进行开发&#xff0c;采用 vue框架技术&#xff0c;对于各个模块设计制作有一定的安全性&#xff1b;数据库方面主要采用的是MySQL来进行开发&#xff0c;其特点是稳定性好&#xff0c;数据库存储容量大&#xff0c;处理能力快等优势&#x…

C#,动态规划(DP)模拟退火(Simulated Annealing)算法与源代码

1 模拟退火 *问题:**给定一个成本函数f:r^n–>r*&#xff0c;找到一个 n 元组&#xff0c;该元组最小化 f 的值。请注意&#xff0c;最小化函数值在算法上等同于最大化(因为我们可以将成本函数重新定义为 1-f)。 很多有微积分/分析背景的人可能都熟悉单变量函数的简单优化。…

Linux---进程间通信(下)

1、System V 共享内存 原理如下图 系统调用接口介绍 int shmget(key_t key, size_t size, int shmflg) 功能&#xff1a;用来创建共享内存 参数 key&#xff1a;这个共享内存段名字&#xff0c;内核用key来标识共享内存size&#xff1a;共享内存大小shmflg&#xff1a;由九个权…

留子厨房开发日志

以下记录了使用go语言框架Beego&#xff0c;Mysql数据库&#xff0c;Redis数据库实现一个点菜/菜谱应用API的全过程。 技术方案 github地址 数据库设计 新建数据库&#xff1a; CREATE DATABASE menu;新建数据表&#xff1a; CREATE TABLE menu ( id int(10) unsigned NOT …

Docker 第十九章 : 阿里云个人镜像仓使用

Docker 第十九章 : 阿里云个人镜像仓使用 本章知识点: 如何创建镜像库,如何设置密码,如何登录与退出个人镜像仓,如何本地打镜像,如何将本地镜像推送到个人镜像库。 背景 在项目YapiDocker部署中,因读取mongo:latest 版本不一致,导致后续执行步骤的异常。遇到此场景…

OpenCV Mat实例详解 六

本文将接着OpenCV Mat实例详解继续介绍OpenCV Mat类的操作符及公有成员函数。 Mat & operator Mat & operator (const Mat &m) 将一个Mat对象赋值个另一个Mat对象。 Mat & operator (const MatExpr &expr) 将一个Mat表达式值赋值给Mat对象 Mat & op…

【高德地图】Android高德地图绘制标记点Marker

&#x1f4d6;第4章 Android高德地图绘制标记点Marker ✅绘制默认 Marker✅绘制多个Marker✅绘制自定义 Marker✅Marker点击事件✅Marker动画效果✅Marker拖拽事件✅绘制默认 Infowindow&#x1f6a9;隐藏InfoWindow 弹框 ✅绘制自定义 InfoWindow&#x1f6a9;实现 InfoWindow…

Covalent Network(CQT)与 Movement Labs 达成合作,重新定义 M2 系统区块链数据可用性与性能

Covalent Network&#xff08;CQT&#xff09;是行业领先的多链索引器&#xff0c;正在与 Movement Labs 的 M2 展开具有突破性意义的合作。M2 是以太坊上的首个 Move-EVM&#xff08;MEVM&#xff09;ZK rollup 。这一战略合作标志着先进的实时数据索引和部署工具&#xff0c;…

Sora - 探索AI视频模型的无限可能

Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展,AI视频模型已成为科技领域的新热点。而在这个浪潮中,OpenAI推出的首个AI视频模型Sora,以其卓越的性能和前瞻性的技术,引领着AI视频领域的创新发展。让我们将一起探讨Sora的技术特点、应用场景以及对未来创作方…

高级RAG:使用RAGAs + LlamaIndex进行RAG评估,包括原理、图和代码

原文地址&#xff1a;Using RAGAs LlamaIndex for RAG evaluation 2024 年 2 月 5 日 如果您已经为实际的业务系统开发了检索增强生成&#xff08;Retrieval Augmented Generation, RAG&#xff09;应用程序&#xff0c;那么您可能会关心它的有效性。换句话说&#xff0c;您…

【大数据】Flink 内存管理(三):TaskManager 内存分配(理论篇)

Flink 内存管理&#xff08;三&#xff09;&#xff1a;TaskManager 内存分配 1.配置 Total Memory2.配置 Heap and Managed Memory2.1 Task (Operator) Heap Memory2.2 Managed Memory 3.配置 Off-Heap Memory&#xff08;Direct or Native&#xff09;4.详细内存模型5.Framew…

现在学Oracle是49年入国军么?

今天周末&#xff0c;不聊技术&#xff0c;聊聊大家说的最多的一个话题 先说明一下&#xff0c;防止挨喷&#x1f606; 本人并不是职业dba&#xff0c;对数据库就是爱好&#xff0c;偶尔兼职&#xff0c;以下仅个人观点分析&#xff0c;如有不同观点请轻喷&#xff0c;哈哈&…

分享一个我爱工具网源码优化版

应用介绍 本文来自&#xff1a;分享一个我爱工具网源码优化版 - 源码1688 前几天在网上看到了一个不错的工具网源码&#xff0c;但是源码存在一些问题&#xff0c;遂进行了修改优化。 主要修改内容有&#xff1a; 1、后台改为账号密码登录&#xff0c;上传即用&#xff0c;不…

算法分析-面试1-字符串

文章目录 前言一、分类&#xff1a;看看就行了二、字符串API&#xff1a;创建和初始化&#xff1a;查询操作&#xff1a;比较操作&#xff1a;修改操作&#xff1a;截取操作&#xff1a;分割操作&#xff1a;格式化操作&#xff1a;连接操作&#xff08;Java 8 及以后&#xff…

pclpy KD-Tree半径最近邻搜索

pclpy 半径最近邻搜索 一、算法原理1.KD-Tree 介绍2.原理 二、代码三、结果1.原点云2.半径最近邻搜索的点云 四、相关数据 一、算法原理 1.KD-Tree 介绍 kd 树或 k 维树是计算机科学中使用的一种数据结构&#xff0c;用于在具有 k 维的空间中组织一定数量的点。它是一个二叉搜…

Windows下VTK 源码编译(For Qt PCL)

虽然我们在windows下安装PCL的时候就已经安装了VTK&#xff0c;由于跟着PCL安装的VTK是没有和QT联合编译的&#xff0c;所以在使用PCL和QT做点云可视化界面的时候是无法使用QT的插件QVTKWidget。 VTK 源码下载 Tags VTK / VTK GitLab 我这里的环境是Win10 Visual Studio&…

Qt 设置隐式加载dll路径

在c++中DLL的加载方式有两种,显式加载和隐式加载。 隐式加载 在程序从开始运行时,就会按照系统中一定的搜索路径,寻找动态库,找到就自动加载它,才能成功运行程序,这些步骤,是系统自动完成的。 显示加载 我们对动态库的调用,是在代码中直接使用LoadLibrary,或其他加载函…

ContainerHelpers之二分查找算法详解

目录 前言一、JAVA移位运算符1.1 >> 带符号右移位运算符1.2 >>> 无符号右移位运算符1.3 << 左移位运算符1.4 Java 中没有 <<<1.5 ~取反操作 二、ContainerHelpers二分查找算法总结 前言 安卓SparseArray中多次用到了ContainerHelpers的binarySe…

Android java中包的使用

一.包的使用 为了更好的实现项目中类的管理&#xff0c;提供包的概念。 package语句作为Java源文件的第一条语句&#xff0c;指明该文件中定义的类所在的包。(若缺省该语句&#xff0c;则指定为无名包)。 它的格式为&#xff1a;package 顶层包名.子包名 ; 二.java中主要的包…

Leetcode3039. 进行操作使字符串为空

Every day a Leetcode 题目来源&#xff1a;3039. 进行操作使字符串为空 解法1&#xff1a;哈希 排序 操作的定义&#xff1a;每次操作依次遍历 ‘a’ 到 ‘z’&#xff0c;如果当前字符出现在 s 中&#xff0c;那么删除出现位置最早的该字符&#xff08;如果存在的话&…