导图社区 Java数组
Java数组相关知识与实例。数组中的每个元素具有相同的数据类型。在Java中将数组同样看作是一个对象,虽然基本数据类型不是对象。但是由基本数据类型组成的数组则是对象。在程序设计中引入数组可更有效地管理和处理数据。可根据数组的维数将数组分为:一维数组、二维数组……
编辑于2022-09-26 23:57:51 贵州微信小程序开发知识整理,系统地介绍了微信小程序开发的基础知识,帮助开发者更好地理解和掌握小程序开发的要点和流程。
SpringFramework技术的介绍,SpringFramework,通常简称为Spring,是一个开源的企业级Java应用程序框架,由Rod Johnson创建,并于2004年首次发布。Spring Framework的主要目标是简化企业级Java开发,提高开发效率和应用程序的可维护性。
Maven的特性以及使用部署方法,Maven介绍:Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
社区模板帮助中心,点此进入>>
微信小程序开发知识整理,系统地介绍了微信小程序开发的基础知识,帮助开发者更好地理解和掌握小程序开发的要点和流程。
SpringFramework技术的介绍,SpringFramework,通常简称为Spring,是一个开源的企业级Java应用程序框架,由Rod Johnson创建,并于2004年首次发布。Spring Framework的主要目标是简化企业级Java开发,提高开发效率和应用程序的可维护性。
Maven的特性以及使用部署方法,Maven介绍:Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
Java数组
一、 数组概述
1. 数组是具有相同数据类型的一组数据的集合。比如,球类的集合——足球、篮球、羽毛球等;电器集合——电视机、洗衣机、电风扇等。在程序设计中,可以将这些集合称为数组。数组中的每个元素具有相同的数据类型。在Java中将数组同样看作是一个对象,虽然基本数据类型不是对象。但是由基本数据类型组成的数组则是对象。在程序设计中引入数组可更有效地管理和处理数据。可根据数组的维数将数组分为:一维数组、二维数组……
2. 数组实质是一种数据结构类型,它可以将同一种类型的数据放入到一个数组之中,并看做一个对象处理。在一个数组之中的每一个对象都有一个索引值,在实际操作之中,通过其索引值index对数据进行添加与整理。例如定义一个字符串数组,其结构如图1所示,在这一数组对象中包含三个字符串元素,分别为“足球”、“篮球”、“羽毛球”。
二、 一维数组的创建及应用
1. 创建一维数组:数组作为对象允许使用new关键字进行分配内存。在使用数组之前,必须首先定义数组变量所属的类型。一维数组的创建有两种形式
1||| 数组元素类型 数组名字[ ];
2||| 数组元素类型[ ] 数组名字;
数组元素类型决定了数组的数据类型。它可以是Java中任意的数据类型,包括简单类型和组合类型。数组名字为一个合法的标识符,符号“[ ]”指明该变量是一个数组类型变量。单个“[ ]”表示要创建的数组是一个一维数组,例如: int arr[]; //声明int型数组,数组中的每个元素都是int型数值 String str[]; //声明String数组,数组中的每个元素都是String型数值
声明数组后,还不能访问它的任何元素,因为声明数组仅仅是给出了数组名字和元素的数据类型,要想真正使用数组还要为它分配内存空间。在为数组分配内存空间时必须指明数组的长度。为数组分配内存空间的格式如下:数组名字 = new 数组元素类型[数组元素的个数];
1||| 数组名字:是被连接到数组变量名称
2||| 数组元素个数:指定数组中变量的个数,即数组的长度
使用new关键字来分配数组时,必须指定数组元素的类型和数组元素的个数,即数组的长度,例如:arr = new int[5]; 说明:使用new关键字为数组分配内存时,整型数组中的各个元素的初始化值都为0 int month[ ] = new int[12];这种创建数组的方式是将数组的声明和内存的分配和在一起执行,语法:数组元素类型 数组名 = new 数组元素类型[数组元素的个数];
2. 初始化一维数组:数组可以与基本数据类型一样进行初始化操作。数组的初始化可分别初始化数组中每个元素。数组的初始化有两种形式
1||| int arr[] = new int[]{1,2,3,5,25};
2||| int arr2[] = {34,23,12,6};
可以看出,数组的初始化就是包括在花括号之内用逗号分开的表达式列表。逗号分开了数组元素的值。用逗号(,)分割数组中的各个元素,系统自动为数组分配一定的空间。用第一种初始化方式,将创建5个元素的数组依次为1、2、3、5、25。第二种初始化方式,会创建4个元素的数组,依次为34、23、12、6
数组的初始化也可以先为一个数组分配空间,再对数组的每一个元素进行赋值来完成数组中数据的初始化
实例: package practice; //数组初始化 import java.util.*; public class Array_01 { public static void main(String[] args) { Scanner s=new Scanner(System.in); int array[]=new int[3]; //创建一个包含3个元素的整形数组 System.out.println("请输入数组初始化的数据:"); for(int i=0;i<3;i++) { array[i]=s.nextInt(); //获取初始数据 } for(int x:array) { System.out.println(x); //利用foreach语句输出数组元素 } } }
输出结果:
3. 使用一维数组:使用一维数组将1~12月各月的天数输出
package practice; //利用一维数组输出每个月的天数 import java.util.*; public class Array_02 { public static void main(String[] args) { int day1[] = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //创建并初始化一维数组 int day[] = new int[] { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //创建并初始化一维数组 Scanner s=new Scanner(System.in); System.out.println("请输入年份:"); int year=s.nextInt(); //接收年份数据 if(year%4==0&&year%100!=0||year%400==0) { //判断输入的年份是否为闰年 for(int i=0;i<day.length;i++) { System.out.println((i+1)+"月有"+day[i]+"天"); } }else { for(int j=0;j<day1.length;j++) { System.out.println((j+1)+"月有"+day1[j]+"天"); } } } }
输出结果: 请输入年份: 2022 1月有31天 2月有28天 3月有31天 4月有30天 5月有31天 6月有30天 7月有31天 8月有31天 9月有30天 10月有31天 11月有30天 12月有31天
三、 二维数组的创建及应用
1. 二维数组的创建:二维数组可以看作是特殊的一维数组,因此二维数组的创建同样有两种方式
1||| 数组元素类型 数组名字[ ][ ];
2||| 数组元素类型[ ][ ] 数组名字;
实例代码如下: int myarr[][];
二维数组可以表示一个平面表格的数据,第一维数组的下表可以看作表格的行,第二维数组下表可以看作表的列。如图1所示
图1
同一维数组一样,二维数组在声明时也没有分配内存空间,同样要使用关键字new来分配内存,然后才可以访问每个元素。对于高维数组有两种为数组分配内存的方式
(1) 为每一维数组分配内存,实例代码如下: a = new int[2][4];
上述代码创建了二维数组a,二维数组a中包括两个长度为4的一维数组,内存分配如图2所示
(2) 分别为每一维分配内存,实例代码如下: a = new int[2][]; a[0] = new int[2]; a[1] = new int[3];
第二种方式同第一种实现的功能相同。使用这种方式为二维数组分配内存时,首先指定最左边维数的内存,然后单独地给余下的维数分配内存。通过第二种方式为二维数组分配内存,内存分配如图3所示。
2. 二维数组初始化:二维数组的初始化同一维数组初始化类似,同样可以使用“{}”大括号完成二维数组的初始化,不同的是每个以为数组的元素使用大括号定义新的一维数组,即一维数组的每个元素又是一个新的一维数组
语法如下: type arrayname[][] = { {value1,value2…valuen}, {value1,value2…valuen} … };
1||| type:数组数据类型
2||| arrayname:数组名称,一个合法的标识符
3||| value:数组中各元素的值
初始化二维数组,实例代码如下: int myarr[][] = {{12,0},{45,10}};
初始化二维数组后,要明确数组的下标都是从0开始。如上面的代码中myarr[1][1]的值为10。int型二维数组是以int a [][]来定义的,所以可以直接给a[x][y]赋值。例如给a[1]的第2个元素赋值, a[1][1] = 20
实例: package practice; import java.util.*; public class dArrary { public static void main(String[] args) { int [][]dary=new int [5][6]; //创建一个包含三十个元素的数组 int add=1; //利用两层循环对二维数组赋值 for(int i=0;i<5;i++) for(int j=0;j<6;j++) { dary[i][j]=add++; System.out.println(dary[i][j]); } } }
输出结果:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
3. 使用二维数组
二维数组在实际应用中非常广泛。下面的实例就是使用二维数组输出一个3行5列并且所有元素都是0的矩阵
实例: package practice; public class Test_ay01 { public static void main(String[] args) { int arrary[][]=new int[3][5]; //声明二维数组 for(int i=0;i<3;i++) { for(int j=0;j<5;j++) { System.out.print(arrary[i][j]+" "); //遍历数组 } System.out.println(); //换行 } } }
运行结果: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
说明:对于整型二维数组,创建成功之后系统会给数组中每个元素的初始化值0
四、 数组的基本操作
1. 遍历数组:遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现。遍历一维数组很简单,也很好理解,下面详细介绍遍历二维数组的方法。遍历二维数组需使用双层for循环,通过数组的length属性可获得数组的长度
实例: package practice; //两层for循环遍历而为数组 public class Trap { public static void main(String[] args) { int Ary[][]=new int[][] {{1},{2,3},{3,4,5}}; //定义二维数组 for(int i=0;i<Ary.length;i++) { for(int j=0;j<Ary[i].length;j++) { System.out.print(Ary[i][j]); //遍历数组中的每个元素 } System.out.println();//换行 } } }
输出结果: 1 23 345
实例: package practice; //利用foreach遍历二维数组 public class Trap_01 { public static void main(String[] args) { int Ary[][]=new int[][] {{1},{2,3},{3,4,5}};//定义二维数组 for(int x[]:Ary) { //外层循环变量为一维数组 for(int z:x) { //循环遍历每一个数组元素 System.out.print(z); } System.out.println(); }} }
输出结果: 1 23 345
2. 填充替换数组元素:数组中的元素定义完成后,可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法通过各种重载形式可完成任意类型的数组元素的替换。fill()方法有两种参数类型。下面以int型数组为例介绍fill()方法的使用方法
(1) 语法:fill(int[] a , int value)
1||| a:要进行元素替换的数组
2||| value:要存储数组中所有元素的值
该方法可将指定int值分配给int型数组的每个元素
实例: package practice; import java.util.Arrays; //导入ava.util.Arrays类 public class Swap_01 { public static void main(String[] args) { int ary[]=new int[5]; //定义一维数组 Arrays.fill(ary,8); //调用fill方法 for(int x:ary) { System.out.print(x+" ");//使用foreach遍历数组 } } }
输出结果:8 8 8 8 8
(2) 语法:fill(int[] a , int fromIndex , int toIndex , int value)
1||| a:要进行填充的数组
2||| fromIndex:要使用指定值填充的第一个元素的索引
3||| toIndex:要使用指定值填充的最后一个元素的索引
4||| val:要存储在数组所有元素中的值
该方法将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromIndex(包括)一直到索引toIndex(不包括)。(如果fromIndex = = toIndex,则填充范围为空。)
实例: package practice; import java.util.Arrays;//导入Arrays类 public class Swap_02 { public static void main(String[] args) { int ary[]=new int[]{1,5,3,8}; //定义一维数组 Arrays.fill(ary,0,1,8); //使用fill方法 for(int x:ary) { System.out.print(x+" "); //输出数组元素 }} }
输出结果:8 5 3 8
3. 对数组进行排序:通过Arrays类的静态sort()方法可实现对数组排序,sort()方法提供了许多种重载形式,可对任意类型数组进行升序排序
语法:Arrays.sort(object)
object:进行排序的数组名称
实例: package practice; import java.util.*; //导入util任意类 public class sort_01 { public static void main(String[] args) { int ary[]=new int[] {2,9,5,7}; //定义一维数组 Arrays.sort(ary); //调用sort方法对数组进行排序(从小到大) for(int x:ary) { System.out.print(x+" "); } } }
输出结果:2 5 7 9
提示:该实例是对整型数组进行排序。Java中的String类型数组的排序算法是根据字典编排顺序排序的,因此数字排在字母前面,大写字母排在小写字母前面
4. 复制数组:Arrarys类的copyOf()方法与copyOfRange()方法可实现对数组的复制。copyOf()方法是复制数组至指定长度,copyOfRange()方法则将指定数组的指定长度复制到一个新数组中
(1) 语法:copyOf(arr,int newlength)
1||| arr:要进行复制的数组
2||| newlength:int型常量。指复制后的新数组的长度。如果新数组的长度大于数组arr的长度,则用0填充(根据复制数组的类型来决定填充的值,整型数组则用0填充,char型数组则会使用null来填充);如果复制后的数组长度小于数组arr的长度,则会从数组arr的第一个元素开始截取至满足新数组长度为止
实例: package practice; import java.util.*; public class Copy_01 { public static void main(String[] args) { int ary[]=new int[] {1,5,3,8}; //定义一维数组 int bry[]=Arrays.copyOf(ary,6); //调用复制 for(int x:bry) { System.out.print(x+" "); } } }
输出结果:1 5 3 8 0 0
(2) 语法:copyOfRange(arr,int formIndex,int toIndex)
1||| arr:要进行复制的数组
2||| formIndex:指定开始复制数组的索引位置。formIndex必须在0和整个数组的长度之间。新数组包括索引是formIndex的元素
3||| toIndex:要复制范围的最后索引位置。可以大于数组arr的长度。新数组不包括索引是toIndex的元素
实例: package practice; import java.util.*; public class Copy_02 { public static void main(String[] args) { int ary[]=new int[] {1,5,3,8}; //定义一维数组 int bry[]=Arrays.copyOfRange(ary,0,3); //调用copyOfRange方法 for(int x:bry) { System.out.print(x+" "); } } }
输出结果:1 5 3
5. 数组查询:Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定数组,以获得指定对象。该方法返回要搜索元素的索引值。binarySearch()方法提供了多种重载形式,来满足各种类型数组的查找需要。binarySearch()方法有两种参数类型
(1) 语法:binarySearch(Object[] a.Object key)
1||| a:要搜索的数组
2||| key:要搜索的值
如果key包含在数组中,则返回搜索值的索引;否则返回-1或-(插入点)。插入点是搜索键将要插入数组的那一点。即第一个大于此键的元素索引
例:int arr[] = new int[] { 4, 25, 10 }; //创建并初始化数组 Arrays.sort(arr); //将数组进行排序 int index = Arrays.binarySearch(arr, 0, 1, 8);
注意:必须在进行此调用之前对数组进行排序(通过sort()方法)。如果没有对数组进行排序,则结果是不确定的。如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个
上面的代码中变量index的值是元素“8”在数组arr中索引在0~1范围中的索引位置。由于在指定的范围之内,并不存在元素“8”。Index的值是-(插入点)。如果对数组进行排序元素“8”应该在“25”的前面。因此插入点应是元素“25”的索引值2。所以index的值是-2,如果数组中的所有元素都小于指定的键,则为a.length。注意,这保证了当且仅当此键被找到时,返回的值将>= 0
实例: package practice; import java.util.*; public class Search_01 { public static void main(String[] args) { int ai[]=new int[] {1,5,3,8,7,5,9,2}; //定义一维数组 Arrays.sort(ai); //排序 int index=Arrays.binarySearch(ai,9); //查找排序后9的位置 for(int x:ai) { System.out.print(x+" "); //输出数组元素 } System.out.println("\n"+"9的位置是:"+index); } }
输出结果: 1 2 3 5 5 7 8 9 9的位置是:7
(2) 语法:binarySearch(Object[] a,int fromIndex , int toIndex,Object key)
1||| a:要搜索的数组
2||| fromIndex:指定范围的开始处索引。(包含)
3||| toIndex:指定范围的结束处索引。(不包含
4||| key:要搜索的元素
在使用该方法之前同样要对数组进行排序,来获得准确的索引值。如果要搜索的元素key在指定的范围之内,则返回搜索键的索引;否则返回-1或-(插入点)。插入点被定义为将键插入数组的那一点:即范围中第一个大于此键的元素索引,如果范围中的所有元素都小于指定的键,则为toIndex。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0
注意:如果指定的范围大于或等于数组的长度,则会报出ArrayIndexOutOfBoundsException异常
实例: package practice; import java.util.*; public class Search_02 { public static void main(String[] args) { int[] ary=new int[] {1,5,3,8,7,5,9,2}; //定义一维数组 Arrays.sort(ary);//数组排序 int index=Arrays.binarySearch(ary,0,7,9); //查找数组0-7范围内9的位置 System.out.println("9的位置在:"+index); } }
输出结果:9的位置在:-8
由于9不在所定范围内,所以返回的值为范围中第一个大于此键的元素索引的负值所以输出的索引是-8