Java的第四篇文章——数组

简介: Java的第四篇文章——数组

第四章 数组

学习目标

  • 了解数据概念
  • 数组创建
  • 从数组中存取数据
  • 遍历数组
  • 数组中元素的默认值
  • 数组内存分析
  • 多维数组
  • 数组练习

1.数组概念

一组相同类型数据的容器。

  • 相同类型:Java语言要求存入数组的数据类型必须一致
  • 容器:类似于生活中存放物品的容器,在编程的世界中,『容器』可以用来存放数据
  • 一组:容器中可以存放多个数据

2.声明数组变量

int[] ageArray;
String[] nameArray;
double salaryArray [];

虽然[]也可以放在变量名的后面,但是还是建议放在类型的后面。

// 声明数组时不能在方括号中指定数组长度
char[5] tipArray;

3.创建数组对象

3.1 指定长度创建数组

int[] ageArray = new int[5];

3.2 直接赋值创建数组

此时[]中不能写数组指定长度

String nameArray = new String[]{"foo", "bar", "biz"};
//此时的长度就是3

也可以这么写:

int[] numberArray = {5, 7, 11, 13, 17, 19};
//后面的{}就是一个对象

4.将数据存入数组

String nameArray = new String[3];
int[] numberArray = new int[5];
ageArray[0] = 10;
ageArray[1] = 11;
ageArray[2] = 12;
ageArray[3] = 13;
ageArray[4] = 14;
nameArray[0] = "aaa";
nameArray[1] = "bbb";
nameArray[2] = "ccc";

5.从数组中读取数据

System.out.println("ageArray[0] = " + ageArray[0]);
System.out.println("ageArray[1] = " + ageArray[1]);
System.out.println("ageArray[2] = " + ageArray[2]);
System.out.println("ageArray[3] = " + ageArray[3]);
System.out.println("ageArray[4] = " + ageArray[4]);
System.out.println("nameArray[0] = " + nameArray[0]);
System.out.println("nameArray[1] = " + nameArray[1]);
System.out.println("nameArray[2] = " + nameArray[2]);

6.遍历数组

// 6.遍历数组(通过循环依次读取数组中的每一个值)
// 遍历数组的起点:数组下标0
// 遍历数组的终点:数组长度-1
for (int i = 0; i < ageArray.length; i++) {
    // 在遍历过程中,使用i作为数组下标访问每一个数组元素
    int age = ageArray[i];
    System.out.println("age = " + age);
}

注:生成遍历数组的for循环模板的快捷键是数组变量名.fori

7.数组必须创建对象在访问元素

8.数组中元素默认值

9.内存分析

9.1 声明基本数据类型变量

int a = 10;

9.2 创建对象

Scanner scanner = new Scanner(System.in);

9.3 创建数组对象

9.4 将数据写入数组

ageArray[1] = 5;

9.5 多声明一个数组变量

9.6 通过另一个变量访问数组元素

otherArray[2] = 14

9.7 数组变量指向新数组

otherArray = new int[2];

 

9.8 给新数组元素赋值

otherArray[1] = 33;

10.多维数组

10.1 多维数组概念

从逻辑角度出发

(1)一维数组

一维数组是线性的结构,通俗来说就是一条线

(2)二维数组

二维数组通俗来说就是一个面

(3)三维数组

三维数组就是一个立体的空间结构了

10.2 多维数组的底层内存存储结构

10.3 多维数组的语法层面

(1)创建二维数组格式一

// 格式1:动态初始化——创建数组对象时就指定了两个维度的数组长度
int[][] arr2d01 = new int[3][2];
arr2d01[0][0] = 100;
arr2d01[0][1] = 101;
arr2d01[1][0] = 102;
arr2d01[1][1] = 103;
arr2d01[2][0] = 104;
arr2d01[2][1] = 105;

(2)创建二维数组格式二

// 格式2:动态初始化——仅指定第一个维度的数组长度
int[][] arr2d02 = new int[3][];
// Java中多维数组不必都是规则矩阵形式
arr2d02[0] = new int[]{3, 5, 7};
arr2d02[1] = new int[]{14, 21, 66, 89};
arr2d02[2] = new int[]{90, 100};

