【Java】7 再识数组|数组的基本操作

这篇具有很好参考价值的文章主要介绍了【Java】7 再识数组|数组的基本操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流
目前,已开了以下专栏,欢迎关注与指导
1️⃣Java基础知识系统学习(持续更文中…)
2️⃣UML的应知应会(已更完)
3️⃣MySQL的应知应会(持续更文中…)
4️⃣算法与数据结构体系(持续更文中…)
5️⃣软考中级:软件设计师系列(持续更文中…)
还有更多文章在主页,欢迎访问爱书不爱输的程序猿

本文收录于Java基础知识系统学习专栏,次专栏是针对初学者打造,完成从0到1的跨越


1.遍历数组

  • 遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现。
  • 遍历一维数组已经讲过了
  • 此处介绍遍历二维数组的方法:使用双层for循环,通过数组的length属性可获得数组的长度
public class Trap{                                           //创建类
	public static void main(String[] args){                  //主方法            
		int b[][] = new int[][]{{1},{2,3},{4,5,6}};          //定义二维数组
		for(int k = 0;k < b.length; k++){
			for(int c = 0;c < b[k].length; c++)
			{                 //循环遍历二维数组的每个元素
				System.out.print(b[k][c]);                  //将数组中的元素输出
			}
			System.out.println();                           //输出空格
		}
	}
}
  • 使用for-each语句遍历数组
public class Tautog { // 创建类
	public static void main(String[] args) { // 主方法
		int arr2[][] = { { 4, 3 }, { 1, 2 } }; // 定义二维数组
		System.out.println("数组中的元素是:"); // 提示信息
		int i = 0; // 外层循环计数器变量
		for (int x[] : arr2) { // 外层循环变量为一维数组
			i++; // 外层计数器递增
			int j = 0; // 内层循环计数器
			for (int e : x) { // 循环遍历每一个数组元素
				j++; // 内层计数器递增
				if (i == arr2.length && j == x.length) { // 判断变量是二维数组中的最后一个元素
					System.out.print(e); // 输出二维数组的最后一个元素
				} else
					// 如果不是二维数组中的最后一个元素
					System.out.print(e + "、"); // 输出信息
			}
		}
	}
}

2.填充替换数组元素

数组中的元素定义完成后,可通过Arrays类的静态方法fill()来对数组中的元素进行替换。
该方法通过各种重载形式可完成对任意类型的数组元素的替换。

2.1 fill(int[] a,int value)

  • 该方法可将指定的int值分配给int型数组的每个元素
//语法:
fill(int[] a, int value);
//a:要进行元素替换的数组
//value:要存储数组中所有元素的值

2.2 fill(int[] a,int fromIndex,int toIndex,int value)

  • 该方法将指定的int值分配给int型数组指定范围中的每个元素
  • 填充的范围从索引fromIndex(包括)一直到索引toIndex(不包括) [fromIndex,toIndex)
    • 如果fromIndex == toIndex,则填充范围为空
//语法:
fill(int[] a, int fromIndex, int toIndex, int value);
//a:要进行填充的数组
//fromIndex:要使用指定值填充的第一个元素的索引(包括)
//toIndex:要使用指定值填充的最后一个元素的索引(不包括)
//value:要分配给数组指定范围中的每个元素的值
  • 如果指定的索引位置大于或等于要进行填充的数组的长度,则会报出ArrayIndexOutOf-BoundsException

3.对数组进行排序

  • 通过Arrays类的静态方法sort()可以实现对数组的排序
  • sort()方法提供了多种重载形式,可对任意类型的数组进行升序排序
//语法:
Arrays.sort(object);
//object是指进行排序的数组名称
  • 示例:
import java.util.Arrays; //导入java.util.Arrays类

public class Taxis { // 创建类
	public static void main(String[] args) { // 主方法
		int arr[] = new int[] { 23, 42, 12, 8 }; // 声明数组
		Arrays.sort(arr); // 将数组进行排序
		for (int i = 0; i < arr.length; i++) { // 循环遍历排序后的数组
			System.out.println(arr[i]); // 将排序后数组中的各个元素输出
		}
	}
}
  • 上述实例是对整型数组进行排序。
  • Java中的String类型数组的排序算法是根据字典编排顺序排序的,因此数字排在字母前面大写字母排在小写字母前面

4.复制数组

4.1copyOf()方法

//语法:
copyOf(arr, int newlength);
//arr:要进行复制的数组
//newlength:int型常量,指复制后的新数组的长度
  • 如果新数组的长度大于数组arr的长度,则用0填充
    • 根据复制数组的类型来决定填充的值,整型数组用0填充,char型数组则使用null来填充;
  • 如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一个元素开始截取至满足新数组长度为止。
  • 示例:
import java.util.Arrays; //导入java.util.Arrays类

