案例分析
假如需要统计某公司员工的工资情况,例如计算平均工资、最高工资、最低工资等。假设该公司有500名员工,用前面学的知识,程序员首先需要声明500个变量分别存储每位员工的工资,然后在进行操作,这样做会很麻烦的,而且错误率也会很高,因此我们可以使用数组(容器)进行操作,将所有的数据全部存储到一个数组中,统一操作。
容器概念
容器:是将多个数据存储到一起,每个数据称为该容器的元素。
数组概念:数组就是存储一组相同类型数据的数据结构。
数组本身属于引用类型
数组中的元素可以是基本数据类型,也可以是引用类型。
【引用类型包括:数组、类、接口】
语法一:
语法:
数组存储的数据类型[] 数组名字=new 数组存储的数据类型[长度];
数组定义语法详解:
1.数组存储的数据类型:创建的数组可以存储什么类型的数据
2.[]:表示数组
3.数组名字:定义的数组需要起个变量名,满足标识符规范,可以使用数组名字对数组进行操作。
4.new:关键字,创建数组使用的关键字。
5.数组存储的数据类型:必须要和前面的数据类型一致
6.[长度]:数组的长度,表示数组中可以存储多个元素
7.注意:数组是定长特性,长度一旦指定,就不可更改。
举例:
定义可以存储5个整数的数组,代码如下:
int[]nums=new int[5];
char[]c=new char[5];
boolean[]b=new boolean[2];
String[]str=new String[5];
语法二:
语法:
数据类型[]数组名=new 数据类型[]{
元素1,元素2,元素3,…};
这种语法,属于在创建数组时,就对数组进行初始化操作。
[]:不需要指定数组的长度,数组的长度由{}中元素的个数来决定。
例如:
int[]arr=new int[]{
1,2,3,4,5}
语法三:
语法:
数据类型[]数组名={
元素1,元素2,元素3,元素4,…};
例如:
int[]nums={
1,2,3,4,5};
1.索引:每一个存储到数组的元素,都会自动拥有一个整数编号,从0开始,这个自动编号称为数组索引(index)或下标,可以通过数组的索引访问到数组中的元素。
2.语法:数组名[索引]
3.数组的长度属性:每个数组都具有长度,而且是固定的,java中赋予了数组一个属性,可以获取数组的长度,语法为:数组名.length,属性length的执行结果就是数组的长度。由此可以推断出数组的最大索引值为数组长度-1,也就是数组名.length-1.
4.索引访问数组的元素
数组名[索引]=数值,为数组的元素赋值
数组名[索引],获取数组中的元素
package com.bdit;
/*
* 数组的定义和使用
*
* */
public class Test1 {
public static void main(String[] args) {
/*
* 数组的定义,语法一,动态赋值,其实就是根据下标
* 数据类型[] 数组名称=new 数据类型[数组的长度];
*/
int[]nums1=new int[5];
int nums2[]=new int[5];
nums1[0]=10;
nums1[1]=20;
nums1[2]=30;
nums1[3]=40;
nums1[4]=50;
System.out.println(nums1[0]);
for(int i=0;i< nums1.length;i++){
System.out.println("*******>"+nums1[i]);
}
System.out.println("=============================================");
/*
* 数组的定义,语法二:
* 数据类型[] 数组名称=new 数据类型[]{元素1,元素2,元素3,元素4,元素5};
*/
double[]nums3=new double[]{
1.1,1.2,1.3,1.4,1.5};
for(int i=0;i<nums3.length;i++){
System.out.println("----->"+nums3[i]);
}
System.out.println("=============================================");
/*
* 数组的定义,语法三,称为边声明边赋值
* 数据类型[] 数组名称={元素1,元素2,元素3,元素4,元素5};
* */
char[] chars={
'a','b','c','d','e'};
/*
* 数组的遍历
*/
System.out.println(chars[0]);
System.out.println(chars[1]);
System.out.println(chars[2]);
System.out.println(chars[3]);
System.out.println(chars[4]);
System.out.println("chars数组的长度:"+chars.length);
}
}
数组越界异常:
观察以下代码,运行后会出现什么问题?
public static void main(String[] args) {
int[]arrs={
1,2,3};
System.out.println(arrs[3]);
}
创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出ArrayIndexOutOfBoundsException数组索引越界异常。
数组空指针异常
public static void main(String[] args) {
int[]arr=null;//数组属于引用类型,如果给引用类型赋值为空,那就是null
System.out.println(arr[0]);
}
以上代码,在运行过程中,因为数组arr=nulll,索引再访问数组中的元素时,会产生一个NullPointerException空指针异常。
public static void main(String[] args) {
int[]nums=new int[]{
1,2,3,4,5,6,7,8,9};
for(int i=0;i<nums.length;i++){
System.out.println(nums[i]);
}
}
数组的反转:数组中的元素颠倒顺序
实现思路:
实现反转,就需要将数组最远端元素位置交换
定义两个变量,保存数组的最小索引和最大索引
两个索引上的元素交换位置
最小索引++,最大索引- -,再次交换位置
最小索引超过了最大索引,数组反转操作结束
package com.bdit;
/*
数组的反转,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1
*/
public class Test7 {
public static void main(String[] args) {
int[]arr={
1,2,3,4,5};
//获取最大索引
int max=arr.length-1;
for(int min=0;min<=max;min++){
//利用第三方变量完成数组中的元素交换
int temp=arr[min];
arr[min]=arr[max];
arr[max]=temp;
max--;//最大索引
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
计算某个数组中所有元素的和以及平均数
package com.bdit;
/*
* 求数组中所有元素的和、平均数
* */
public class Test3 {
public static void main(String[] args) {
int[]nums=new int[]{
19,22,34,10,76,54,88};
int sum=0;
for(int i=0;i<nums.length;i++){
sum+=nums[i];//sum=sum+nums[i]
}
double avg=sum/ nums.length;
System.out.println("和:"+sum+",平均数:"+avg);
}