Java数组简介
数组具有以下特点:
- 数组可以是一维数组、二维数组或多维数组。
- 数值数组元素的默认值为 0,而引用元素的默认值为 null。
- 数组的索引从 0 开始,如果数组有 n 个元素,那么数组的索引是从 0 到(n-1)。
- 数组元素可以是任何类型,包括数组类型。
- 数组类型是从抽象基类 Array 派生的引用类型。
Java和C/C++中数组的工作原理不同,Java中数组本身时引用数据类型,它的长度属性是length。
对Java数组的总结
一维数组
1.两种声明类型:
type[] arrayName; // 数据类型[] 数组名;
或者
type arrayName[]; // 数据类型 数组名[];
2.分配空间
arrayName = new type[size]; // 数组名 = new 数组类型[数组长度];
3.三种初始化方法
Java有三种初始化数组的方式
- 使用new指定数组大小后进行初始化
- 使用new指定数组元素的值
- 直接指定数组元素的值
1 | // 使用new指定数组大小后进行初始化 |
4.使用
- 获取单个元素
- 获取全部元素
1 | int[] number = {1,2,3,5,8}; |
二维数组
二维数组被看作数组的数组
1.两种声明方式
type[][] arrayName; // 数据类型[][] 数组名;
或者
type arrayName[][]; // 数据类型 数组名[][];
2.三种初始化方式
type[][] arrayName = new type[][]{值1,值2,值3,...,值n}; // 在定义时初始化
type[][] arrayName = new type[size1][size2]; // 给定空间,再赋值
type[][] arrayName = new type[size][]; // 数组第二维长度为空,可变化
1 | // 定义时初始化 |
3.使用
- 获取单个元素:
arrayName[i-1][j-1];
arrayName 表示数组名称,i 表示数组的行数,j 表示数组的列数。 - 获取全部元素:使用嵌套 for 循环或 for each 循环语句。
- 获取整行元素:需要将行数固定,然后只遍历该行中的全部列即可。
- 获取整列元素:获取指定列的元素与获取指定行的元素相似,保持列不变,遍历每一行的该列即可。
数组操作
1.比较数组
比较数组元素的个数和对应位置的元素是否相等。
Array.equals(arrayA,arrayB);
arrayA是用于比较的第一个数组,arrayB是用于比较的第二个数组。
2.填充数组
在指定位置进行数值填充。
Array.fill(array.value);
array表示数组,value表示填充的值。只能使用同一个数值进行填充。
3.数组查找
从数组种查询指定位置的元素,或者查询某元素在指定位置中的位置,语法格式如下。
binarySearch(Object[] a,Object key);
a表示要搜寻的数组,key表示要搜索的值。
在数组种指定范围内查找,语法格式如下。
binarySearch(Object[] a,int fromIndex,int toUndex,Object ket);
a表示要进行查找的数组,fromIndex指定范围的开始处索引(包含开始处),
toIndex指定范围的结束处(不包含结束处),key表示要搜索的元素。
4.复制数组
1)copyOf()
Arrays.copyOf(dataType[] srcArray,int length);
srcArray 表示要进行复制的数组,length 表示复制后的新数组的长度
2)CopyOfRange()
Array.copyOfRange(dataType[] srcArray,int startIndex,int endIndex);
srcArray 表示原数组,startIndex 表示开始复制的起始索引,endIndex 表示终止索引。(注意:目标数组如果已经存在,将会被重构)
3)arraycopy()
System.arraycopy(dateType[] srcArray,int srcIndex,int destArray,int destIndex,int length)
srcArray 表示原数组,srcIndex 表示源数组中的起始索引,destArray 表示目标数组,destIndex 表示目标数组中的起始索引,length 表示要复制的数组长度。(注意:目标数组必须已经存在,且不会被重构,相当于替换目标数组中的部分元素。srcIndex + length 不能超过原数组长度,destArray + length不能超过目标数组长度)
4)clone()
array_name.clone()
注意:clone方法的返回值是Object类型,要是有强制类型转换为是当的类型。语法格式如下:
int[] targetArray = (int[])sourceArray.clone();
目标数组如果已经存在,将会被重构。
数组排序
Java数组有5种常见的排序方法:
- Array.sort()
- 冒泡排序
- 快速排序
- 选择排序
- 直接插入
常见问题解答
1.声明数组需要注意什么?
声明数组时,要考虑最大容量。数组一旦被声明,它的容量就固定了,不容改变。若想在运行程序时改变容量,就需要用到集合。
2.数组在平时程序代码种使用是否频繁?
数组有一个缺点,就是一旦声明,就不能改变容量,这个也是其使用频率不高的原因。一般存储数据会使用集合或者Vector来存储数据。
Java不规则数组
Java实际上没有多维数组,只有一维数组。多维数组被解释为是数组的数组,所以会衍生出一种不规则数组。
规则的 4 * 3 二维数组有12个元素,而不规则数组就不一定了。如下代码就初始化了一个不规则数组。
int intArray[][] = {{1,2},{11},{21,22,23},{31,32,33}};
图7-0 不规则数组
动态初始化不规则数组较为麻烦,不能使用new int[4][3]
语句,而是先初始化高维数组,然后再分别诸葛初始化地位数组,代码如下:
1 | int intArray[][] = new int[4][]; // 先初始化高维数组 |
从上述代码初始化完成之后,不是有12个元素而是有9个元素,它们的下标索引如图7-1所示,课件其中下标 [0][2]
、[1][1]
和 [1][2]
是不存在的,如果试图访问它们则会抛出下标越界异常。
图7-2 不规则数组访问
Java数组也是一种数据类型
在Java数组中,单个数组内的元素类型是唯一的,由于Java语言是面向对象的语言,而类和类之间可以支持继承关系(从已有的类中派生出新类,新类能吸收已有类的数据属性和行为),这样可能产生一个数组里可以存放多种数据类型的假象。例如有一个水果数组,要求每个数组元素都是水果,实际上数组元素既可以是苹果,也可以是香蕉(苹果、香蕉都继承了水果,都是一种特殊的水果),但这个数组元素的类型还是唯一的,只能是水果类型。
Java的数组既可以存储基本类型的数据,也可以存储引用类型的数据,只要所有的数组元素居于相同的类型即可。
值得注意的是,数组也是一种数据类型,它本身是一种引用类型。例如int是一个基本类型,但int[](这是定义数组的一种方式)就是一种引用类型了。
没错,int[]就是一种数组类型,与int类型、String类型相似,一样可以使用该类型来定义变量,也可以使用该类型进行类型转换等。使用int[]类型来定义变量、进行类型转换时与其它普通类型没有任何区别。int[]类型时一种引用类型,创建int[]类型的对象也就是创建数组,需要使用创建数组的语法。
Java中数组和字符串的相互转换
字符串转换为数组
1)Java String类中的toCahrArray()方法将字符串转换为字符数组,具体代码如下:
1 | String str = "123abc"; |
2)Java.lang包中有String.split()方法,Java中通常用split()分割字符串,返回的是一个数组。
1 | String str = "123abc"; |
使用 split() 方法注意如下:
- 如果用“.”或“|”作为分隔的话,必须是如下写法,
String.split("\.")
或String.split("\|")
,这样才能正确的分隔开,不能用String.split(".")
或String.split("|")
。 - 如果在一个字符串中有多个分隔符,可以用“|”作为连字符,如“acount=? and uu =? or n=?”,把三个都分隔出来,可以用 String.split(“and|or”);
- 如果想在串中使用“”字符,则也需要转义。首先要表达“aaaa\bbbb”这个串就应该用”aaaa\bbbb”,这样分隔才能得到正确结果。
3)如果要返回byte数组就直接使用getBytes方法就可以了。
1 | String str = "123abc"; |
4)使用StringUtils中的join函数,使用前需先引入common-lang3的jar包,可去 apache 官网下载,代码如下所示。
1 | StringUtils.join(null) = null; |
数组转换为字符串
1)char字符数组转化为字符串,使用String.copyValueOf(charArray)
函数实现,具体代码如下所示:
1 | char[] arr = {'a','b','c'}; |
2)String字符串数组转化为字符串,代码如下
1 | String[] arr = {"123","abc"}; |