public class Cope { // 创建类
	public static void main(String[] args) { // 主方法
		int arr[] = new int[] { 23, 42, 12 }; // 定义数组
		int newarr[] = Arrays.copyOf(arr, 5); // 复制数组arr
		for (int i = 0; i < newarr.length; i++) { // 循环变量复制后的新数组
			System.out.println(newarr[i]); // 将新数组输出
		}
	}
}

4.2copyOfRange()方法

//语法:
copyOfRange(arr, int formIndex, int toIndex);
//arr:要进行复制的数组对象
//formIndex:指定开始复制数组的索引位置。
//toIndex:要复制范围的最后索引位置

formIndex必须在0至整个数组的长度之间。新数组包括索引是formIndex的元素
toIndex可大于数组arr的长度。新数组不包括索引是toIndex的元素

5.查询数组

  • Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定数组,以获得指定对象
  • 该方法返回要搜索元素的索引值

5.1binarySearch(Object[] a, int fromIndex, int toIndex, Object key)

//语法:
binarySearch(Object[] a, int fromIndex, int toIndex, Object key);
//a:要搜索的数组
//fromIndex:要搜索的第一个元素的索引(包含fromIndex)
//toIndex:要搜索的最后一个元素的索引(不包含toIndex)
//key:要搜索的值

如果key包含在数组中,则返回搜索值的索引;否则返回-1或"-"(插入点)。插入点是搜索键将要插入数组的那一点,即第一个大于此键的元素索引

  • 进一步举例说明:
int arr[] = new int[]{4,25,10};   //创建并初始化数组
Arrays.sort(arr);				 //将数组排序
int index = Arrays.binarySearch(arr,0,1,8);
  • 代码中变量index的值是元素“8”在数组arr中索引在0~1内的索引位置。
  • 由于在指定的范围内并不存在元素“8”,index的值是"-"(插入点)。
  • 如果对数组进行排序,元素“8”应该在“25”的前面,因此插入点应是元素“25”的索引值2,所以index的值是-2。

调用binarySearch(Object[] a, Object key)之前必须对数组进行排序(通过sort()方法)。

  • 如果没有对数组进行排序,则结果是不确定的。
  • 如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。

5.2binarySearch(Object[],int fromIndex,inttoIndex,Object key)

  • 在指定的范围内检索某一元素
//语法:
binarySearch(Object[] a, int fromIndex, int toIndex, Object key);
//a:要进行检索的数组
//fromIndex:指定范围的开始处索引(包含)
//toIndex:指定范围的结束处索引(不包含)
//key:要搜索的元素
  • 使用该方法前,同样要对数组进行排序,这样才能获得准确的索引值。
  • 如果要搜索的元素key在指定的范围内,则返回搜索键的索引;否则返回-1或"-"(插入点)
  • 如果范围中的所有元素都小于指定的键,则插入点为toIndex
    • 这保证了当且仅当此键被找到时,返回的值将大于等于0

6.数组比较

  • 两个数组相等意味着其中的元素数量必须相同,并且每个相同位置的元素也必须相等可以用equals()方法来判断
  • 对于基本类型,是由其包装类中的equals()方法来比较的,
    • 例如:int元素实际是由Integer.equals()来负责比较

6.1Arrays类提供了 equals()方法来比较一维数组是否相等

int[] a1 = new int[] {1, 2, 3, 4};
int[] a2 = new int[] {1, 2, 3, 4};
System.out.println("a1 == a2: " + Arrays.equals(a1, a2));
a2[3] = 11;
System.out.println("a1 == a2: " + Arrays.equals(a1, a2));

6.2 Arrays类提供了 deepEquals()方法来比较多维数组

int myarr[][] = {{12,0},{45,10}};
int arr[][] = {{12,0},{45,10}};
System.out.println(Arrays.equals(myarr,arr));   //false		
System.out.println(Arrays.deepEquals(myarr,arr)); //true

6.3 equals()与deepEquals()

6.3.1对于完全相同的数组 , 为何使用Arrays.equals()比较两个二维数组的结果是false?而比较一维数组的结果就是true?
  • 首先,看二维数组使用Arrays.equals()方法时的源码
    public static boolean equals(int[] a, int[] a2) {
        if (a==a2)
            return true;   //1.如果名字相同,返回true
        if (a==null || a2==null)
            return false;  //2.如果其中一个为空,返回false
 
        int length = a.length;
        if (a2.length != length)
            return false;  //3.如果两个数组长度不同,返回false
 
       for (int i=0; i<length; i++) {
            Object o1 = a[i];
            Object o2 = a2[i];
            if (!(o1==null ? o2==null : o1.equals(o2)))
                return false;        //4.进行对比,不同,返回false
        }  
 
        return true;       //5.走到这一步就说明数组中每个元素都相等,返回true
    }
  • 很明显,在第4步的时候,因为在Java中,对象类型的变量(如Object)存储的是对象的引用(地址),而不是对象本身的值。
  • 因此,在这个语句中,变量o1得到的是数组a中第i个元素的引用,而不是该元素的值。所以结果就是false
  • 看一维数组使用Arrays.equals()方法时的源码
