有一天你被要求用一个程序来录入同学们的成绩,有没有一种东西可以存储一堆数据呢?
这个东西就是数组了.
数组
数组可以用来存储很多相同类型的数据,是一种引用变量.
1.声明数组
元素类型[] 变量名(即数组名称.)
初始化数组的时机与变量的初始化:
1.声明时直接初始化,也叫静态初始化.
int[] nums={1,2,3,4,5};
2.先声明再初始化,又叫动态初始化,又细分为两种
/*1.规定长度的写法*/
int[] nums=new int[5];
/*2.不规定长度的写法*/
int[] nums=new int[]{};
2.元素
上面1中的程序大括号内的每一个数字都是数组的元素.
3.数组的长度与下标
数组内存储的元素数量称为数组的长度,一般用length指代.
数字内元素的"位置",一般用index指代
下标的注意事项:下第一个元素的下标为0,最后一个元素下标为length-1.
4.数组元素的访问
有了下标就可以访问数组内的元素了,利用for循环可以输出所有的元素.
此时我们运行如下程序:
public staitic void main(String[] args){
int[] num=new int[5];
double[] dou=new double[5];
char[] chs=new char[5];
boolean[] bol=new boolean[5];
String[] str=new String[5];
/*利用for循环输出以上数组*/
System.out.print("输出num数组:");
for(int i=0;i<num.length;i++){
System.out.print(num[i]+",");
}
System.out.print("输出dou数组:");
for(int i=0;i<dou.length;i++){
System.out.print(dou[i]+",");
}
System.out.print("输出chs数组:");
for(int i=0;i<chs.length;i++){
System.out.print(chsi]+",");
}
System.out.print("输出bol数组:");
for(int i=0;i<bol.length;i++){
System.out.print(bol[i]+",");
}
System.out.print("输出str数组:");
for(int i=0;i<str.length;i++){
System.out.print(str[i]+",");
}
}
可以看到的输出结果为:
输出num数组:0,0,0,0,0,
输出dou数组:0.0,0.0,0.0,0.0,0.0,
输出chs数组:,,,,,
输出bol数组:false,false,false,false,false,
输出str数组:null,null,null,null,null,
以上输出结果就是每种类型的默认值,其中char类型在不同电脑输出的内容不同,其底层内容是'\u0000.'
5.数组元素的覆盖
语法:变量名[index]=新值.
示例代码:
int[] nums={1,2,3,4,5};
nums[2]=15;
System.out.println(nums[2]);
运行结果为15.
6.数组间的赋值
就是令一个数组等于另一个数组,也就是变量之间的赋值.
下面看如下代码:
public static void main(String[] args) {
int[] num1={1,2,3,4,5};
System.out.println("修改前num1的第三个元素为:"+num1[2]);
int[] num2=num1;
num2[2]=10;
System.out.println("修改num2第三个元素之后num1的第三个元素为:"+num1[2]);
System.out.println("修改num2第三个元素之后num1的第三个元素为:"+num2[2]);
}
运行结果:
修改前num1的第三个元素为:3
修改num2第三个元素之后num1的第三个元素为:10
修改num2第三个元素之后num1的第三个元素为:10
我们并没有修改num1[2],却发现num1[2]也跟num2[2]一样被修改为10.这就是引用变量的性质了,
通过一个变量对数组的元素进行修改,那么与之相关的变量对应的数组的元素也会发生变化。
7.常见异常类型:数组下标越界异常
运行如下代码:
public static void main(String[] args) {
int[] num1={1,2,3,4,5};
System.out.println(num1[5]);
}
在控制台可以看到如下文字:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at Test20180728.main(Test20180726.java:4)
................
................
这个"ArrayIndexOutOfBoundsException" 就是数组下标越界异常的意思了,意思就是我们访问了一个在数组中不存在的下标.
在写代码的时候一定要注意数组长度和数组下标的关系
8.引用类型Arrays
Arrays类提供了一系列可以对数组进行操作的方法,是数组的工具类.
例如我们要直接输出数组,在不使用Arrays的情况下需要for循环进行遍历输出,代码比较多.如果使用Arrays类的toString方法,只需一行代码就可以实现了.
代码示例:
public static void main(String[] args) {
int[] nums={1,2,3,4,5};
//for循环遍历输出数组:
System.out.println("for循环输出数组:");
for (int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
System.out.println();
System.out.println("Arrays.toString方法输出数组:");
// Arrays内的toString方法输出数组:
System.out.println(Arrays.toString(nums));
}
运行结果:
for循环输出数组:
1 2 3 4 5
Arrays.toString方法输出数组:
[1, 2, 3, 4, 5]
不过在使用Arrays之前,需要导包,具体方法是在代码最顶端添加如下语句:
import java.util.Arrays;
9.复制数组方法
复制数组有两种方法,一种是利用Arrays类,一种是系统复制法
1.Arrays.copyOf();
元素类型[] 变量名=Arrays.copyOf(src,newLength);
src:源数组
newLength:新数组的长度
代码示例:
public static void main(String[] args) {
int[] num1={1,2,3,4,5};
int[] num2=Arrays.copyOf(num1,5);
System.out.println("利用Arrays.copyOf复制的数组:"+Arrays.toString(num2));
}
运行结果:
利用Arrays.copyOf复制的数组:[1, 2, 3, 4, 5]
2.System.arraycopy();
System.arraycopy(src,start1,des,start2,length);
src:源数组,即被复制的数组名
start1:源数组复制的开始下标
des:目标数组名
start2:目标数组复制的开始下标
length:复制的长度
代码示例:
public static void main(String[] args) {
int[] num1={1,2,3,4,5};
int[] num2=new int[5];
System.arraycopy(num1,0,num2,0,5);
System.out.println("利用System.arraycopy复制的数组:"+Arrays.toString(num2));
}
运行结果:
利用System.arraycopy复制的数组:[1, 2, 3, 4, 5]
那么这两种方法有什么区别?
1.Arrays.copyOf可以对数组进行扩容或缩容,System.arraycopy不能进行此操作.
2.System.arraycopy可以从任意位置开始到任意位置结束,Arrays.copyOf只能从开始复制.