“嗨~大家好!我是学长,今天的你过得还好吗?”
“这里是 offer 学院,帮你 轻松 拿offer”
– 2022.11.21 –
我们要统计一个公司50名员工的工资情况。
例如计算平均工资。按照我们之前所学的知识,在程序中我们需要声明 50个变量, salary1、salary2、…、salary50, 来分别记住每个员工的工资,然后计算平均值,这样做,是不是非常麻烦。
double salary1 = 100;
double salary2 = 100;
...
double salary50 = 100;
double average = (salary1 + salary2 + ... + salary50) / 50;
有没有优化方法呢?
Java 开发者就给了我们一个解决办法,用一组相连的集合,来记着这50个员工的工资,然后对他们进行操作。
double sum = 0;
double average;
double[] salary[100];
....
for (int i = 0; i < 100; i++) {
sum = sum + salary[i];
}
average = sum / 100;
这种一组数据的集合,就叫做 “数组” ,这就是它的由来。
一、了解数组
定义:
数组是指一组数据的集合,数组中的每个数据被称为元素。在数组中可以存放任意类型的元素,但是在同一个数组里面存放的元素类型必须一致。
分类:
数组可以分为一维数组和多维数组(最常见的是 二维数组 )。
本小节我们主要先给大家讲一下一维数组。
二、一维数组
语法:
数组类型[] 数组名 = new 数组类型[数组长度];
数组类型[] 数组名 = new 数组类型[]{数组元素0, 数组元素1, ...};
数组类型[] 数组名 = {数组元素0, 数组元素1, ...};
一维数组定义:
int[] ids = new int[100];
String[] names = new String[] {"西熙", "叮当", "糖糖", "次龙"};
内存图:
- 数组属于引用数据类型的变量,数组中的元素的类型可以是基本数据类型,也可以使引用数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间。
- 数组的长度一旦确定就不可以修改。
我们在这小节中,通过一个简图,让大家体会下Java中不同数据在内存中的存放位置,也就是java中内存的简单结构。
数组在内存中的变化图如下:
1. 创建一个整型数组ids,长度为5
2. 在堆区会有创建一片区域,然后这块区域的地址引用,存放在栈区的ids 变量中。
代码演示:
public class Demo13_1 {
public static void main(String[] args) {
// 1. 第一种方式定义数组
int[] ids = new int[50];
// 输出整个数组
System.out.println("ids = " + ids);
// 输出数组第一个元素
System.out.println("ids[0] = " + ids[0]);
// 输出数组最后一个元素
System.out.println("ids[99] = " + ids[49]);
//下面这句会报错
// System.out.println("ids[99] = " + ids[51]);
// 2. 第二种方式定义数组
String[] names = new String[] {"乔峰", "段誉", " 虚竹 ", "无崖子"};
// 输出整个数组
System.out.println("names = " + names);
// 输出数组第一个元素
System.out.println("names[0] = " + names[0]);
// 输出数组最后一个元素
System.out.println("names[3] = " + names[3]);
// 3. 第三种方式定义数组
Object[] objects = {1, "张三丰", "男", 20, "18933943343", "fff@163.com"};
// 输出整个数组
System.out.println("objects = " + objects);
// 输出数组的长度
System.out.println("数组长度 = " + objects.length);
// 输出数组第一个元素
System.out.println("objects[0] = " + objects[0]);
// 输出数组最后一个元素
System.out.println("objects[" + (objects.length - 1) +"] = " + objects[objects.length - 1]);
}
}
分析:
1. 直接打印数组变量,并不能输出数组里的数据,输出的是变量类型@哈希码。
2. 数组是一组相同类型的数据,有一个共同的名字,可以通过下标取访问每一个元素。
注意: 数组下标是从0开始的,对于上述定义的数组ids,长度是50,因此第一个元素时ids[0],最后一个元素是ids[49],访问ids[50]是要出错的,下标越界了。数组ids的长度,可以通过其 length 属性获取。
Java中不同数据类型元素的初始值:
三、操作数组:
在程序开发中,数组的应用非常广泛,灵活地使用数组对实际开发很重要。接下来,本节将针对数组的常见操作,如数组的遍历、最值的获取、数组的排序等,进行详细地讲解。
数组元素的访问:
public class Demo13_2 {
public static void main(String args[]){
int num1[] = new int[5];
num1[0] = 32; //每个元素单独初始化
num1[1] = 543;
num1[2] = 17;
num1[3] = 8;
num1[4] = 95;
int num2[] = new int[10];
for(int i=0;i<10;i++){ //采用循环方式初始化
num2[i] = i+1;
}
System.out.println("第一个数组:");
for(int j=0;j<num1.length;j++){ //采用循环方式输出数组的所有元素
System.out.print(num1[j] +" ");
}
System.out.println();
System.out.println("第二个数组:");
for(int x=0;x<num2.length;x++){
System.out.print(num2[x] +" ");
}
}
}
数组的属性:
数组是引用类型,具有属性,常用的数组属性就是数组的长度length,在使用时需注意:
- 数组的长度(length)必须>=0;
- length为只读。
- 利用length遍历数组
数组的遍历:
public class Demo13_3 {
public static void main(String[] args) {
int a[] = {1,-12,33};
int sum = a[0];
int max = a[0];
int min = a[0];
for(int i=1;i<a.length;i++){
sum = sum+a[i];
if(a[i]>max){
max = a[i];
}
if(a[i]<min){
min = a[i];
}
}
double ave = (double)sum/3;
System.out.println("平均值"+ave);
System.out.println("最大值"+max);
System.out.println("最小值"+min);
}
}
循环赋值:
public class Demo13_4 {
public static void main(String[] args) {
// 声明一个整型数组
int[] arr = new int[10];
// 使用for循环对数组arr进行遍历,将数字1到10赋值给数组arr
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
// 循环赋值完成,此时 arr = {1,2,3,4,5,6,7,8,9,10}
// 遍历数组,打印数组中每一个元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "t");
}
}
}
遍历获取元素:
public class Demo13_5 {
public static void main(String[] args) {
// 初始化一个整型数组
int[] arr = {1,2,3,4,5};
// 使用for循环遍历数组arr
for (int i = 0; i < arr.length; i++) {
// 打印位置i的元素
System.out.println("索引位置" + i + "的元素为:" + arr[i]);
}
}
}
增强for循环:
public class Demo13_6 {
public static void main(String[] args) {
// 初始化 字符串 数组 words
String[] words = {"Welcome ", "to ", "java"};
for(String word: words) {
System.out.print(word);
}
}
}
实例中遍历了一个单词数组,并且将它们打印成了一个句子。 for each 循环对words数组进行了遍历,并依次将每个 索引 的值赋值给了word变量,然后再执行循环体中的语句。显然 for each循环的代码看起来更加清晰。但增强for循环无法指定遍历顺序,也无法获取数组的索引。
四、学习小结
本小节我们学习了 Java 数组,知道了数组是引用数据类型。
它在创建时,会在内存中开辟一个连续的空间;数组是同一数据类型的集合。
可以使用数组下标来引用数组元素,数组元素的下标都是从0开始,使用下标不要超出范围,否则会抛出异常。
可以使用length属性获取数组的长度。我们在下一小结看看多维数组的使用与学习吧。
✅
还是那句话:我亦无他,唯手熟尔!
我们下期再见!
END