JAVA小知识18:常用数组操作API之Arrays

news2024/10/5 18:58:39

        在JAVA小知识17中我们详细的讲述了关于数组的定义以及使用方法,今天来讲一个关于操作数组的工具类。java.util.Arrays是一个专门用于操作数组的工具类,它封装了非常多的方法方便我们操作数组。

一、常用方法

方法说明
public static String toString(数组)把数组拼接成一个字符串
public static int[] copyOf(原数组,新数组长度)拷贝数组
public static int[] copyOfRange(原数组,起始索引,结束索引)拷贝数组(指定范围)
public static int binarySearch(数组,查找的元素)二分查找法查找元素
public static void fill(数组,元素)填充数组                                                                                                   
public static void sort(数组)按照默认方式进行数组排序
public static void sort(数组,排序规则)按照指定的规则排序
Arrays.asList(数组)数组转List
setAll()对数组填充

二、详细解释 

 1、toString:把数组拼接成一个字符串

public static void main(String[] args) {
    String[] arr = {"a", "b", "c", "d", "e"};
    String s1 = Arrays.toString(arr);
    System.out.println(s1);//[a, b, c, d, e]
}

很好理解,就是将数组元素转化为了外面有方括号的字符串元素 ,我们可以看一下toString的源码:

2、 copyOf(原数组,新数组长度):拷贝数组

public static void main(String[] args) {
    String[] arr = {"a", "b", "c", "d", "e"};
    String[] s1 = Arrays.copyOf(arr, 2);
    String[] s2 = Arrays.copyOf(arr, 6);
    System.out.println(Arrays.toString(s1));// [a, b]
    System.out.println(Arrays.toString(s2));// [a, b, c, d, e, null]
}

如果新数组的长度是小于老数组的长度,会部分拷贝

如果新数组的长度是等于老数组的长度,会完全拷贝

如果新数组的长度是大于老数组的长度,会补上默认初始值(每个类型初始值不一样)

3、copyOfRange(原数组,起始索引,结束索引):拷贝指定长度数组

public static void main(String[] args) {
    String[] arr = {"a", "b", "c", "d", "e"};
    String[] s1 = Arrays.copyOfRange(arr,0,2);
    String[] s2 = Arrays.copyOfRange(arr, 0,6);
    System.out.println(Arrays.toString(s1));// [a, b]
    System.out.println(Arrays.toString(s2));// [a, b, c, d, e, null]
}

其索引下标从0开始,遵循左闭右开原则,也就是包括第一个索引元素但是不包括最后一个索引元素((0,2)就是索引0与索引1,不包括索引2 ),同样超出数组元素的话会填充初始值。

4、binarySearch(数组,查找的元素):二分查找法查找元素

public static void main(String[] args) {
    int[] arr ={1,2,4,5,6,7};
    int i = Arrays.binarySearch(arr, 0);
    int i2 = Arrays.binarySearch(arr, 4);
    System.out.println(i);//-1
    System.out.println(i2);//2
}

二分查找的前提:数组中的元素必须是有序,数组中的元素必须是升序的
如果要查找的元素是存在的,那么返回的是真实的索引

但是,如果要查找的元素是不存在的,返回的是  负的插入点-,1 如图:

例如查找元素5,数组中没有5,由于是升序排序,数组会将指针移动到最后,此时插入点就是5,如果要查找3,在元素2之后就应该是元素3,此时元素2之后是元素4,那么插入点就应该是元素4的索引3,所以此时插入点是3。

至于为什么要减一,如果查找元素是0,那么第一个元素就应该是0,如果没有插入点也是0此时如果不减一,那就是-0,-0也是0,就会造成误解,所以要-1。

5、fill(数组,元素:填充数组

public static void main(String[] args) {
    int[] arr ={1,2,4,5,6,7};
    Arrays.fill(arr,0);
    System.out.println(Arrays.toString(arr));//[0, 0, 0, 0, 0, 0]
}

填充全部元素,会将原数组覆盖。

6、sort(数组):排序

public static void main(String[] args) {
    int[] arr ={2,1,5,7,3,10,5,4};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5, 5, 7, 10]
}