注:C语言中的多维数组创建就不能用这种方式创建,例如C语言的二维数组就一定要指定列的大小,才会自动生产多少行。Java的二维数组可以不是规则矩阵形式。

(3)创建二维数组格式三

// 格式3:静态初始化——在创建对象时将数据填充
// 此时如果某个元素位置设置为null不会编译报错,但是访问这个位置时还是要先初始化
int[][] arr2d03 = new int[][]{{1,2,3}, {4,5}, null, {6,7,8}};
// 前面设置null的地方,需要初始化才可以访问
arr2d03[2] = new int[]{12,24};
arr2d03[2][0] = 5;

(4)创建二维数组格式四【不建议】

// 格式4:声明变量时,两层[]没在一起
int[] x[] = new int[][]{{1,2,3}, {4,5}, {6,7,8}};

10.4 访问二维数组

// 二、访问二维数组元素(读、写)
int[][] arr2d05 = new int[2][2];
// 向数组元素写入数据
arr2d05[1][0] = 10;
// 读取数组元素
System.out.println("arr2d05[1][0] = " + arr2d05[1][0]);

10.5 遍历二维数组

// 三、遍历二维数组:需要使用双层嵌套的循环
int[][] arr2d06 = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
// 先遍历第一个维度:取出每一个一维数组
for (int i = 0; i < arr2d06.length; i++) {
    int[] intArr = arr2d06[i];
    for (int j = 0; j < intArr.length; j++) {
        int intValue = intArr[j];
        System.out.println("intValue["+i+"]["+j+"] = " + intValue);
    }
}

11.数组练习

练习1

升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。第一个数组的数组元素{2,0,3,2,4,0,1,3,2,3,3}是第二个数组的下标,第二个数组是{8,2,1,0,3},第二数组根据第一数组的元素挨个取出元素,组合起来就是房东的电话,该题求房东的电话号码。

public class ArrayTest {
    public static void main(String[] args) {
        /*
        * 解题思路:建立两个数组,根据提示取出数组元素,
        * 用加号连起来就是电话号码的字符串
        * */
        String s = "";
        int[] array1 = new int[]{8,2,1,0,3};
        int[] ints = new int[]{2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3};
        for (int i = 0; i < ints.length; i++) {
           s += array1[ints[i]];
        }
        System.out.println("房东的电话号码为:"+s);
    }
}

练习2

分析以下需求,并用代码实现:

(1)在编程竞赛中,有10位评委为参赛的选手打分,分数分别为:5,4,6,8,9,0,1,2,7,3

(2)求选手的最后得分(去掉一个最高分和一个最低分后其余8位评委打分的平均值)

public class ArrayTest {
    public static void main(String[] args) {
        /*
        * 解题思路:要有两个循环,第一个循环求出最大值和最小值,
        * 第二个循环求出总和,然后除以8即可。
        * */
        int[] ints = {5, 4, 6, 8, 9, 0, 1, 2, 7, 3};
        int max = ints[0];
        int min = ints[0];
        int score = 0;
        int sum = 0;
        for (int i = 1; i < ints.length; i++) {
            score = ints[i];
            if(score>max){
                max = score;
            }else if (score < min){
                min = score;
            }
        }
        for (int i = 0; i < ints.length; i++) {
            sum += ints[i];
        }
        double average = (sum - min - max)/8.0;
        System.out.println("average = "+average);
    }
}

练习3

用一个数组,保存星期一到星期天的7个英语单词,从键盘输入1-7,显示对应的单词

中文 英文
星期一 Monday
星期二 Tuesday
星期三 Wednesday
星期四 Thursday
星期五 Friday
星期六 Saturday
星期日 Sunday
public class ArrayTest {
    public static void main(String[] args) {
        String[] strings = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        System.out.println(strings[num - 1]);
    }
}

练习4

用一个数组存储26个英文字母的小写形式,并遍历显示小写字母以及它对应的大写字母,例如:a->A

提示:ASCII码表