public static boolean equals(int[] a, int[] a2) {
        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;

        int length = a.length;
        if (a2.length != length)
            return false;

        for (int i=0; i<length; i++)
            if (a[i] != a2[i])
                return false;

        return true;
    }
  • 可以看到,在for循环中比较的是值
6.3.2deepEquals()和equals()的区别
  • deepEquals用于判定两个指定数组彼此是否深层相等
  • equals用于判定两个数组是否相等,如果两个数组以相同顺序包含相同元素,则返回true,否则返回false
  • 而且,由上述内容可知,如果要比较多维数组,则需要使用deepEquals()方法

7.参数与返回值

7.1 数组作为函数的参数

public static void printArray(int[] array) {
  for (int i = 0; i < array.length; i++) {
    System.out.print(array[i] + " ");
  }
}

7.2数组作为函数的返回值

public static int[] reverse(int[] list) {
  int[] result = new int[list.length];
 
  for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
    result[j] = list[i];
  }
  return result;
}

【Java】7 再识数组|数组的基本操作文章来源地址https://www.toymoban.com/news/detail-403636.html

到了这里,关于【Java】7 再识数组|数组的基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 欢迎来到新世界

    (1) 我去年对技术的发展是比较灰心的: 云原生:技术一直动荡,SOA-Servless、Docker-WASM、GitOps+CICD+DevOps 云计算:在中国从公有云走向了私有云,乃至金融云、国资云、政务云等等N种云 SaaS:去年全球SaaS新贵们纷纷下跌估值/市值30%-60%,中国SaaS产业和投资也都嘿嘿嘿 大数据

    2024年02月08日
    浏览(48)
  • Java操作mongodb的基本操作

    目录 MongoDB的基本操作 新增 方式一: 方式二: 删除:  带条件的删除 修改 修改条件 修改并添加  多条件修改: 查询 普通查询 条件查询 ​编辑 多条件查询 模糊查询: 查询除来的结果有两种的显示方式: MongoDB中的文档本质上是一种类似JSON的BSON格式的数据。 BSON是一种类

    2023年04月09日
    浏览(52)
  • java 操作es 的基本操作

    创建索引 创建索引别名 索引的相关设置 查询索引数据 bulk 导入数据 持续更新中~ pom的坐标

    2024年01月20日
    浏览(43)
  • Opencv 基本操作四 指针数组、vector与Mat之间的相互转换 | Mat切片成Vector<mat>并还原

    在深度学习模型部署中通常存在读取图像为mat,然后将mat转换为float指针传入模型的操作。为了快捷开发,因此对指针数组、vector与Mat之间的相互转换进行整理。实现了指针数组、vector之间的相互转换;vector与Mat之间的相互转换(含单通道图像和多通道图像)。vector转mat主要

    2024年02月08日
    浏览(48)
  • 单链表基本操作(java)

    节点类是链表类的内部类

    2024年02月16日
    浏览(38)
  • Java中列表的基本操作

    列表有下标,是一个可变容器,元素可以重复,Java中list包含arraylist和linklist,通常使用的是arraylist,查询速度更快,导入的包是java.util.ArrayList。 定义列表时,如果指定列表接受的数据类型为8大数据类型,需要使用对应数据类型的包装类;列表是一个可变容器,定义后默认元

    2024年02月01日
    浏览(38)
  • Java有关队列的基本操作

    队列是一种线性数据结构,队列中的元素只能先进先出; 队列的出口端叫做队头,入口端叫做队尾。 1.入队: 2.出队: 3.判断队满的情况: 点击查看代码

    2024年02月09日
    浏览(38)
  • 【零基础学习C++】欢迎来到C++的世界

    个人主页:【😊个人主页】 系列专栏:【❤️系列专栏】 C++是一种计算机高级程序设计语言, 由C语言扩展升级而产生 , 最早于1979年由本贾尼·斯特劳斯特卢普在ATT贝尔工作室研发。 C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程

    2024年02月08日
    浏览(46)
  • Java 操作RestHighLevelClient基本使用

    在使用 RestHighLevelClient的过程中发现,它已经标记为过时了。 在 Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端 RestHighLevelClient标记为弃用状态。 同时推出了全新的 Java API客户端 Elasticsearch Java API Client,该客户端也将在 Elasticsearch8.0及以后版本中成为官方推荐使用的

    2024年02月11日
    浏览(43)
  • ElasticSearch Java API 基本操作

    ElasticSearch Java API是ES官方在8.x版本推出的新java api,也可以适用于7.17.x版本的es。 本文主要参考了相关博文,自己手动编写了下相关操作代码,包括更新mappings等操作的java代码。 代码示例已上传github。 elasticsearch 版本: 7.17.9 ,修改 /elasticsearch-7.17.9/config/elasticsearch.yml ,新增

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包