基本数据类型进行升序排列。底层使用的是快速排序。

7、 sort(数组,排序规则):按照指定规则排序

参数一:要排序的数组
参数二:排序的规则
细节:
        只能给引用数据类型的数组进行排序

        如果数组是基本数据类型的,需要变成其对于的包装类

第二个参数是一个接口,所以我们在调用方法的时候,需要传递这个接口的实现类对象,作为排序的规则。但是这个实现类,我只要使用一次,所以就没有必要单独的去写一个类,直接采取匿名内部类的方式就可以了

底层原理:

  1. 利用插入排序 + 二分查找的方式进行排序的。
  2. 默认把 0 索引的数据当做是有序的序列,1索引到最后认为是无序的序列。
  3. 遍历无序的序列得到里面的每一个元素,假设当前遍历得到的元素是A元素
  4. 把A往有序序列中进行插入,在插入的时候,是利用二分查找确定A元素的插入点
  5. 拿着A元素,跟插入点的元素进行比较,比较的规则就是compare方法的方法体
  6. 如果方法的返回值是负数,拿着A继续跟前面的数据进行比较
  7. 如果方法的返回值是正数,拿着A继续跟后面的数据进行比较
  8. 如果方法的返回值是 0 ,也拿着A跟后面的数据进行比较
  9. 直到能确定A的最终位置为止。
  10. 返回值:
    负数:表示当前要插入的元素是小的,放在前面

    正数:表示当前要插入的元素是大的,放在后面

    0:表示当前要插入的元素跟现在的元素比是一样的们也会放在后面

Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return 0;
    }
});

所以 如果想实现降序,只需要o2-o1即可

public static void main(String[] args) {
    Integer[] arr ={2,1,5,7,3,10,5,4};
    // 正常写法
    Arrays.sort(arr, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2-o1;
        }
    });
    // lambda表达式
    Arrays.sort(arr, (Integer o1, Integer o2)-> o2-o1);
    System.out.println(Arrays.toString(arr));//[10, 7, 5, 5, 4, 3, 2, 1]
}

8、 Arrays.asList(数组):数组转List

尽管数组非常强大,但它自身可以操作的工具方法很少,如果能转成 List 的话,就简便多了。

public static void main(String[] args) {
    int[] arr ={2,1,5,7,3,10,5,4};
    List<int[]> ints = Arrays.asList(arr);
}

不过需要注意的是Arrays.asList() 返回的是 java.util.Arrays.ArrayList,它的长度是固定的,无法进行元素的删除或者添加。如果使用add/remove等会抛出异常

此时可以多进行转换一步,但是注意需要数组类型为包装类。

public static void main(String[] args) {
    Integer[] arr ={2,1,5,7,3,10,5,4};
    List<Integer> arrlist = new ArrayList<Integer>(Arrays.asList(arr));
    arrlist.stream().forEach(e-> System.out.println(e));
}

9、setAll():填充数组 

operand 意味着数组的索引,长度为十的话就是从0开始到9结束返回每个加一就是 填充数组索引+1。

public static void main(String[] args) {
    int[] arr = new int[10];
    Arrays.setAll(arr, new IntUnaryOperator() {
        @Override
        //operand 意味着数组的索引,长度为十的话就是从0开始到9结束
        // 返回每个加一就是 填充数组索引+1
        public int applyAsInt(int operand) {
            return operand+1;
        }
    });
    System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}

 下面来看:

public static void main(String[] args) {
    int[] arr ={1,2,3,4,5,6,7};
    Arrays.setAll(arr,e->e*2);
    System.out.println(Arrays.toString(arr));//[0, 2, 4, 6, 8, 10, 12]
}

可以看到啊,不会以原来数组的元素作为基准,只会以索引来填充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1818593.html

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

相关文章

“全光无线星空”照亮津亚电子智能制造之路