public class ArrayTest {
    public static void main(String[] args) {
        char[] chars = new char[26];
        for (int i = 0; i < 26; i++) {
            chars[i] = (char)('a' + i);
        }
        for (int i = 0; i < chars.length; i++) {
            System.out.println((char)(chars[i] - 32));
        }
    }
}

练习5

public class ArrayTest {
    public static void main(String[] args) {
        int[][] ints = new int[10][];
        for (int i = 0; i < 10; i++) {
            ints[i] = new int[i+1];
            ints[i][0] = 1;
            ints[i][i] = 1;
            for (int j = 1; j < i; j++) {
                ints[i][j] = ints[i-1][j-1]+ints[i-1][j];
            }
        }
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < i + 1; j++) {
                System.out.print(ints[i][j]+"\t");
            }
            System.out.println();
        }
    }
}

12.数组工具类Arrays

用法举例:

// 1.创建一个数组对象
int[] toBeSortedArr = {22, 33, 5, 7, 2, -6, 13, 99, 82};
// 2.调用工具类的工具方法对上面数组进行排序
// 类名.方法名(传入参数)
Arrays.sort(toBeSortedArr);
// 3.遍历数组
for (int i = 0; i < toBeSortedArr.length; i++) {
    int value = toBeSortedArr[i];
    System.out.println("value = " + value);
}

13.数组使用中常见的异常

13.1 数组下标越界异常

// 1.数组下标越界异常
int[] intArr = new int[5];
// java.lang.ArrayIndexOutOfBoundsException
// intArr[80] = 5;
// java.lang.ArrayIndexOutOfBoundsException
// System.out.println("intArr[5] = " + intArr[5]);

13.2 空指针异常

// 2.空指针异常
// java.lang.NullPointerException
char[] charArr = null;
System.out.println("charArr[0] = " + charArr[0]);
相关文章
|
1月前
|
存储 Java 索引
个人笔记—Java基础—数组
该内容是关于数组的介绍。数组是一种容器,用于存储同类型的多个值。初始化有静态和动态两种方式:静态初始化是在创建时直接指定元素,有完整和简写格式;动态初始化则只指定类型和长度,不给定具体元素。访问数组元素通过索引,从0开始,修改元素是`数组名[索引] = 值`,数组长度是`数组名.length`。遍历数组通常用for循环。内存分配上,类信息和静态数据存放在方法区,栈内存负责方法执行和局部变量,堆内存用于new出的对象和数组,有默认初始值。
20 0
|
21天前
|
存储 Java 程序员
Java 数组
4月更文挑战第16天
|
2天前
|
Java 索引
Java中数组详解
Java中数组详解
43 19
|
3天前
|
Java
解析java中的数组
解析java中的数组
10 3
|
3天前
|
存储 安全 Java
Java一分钟之-数组的创建与遍历
【5月更文挑战第8天】本文介绍了Java中数组的基本概念、创建与遍历方法,强调了类型匹配和数组越界问题。示例展示了如何创建整数数组并初始化元素,同时提供了避免数组越界的策略。对于遍历,文章提到了for循环和增强型for循环,并给出了防止错误的建议,如正确声明类型、初始化数组、安全索引操作及使用合适的数据结构。遵循这些指导可帮助开发者有效管理Java数组并减少错误。
15 0
|
12天前
|
存储 Java 索引
Java数组
Java数组
23 0
|
12天前
|
存储 算法 Java
【Java探索之旅】掌握数组操作,轻松应对编程挑战
【Java探索之旅】掌握数组操作,轻松应对编程挑战
11 0
|
12天前
|
存储 Java C语言
【Java探索之旅】基本类型与引用类型 数组的应用 二维数组
【Java探索之旅】基本类型与引用类型 数组的应用 二维数组
13 0
|
12天前
|
存储 机器学习/深度学习 Java
【Java探索之旅】数组使用 初探JVM内存布局
【Java探索之旅】数组使用 初探JVM内存布局
26 0
|
12天前
|
存储 Java 编译器
【Java探索之旅】数组概念与初始化指南:动静结合
【Java探索之旅】数组概念与初始化指南:动静结合
22 0