数组
一、什么是数组
二、数组的定义
dataType[] arrayRefVar; // 首选的方法 数据类型[] 数组名称 或 dataType arrayRefVar[]; // 效果相同,但不是首选方法 数据类型 数组名称[]
注意: 建议使用 dataType[] arrayRefVar 的声明风格声明数组变量。 dataType arrayRefVar[] 风格是来自 C/C++ 语言 ,在Java中采用是为了让 C/C++ 程序员能够快速理解java语言。
package com.method.augus; public class Dem04 { public static void main(String[] args) { int[] arr; //声明一个长度为5的string类型的数组 String[] aArray = new String[5]; //声明数组,并且赋值 String[] bArray = {"李慢慢","君陌","于连"}; //声明数组,并赋值 String[] cArray = new String[]{"宋远桥","俞莲舟","俞岱岩","张松溪","张翠山","殷梨亭","莫声谷"}; } }
三、数组的基本特点
- 数组的长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 数组中元素的类型必须是相同类型,不允许出现混合类型。
- 数组类型可以是任何数据类型,包括基本类型和引用类型。
- 数组有索引的:索引从0开始,到 数组.length-1 结束
- 数组变量属于引用类型,数组也是对象。
注意:数组变量属于引用类型,数组也是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中存储的。
四、数组初始化
数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。
- 静态初始化
除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。
int[] arr = {12,23,95}; int[] arr = new int[]{12,13,15};
注意下面的两种方式都是错误的:
1.new int[3]{12,23,45};-->错误 2.int[] arr ; arr = {12,23,45}; --->错误
- 动态初始化
数组定义与为数组元素分配空间并赋值的操作分开进行。
int[] arr ; arr = new int[3] arr[0] = 12; arr[1] = 73; arr[2] = 15;
- 默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
int[] arr = new int[3]; ---> 数组有默认的初始化值
需要注意:数组有默认的初始值,初始化值取决于数组的类型
- byte[] : 0
- short[] :0
- int[] :0
- long[] :0
- float[]: 0.0
- double[] :0.0
- char[] : '\u0000'
- boolean[] : false
- 引用数据类型的数组: null
五、数组的应用
5.1.最值问题
实现一个功能:给定一个数组int[] arr = {12,3,7,4,888,125,9,45}; ,求出数组中最大的数。实现思路,打擂台的原理,交替上台打擂台
package com.method.augus; public class Demo05 { public static void main(String[] args) { //给定一个数组int[] arr = {12,3,7,4,888,125,9,45}; ,求出数组中最大的数 int[] arr = {12,3,7,4,888,125,9,4500}; //调用方法求最大值 int maxArr = getMaxNumber(arr); System.out.println("最大值为:"+maxArr); } /** * 求数组中的最大值 * @param arr * @return */ public static int getMaxNumber(int[] arr){ //先取出第一个数,假设为最大值 int maxArr = arr[0]; //循环分别取出值,拿过来比较 for (int i = 0; i < arr.length; i++) { if(arr[i]>maxArr){ //本次循环取出的值大于假设的最大值,则将本次取出的值,赋值给maxArr maxArr = arr[i]; } } return maxArr; } }
5.2.查询问题
数组中元素的根据索引查找,索引从左往右从0开始,最后一个元素的索引是 数组的长度-1
public class Demo06 { public static void main(String[] args) { //查询指定位置的元素 //给定一个数组: int[] arr = {12,34,56,17,13,10}; //查找索引为3的元素,其实是第四个元素 System.out.println(arr[3]); } }
查询指定元素的位置:找出某个元素对应的索引案例如下:
package com.method.augus; public class Demo07 { public static void main(String[] args) { //给定一个数组 int[] arr = {12,34,56,78,3,56}; //查询78这个元素对应的索引 int index = getIndex(arr, 78); System.out.println(index); } /** * 查看某个值在数组中的索引 * @param arr 数组 * @param num 值 * @return 索引 */ public static int getIndex(int[] arr,int num){ //查询元素在数组中对应的索引 //定义一个变量,用于保存查找出来的78这个元素的索引 int idx = -1; for (int i = 0; i < arr.length; i++) { //取值进行判断 if(arr[i]==78){ idx = i; } } return idx; } }
5.3.添加元素
向数组里添加一个元素怎么添加,一般数组是不能添加元素的,因为数组在初始化时就已定好长度了,不能改变长度,所以所谓的添加只是替换
package com.method.augus; public class Demo08 { public static void main(String[] args) { //功能:给定一个数组,在数组下标为3的位置上添加一个元素101 //1.给定一个数组: int[] arr = {12,34,56,7,3,10,55,66}; //添加元素 arr[3] = 45; System.out.print("添加之后的元素信息:"); for (int i : arr) { System.out.print(i+","); } } }
5.4.删除元素
java 的数组是固定长度的,无法直接删除,我们可以通过创建一个新数组,把原始数组中要保留的元素放到新数组中即可:
package com.method.augus; import java.util.Arrays; public class Demo10 { public static void main(String[] args) { int[] arr = {3, 4, 5, 6, 7};// 原始数组 int num = 2; // 删除索引为 2 的元素,即删除第三个元素 5 int[] newArray = new int[arr.length-1];// 新数组,长度为原始数组减去 1(因为删除一个长度就变了) for (int i = 0; i < newArray.length; i++) { //判断元素是否越界 if(num<0 || num>=arr.length){ System.out.println("索引越界,无法操作"); } //判断 if(i<num){ newArray[i] = arr[i]; }else { //大于num的的时候,num2,那么保存的则是索引3开始的数据,所以加1 newArray[i] = arr[i+1]; } } System.out.println(Arrays.toString(arr)); System.out.println(Arrays.toString(newArray)); } }
六、java.util.Arrays
package com.method.augus; import java.util.Arrays; public class Demo11 { public static void main(String[] args) { //给定一个数组 int[] arr = {23,12,56,1,5,9,10}; //toString:对数组进行遍历查看的,返回的是一个字符串 System.out.println(Arrays.toString(arr)); //binarySearch:二分法查找:找出指定数组中的指定元素对应的索引: //这个方法的使用前提:要查看的是一个有序的数组: //sort:排序 -->升序 Arrays.sort(arr); System.out.println(Arrays.toString(arr)); System.out.println(Arrays.binarySearch(arr,56));//是从排序后的结果中找 //copyOf:完成数组的复制 int[] arr2 = {23,12,5,2,78,90}; //拷贝数组 ,第二个参数指定了拷贝的元素个数 int[] ints = Arrays.copyOf(arr2, 4); System.out.println(Arrays.toString(ints)); //[23, 12, 5, 2] //copyOfRange:区间复制, 拷贝一个区间,是左闭右开的区别 int[] ints1 = Arrays.copyOfRange(arr2, 1, 4); //[12, 5, 2] System.out.println(Arrays.toString(ints1)); //equals:比较两个数组的值是否一样: int[] arr3 = {1,3,7,2,4,8}; int[] arr4 = {1,3,7,2,4,8}; System.out.println(Arrays.equals(arr3,arr4));//true /* 1、对于对象引用类型:“==”比较的是对象的内存地址。 所以就算两个对象的值相等,它们也是不等的(因为每个对象的地址都是不一样的) 2.对于基本类型数据,其实比较的是它的值。 所以一般用==来比较两个数字大小是不是相等的 */ System.out.println(arr3==arr4);//虽然值相同但是在内存中地址是不同的所以返回的flase //fill:数组的填充 将指定的值赋给指定数组的每个元素 int[] arr5 = {1,3,7,2,4,8}; Arrays.fill(arr5,10); System.out.println(Arrays.toString(arr5));//[10, 10, 10, 10, 10, 10] } }
七、数组的复制
数组的复制使用arraycopy,源码如下:
java.lang.System public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- src - 源数组。
- srcPos - 源数组中的起始位置。
- dest - 目标数组。
- destPos - 目标数据中的起始位置。
- length - 要复制的数组元素的数量。
package com.method.augus; import java.util.Arrays; public class Demo12 { public static void main(String[] args) { //给定一个数组 int[] arr1 = {23,12,56,8,16,121,90}; //给定一个目标数组 int[] arr2 = new int[10]; //复制数组 System.arraycopy(arr1,1,arr2,0,5); //输出目标数组 System.out.println(Arrays.toString(arr2)); //[12, 56, 8, 16, 121, 0, 0, 0, 0, 0] } }
八、Java二维数组
8.1.创建二维数组
在 Java 中二维数组被看作数组的数组,即二维数组为一个特殊的一维数组,其每个元素又是一个一维数组。Java 并不直接支持二维数组,但是允许定义数组元素是一维数组的一维数组,以达到同样的效果。声明二维数组的语法如下:
type array[][];
type[][] array;
其中,type 表示二维数组的类型,array 表示数组名称,第一个中括号表示行,第二个中括号表示列。
下面分别声明 int 类型和 char 类型的数组,代码如下:
int[][] age; char[][] sex;
8.2.初始化二维数组
二维数组可以初始化,和一维数组一样,可以通过3种方式来指定元素的初始值。这 3 种方式的语法如下:
array=new type[][]{值 1,值 2,值 3,…,值 n}; array=new type[][]{new 构造方法(参数列),…}; type[][] array={{第1行第1列的值,第1行第2列的值,…},{第2行第1列的值,第2行第2列的值,…},…};
- 静态初始化
除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。
int[][] arr = {{1,2},{4,5,7},{4,5,6,7,8,9,9}}; int[][] arr =new int[][] {{1,2},{4,5,7},{4,5,6,7,8,9,9}};
案例代码如下:
public class Demo13 { public static void main(String[] args) { int[][] arr1 = {{1,2},{4,5,6},{7,8,9,10},{10,11,12,13,14,15}}; System.out.println(Arrays.toString(arr1[2])); int[][] arr2 =new int[][] {{1,2},{4,5,6},{7,8,9,10},{10,11,12,13,14,15}}; System.out.println(Arrays.toString(arr2[3])); } }
- 动态初始化
数组定义与为数组元素分配空间并赋值的操作分开进行。
int[][] arr = new int[3][]; //本质上定义了一维数组长度为3,每个“格子”中放入的是一个数组 arr[0] = new int[]{1,2};//给索引为0的位置赋值 arr[1] = new int[]{3,4,5,6};//给索引为1的位置赋值
arr[2] = new int[]{34,45,56};//给索引为2的位置赋值
案例代码如下:
public class Demo14 { public static void main(String[] args) { //定义一维数组,长度为3,每个数组“格子”中,有一个默认的长度为2的数组: int[][] arr = new int[3][2]; arr[0] = new int[]{30,40,50}; arr[1] = new int[]{1,2,3,4}; arr[2] = new int[]{5,6,7,8}; //数组遍历 for (int[] ints : arr) { for (int anInt : ints) { System.out.println(anInt); } System.out.println(); } } }
- 默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组只要分配了空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
public class Demo15 { public static void main(String[] args) { //初始化数组 int[][] arr = {{2,3},{4,5,67,12,12},{4,8,9}}; System.out.println(arr[1][2]); } }

浙公网安备 33010602011771号