随着第四次工业革命浪潮的到来,智能制造正成为制造业的新常态。工业4.0时代的工厂不再是封闭的制造孤岛,而是通过高度的数字化和网络化,实现生产过程的智能化、自动化和灵活化。在这样的大趋势下,制造业正经历着从传统制造向智能制造的深刻转型,数字化车间和智能化生产线成为推…

在Dataworks调度里检查上游表的分区是否已经产出

在Dataworks调度里检查上游表的分区是否已经产出 新建PyOdps3节点&#xff0c;贴如如下代码&#xff1a; import sys import time from datetime import datetimebizdate args[bizdate] if not o.exist_table(args[table]):sys.exit(1)# 设置结束时间为今天的20:00 end_time …

Linux-笔记 全志平台OTG虚拟 串口、网口、U盘笔记

前言&#xff1a; 此文章方法适用于全志通用平台&#xff0c;并且三种虚拟功能同一时间只能使用一个&#xff0c;原因是此3种功能都是内核USB Gadget precomposed configurations的其中一个选项&#xff0c;只能单选&#xff0c;不能多选&#xff0c;而且不能通过修改配置文件去…

入门 Axure RP 9 | 原型设计基础教程

选择正确的原型设计工具并非易事&#xff0c;Axure RP 9能够快速完成原型设计。原型设计是一种经过时间考验的方法&#xff0c;可以将你的设计快速放置在用户的设备并交到他们手中。替代Axure RP 9的原型设计工具即时设计是一个完全集成的协同设计工具&#xff0c;无需使用不同…

【算法与数据结构】【数组篇】【题11-题15】

系列文章 本人系列文章-CSDN博客https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5502 1.数组基本知识点 1.1概念 数组就是一个集合。数组会用一些名为索引的数字来标识每项数据在数组中的位置&#xff0c;且在大多数编程语言中&…

齐普夫定律在循环神经网络中的语言模型的应用

目录 齐普夫定律解释公式解释图与公式的关系代码与图的分析结论 使用对数表达方式的原因1. 线性化非线性关系2. 方便数据可视化和分析3. 降低数值范围4. 方便参数估计公式详细解释结论 来自&#xff1a;https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/language-model…

企业网站安装OV SSL证书的必要性

一、什么是OV SSL证书 SSL OV证书&#xff0c;即组织验证型SSL证书&#xff0c;它要求证书颁发机构对申请证书的组织进行身份验证&#xff0c;确认组织的真实性后&#xff0c;才会发放证书。这种验证方式提高了安全性&#xff0c;因为它确保了证书背后的实体是真实存在的组织&…

SpringBoot实现图片文件上传和回显的两种方式

目录 一 功能需求 二 上传本地 2.1 实现文件上传的controller层 2.2 图片访问资源映射 二 上传OSS 一 功能需求 实现图片的上传和回显功能其实在业务中是非常常见的,比如需要上传头像,或者交易平台需要上传物品的图片等等,都需要上传和回显,所以我接下来给大家介绍两种…

VsCode中C文件调用其他C文件函数失败

之前一直使用CodeBlocks&#xff0c;最近使用vscode多&#xff0c;感觉它比较方便&#xff0c;但在调用其他C文件的时候发现报错以下内容基于单C文件运行成功&#xff0c;否则请移步 博文&#xff1a;VSCode上搭建C/C开发环境 报错信息 没有使用CodeRunner插件&#xff0c;弹…

ubuntu第三方库离线安装包(.deb离线安装方法;apt离线安装;离线安装deb)(docker离线安装、安装docker安装)

文章目录 方法1&#xff1a;Ubuntu Packages 网站下载离线包&#xff08;失败了&#xff0c;找不到包的可下载源&#xff0c;有的包有&#xff0c;有的包没有&#xff0c;不知道怎么回事&#xff09;操作步骤1. 在有网络的环境中&#xff0c;打开浏览器并访问 Ubuntu Packages …

读取CSV文件生成RDD去掉标题行

文章目录 1. 创建CSV文件2. 上传CSV文件3. 读取CSV文件生成RDD4. 去掉标题行生成新RDD5. 查看新生成的RDD 1. 创建CSV文件 执行命令&#xff1a;vim scores.csv 在WPS里查看CSV文件 2. 上传CSV文件 执行命令&#xff1a;hdfs dfs -put scores.csv /park 3. 读取CSV文件生…

Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported

Content type application/x-www-form-urlencoded;charsetUTF-8 not supported 问题背景新增页面代码改造 问题背景 这里有一个需求&#xff0c;前端页面需要往后端传参&#xff0c;参数包括主表数据字段以及子表数据字段&#xff0c;由于主表与子表为一对多关系&#xff0c;在…

计算机毕业设计Python+Django农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop Hive

课题研究的意义&#xff0c;国内外研究现状、水平和发展趋势 研究意义21世纪是一个信息爆炸的时代&#xff0c;人们在日常生活中可接触到的信息量非常之巨大。推荐系统逐步发展&#xff0c;其中又以个性化推荐系统最为瞩目。个性化推荐系统的核心在于个性化推荐算法&#xff0c…

【python】 pandas.DataFrame.to_json 函数

【python】 pandas.DataFrame.to_json 函数 写在最前面一、什么是 JSON&#xff1f;【性能对比】python读取json和直接从orcle数据库读&#xff0c;哪个更快&#xff1f;性能对比适用场景综合考虑 二、to_json 函数概述参数详解1. path_or_buf2. orient4. double_precision5. f…

SaaS产品运营 | 千万不能踏入的PLG模式的六大误区

随着科技的迅速发展和市场竞争的日益激烈&#xff0c;越来越多的公司开始尝试采用PLG&#xff08;Product Led Growth&#xff0c;即产品驱动增长&#xff09;模式来推动其业务的发展。然而&#xff0c;尽管PLG模式在促进增长方面具有显著优势&#xff0c;但在实践中也容易出现…

python学习 -You-Get视频下载使用案例

You-Get 是一个命令行程序&#xff0c;提供便利的方式来下载网络上的媒体信息。 You-Get 是一个用于从网页下载媒体内容&#xff08;如视频、音频、图片&#xff09;的Python库。它支持多种网站&#xff0c;能够捕获并下载这些网站中直接或间接提供的媒体资源。You-Get 的设计…

BarTender软件下载附加详细安装教程

BarTender是美国海鸥科技推出的一款优秀的条码打印软件&#xff0c;应用于 WINDOWS95 、 98 、 NT 、 XP 、 2000 、 2003 和 3.1 版本&#xff0c; 产品支持广泛的条形码码制和条形码打印机&#xff0c; 不但支持条形码打印机而且支持激光打印机&#xff0c;还为世界知名品牌条…

比特币对接文档

比特币对接 地址分类 p2sk()p2skh(主网地址是以"1"开头,例如:16dN3XhaTejyZFy4hWompK2x8de2T46wA8; 测试网是以"m"或"n"开头, 例如:mvZjn2485hwxjVPJoLAZVyJKUDn8aGpBy5)p2sh (主网地址是以"3"开头,例如:33ZzFZZJcvtnLBWRdne6F9SpD9…

数据结构笔记1-19(补充之前没有提及的细节)

目录 算法的五大特征 时间复杂度 next数组 nextval数组 树结点的计算 满二叉树和完全二叉树 线索二叉树 树的存储结构 森林、树之间的转换 哈夫曼树的构造 这几个红框&#xff0c;因为之前在别的视频有学过了&#xff0c;故不再看了。如果到时候还有什么需要查缺补…

[项目推荐]EmoLLM-心理健康大模型

EmoLLM 是一系列能够支持理解用户-支持用户-帮助用户心理健康辅导链路的开源心理健康大模型&#xff0c;由LLM指令微调而来。它旨在全面理解和促进个体、群体乃至整个社会的心理健康状态。 项目介绍 GitHub&#xff1a;https://github.com/SmartFlowAI/EmoLLM 【EmoLLM项目提供…