第05章 数组

news/2024/11/16 14:57:31/

在这里插入图片描述

一 数组的概述

1.1 为什么需要数组

需求分析1:

需要统计某公司50个员工的工资情况,例如计算平均工资、找到最高工资等。用之前知识,首先需要声明50个变量来分别记录每位员工的工资,这样会很麻烦。因此我们可以将所有的数据全部存储到一个容器中统一管理,并使用容器进行计算。

需求分析2:
在这里插入图片描述
容器的概念:

  • 生活中的容器:水杯(装水等液体),衣柜(装衣服等物品),集装箱(装货物等)。
  • 程序中的容器:将多个数据存储到一起,每个数据称为该容器的元素。

1.2 数组的概念

  • 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

  • 数组中的概念

    • 数组名
    • 下标(或索引)
    • 元素
    • 数组的长度
      在这里插入图片描述
      数组的特点:
  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。

  • 创建数组对象会在内存中开辟一整块连续的空间。占据的空间的大小,取决于数组的长度和数组中元素的类型。

  • 数组中的元素在内存中是依次紧密排列的,有序的。

  • 数组,一旦初始化完成,其长度就是确定的。数组的长度一旦确定,就不能修改

  • 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。

  • 数组名中引用的是这块连续空间的首地址。

1.3 数组的分类

1、按照元素类型分:

  • 基本数据类型元素的数组:每个元素位置存储基本数据类型的值
  • 引用数据类型元素的数组:每个元素位置存储对象(本质是存储对象的首地址)(在面向对象部分讲解)
    2、按照维度分:
  • 一维数组:存储一组数据
  • 二维数组:存储多组数据,相当于二维表,一行代表一组数据,只是这里的二维表每一行长度不要求一样。
    在这里插入图片描述

二 一维数组的使用

2.1 一维数组的声明

格式:

//推荐
元素的数据类型[] 一维数组的名称;
//不推荐
元素的数据类型  一维数组名[];

举例:

int[] arr;
int arr1[];
double[] arr2;
String[] arr3;  //引用类型变量数组

数组的声明,需要明确:

(1)数组的维度:在Java中数组的符号是[],[]表示一维,[][]表示二维。

(2)数组的元素类型:即创建的数组容器可以存储什么数据类型的数据。元素的类型可以是任意的Java的数据类型。例如:int、String、Student等。

(3)数组名:就是代表某个数组的标识符,数组名其实也是变量名,按照变量的命名规范来命名。数组名是个引用数据类型的变量,因为它代表一组数据。

举例:

public class ArrayTest1 {public static void main(String[] args) {//比如,要存储一个小组的成绩int[] scores;int grades[];
//      System.out.println(scores);//未初始化不能使用//比如,要存储一组字母char[] letters;//比如,要存储一组姓名String[] names;//比如,要存储一组价格double[] prices;}
}

注意:Java语言中声明数组时不能指定其长度(数组中元素的个数)。 例如: int a[5]; //非法

2.2 一维数组的初始化

2.2.1 静态初始化

  • 如果数组变量的初始化和数组元素的赋值操作同时进行,那就称为静态初始化。

  • 静态初始化,本质是用静态数据(编译时已知)为数组初始化。此时数组的长度由静态数据的个数决定。

  • 一维数组声明和静态初始化格式1:

数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,...};
或    
数据类型[] 数组名;
数组名 = new 数据类型[]{元素1,元素2,元素3,...};
  • new:关键字,创建数组使用的关键字。因为数组本身是引用数据类型,所以要用new创建数组实体。
    例如,定义存储1,2,3,4,5整数的数组容器。
int[] arr = new int[]{1,2,3,4,5};//正确
//或
int[] arr;
arr = new int[]{1,2,3,4,5};//正确
  • 一维数组声明和静态初始化格式2:
数据类型[] 数组名 = {元素1,元素2,元素3...};//必须在一个语句中完成,不能分成两个语句写

例如,定义存储1,2,3,4,5整数的数组容器

int[] arr = {1,2,3,4,5};//正确int[] arr;
arr = {1,2,3,4,5};//错误

举例:

public class ArrayTest2 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};//右边不需要写new int[]int[] nums;nums = new int[]{10,20,30,40}; //声明和初始化在两个语句完成,就不能使用new int[]char[] word = {'h','e','l','l','o'};String[] heros = {"袁隆平","邓稼先","钱学森"};System.out.println("arr数组:" + arr);//arr数组:[I@1b6d3586System.out.println("nums数组:" + nums);//nums数组:[I@4554617cSystem.out.println("word数组:" + word);//word数组:[C@74a14482System.out.println("heros数组:" + heros);//heros数组:[Ljava.lang.String;@1540e19d}
}

2.2.2 动态初始化

数组变量的初始化和数组元素的赋值操作分开进行,即为动态初始化。

动态初始化中,只确定了元素的个数(即数组的长度),而元素值此时只是默认值,还并未真正赋自己期望的值。真正期望的数据需要后续单独一个一个赋值。

格式:

数组存储的元素的数据类型[] 数组名字 = new 数组存储的元素的数据类型[长度];
或
数组存储的数据类型[] 数组名字;
数组名字 = new 数组存储的数据类型[长度];
  • [长度]:数组的长度,表示数组容器中可以最多存储多少个元素。

  • 注意:数组有定长特性,长度一旦指定,不可更改。和水杯道理相同,买了一个2升的水杯,总容量就是2升是固定的。

举例1:正确写法

int[] arr = new int[5];
int[] arr;
arr = new int[5];

举例2:错误写法

int[] arr = new int[5]{1,2,3,4,5};//错误的,后面有{}指定元素列表,就不需要在[]中指定元素个数了。

2.3 一维数组的使用

2.3.1 数组的长度

  • 数组的元素总个数,即数组的长度
  • 每个数组都有一个属性length指明它的长度,例如:arr.length 指明数组arr的长度(即元素个数)
  • 每个数组都具有长度,而且一旦初始化,其长度就是确定,且是不可变的。

2.3.2 数组元素的引用

如何表示数组中的一个元素?
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index)或下标,可以通过数组的索引/下标访问到数组中的元素。

数组名[索引/下标]

数组的下标范围?

Java中数组的下标从[0]开始,下标范围是[0, 数组的长度-1],即[0, 数组名.length-1]

数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];

举例

public class ArrayTest3 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println("arr数组的长度:" + arr.length);System.out.println("arr数组的第1个元素:" + arr[0]);//下标从0开始System.out.println("arr数组的第2个元素:" + arr[1]);System.out.println("arr数组的第3个元素:" + arr[2]);System.out.println("arr数组的第4个元素:" + arr[3]);System.out.println("arr数组的第5个元素:" + arr[4]);//修改第1个元素的值//此处arr[0]相当于一个int类型的变量arr[0] = 100;System.out.println("arr数组的第1个元素:" + arr[0]);}
}

2.4 一维数组的遍历

将数组中的每个元素分别获取出来,就是遍历。for循环与数组的遍历是绝配。
举例1

public class ArrayTest4 {public static void main(String[] args) {int[] arr = new int[]{1,2,3,4,5};//打印数组的属性,输出结果是5System.out.println("数组的长度:" + arr.length);//遍历输出数组中的元素System.out.println("数组的元素有:");for(int i=0; i<arr.length; i++){System.out.println(arr[i]);}}
}

举例2

public class ArrayTest5 {public static void main(String[] args) {int[] arr = new int[5];System.out.println("arr数组的长度:" + arr.length);System.out.print("存储数据到arr数组之前:[");for (int i = 0; i < arr.length; i++) {if(i==0){System.out.print(arr[i]);}else{System.out.print("," + arr[i]);}}System.out.println("]");//初始化/* arr[0] = 2;arr[1] = 4;arr[2] = 6;arr[3] = 8;arr[4] = 10;*/for (int i = 0; i < arr.length; i++) {arr[i] = (i+1) * 2;}System.out.print("存储数据到arr数组之后:[");for (int i = 0; i < arr.length; i++) {if(i==0){System.out.print(arr[i]);}else{System.out.print("," + arr[i]);}}System.out.println("]");}
}

2.5 数组元素的默认值

数组是引用类型,当我们使用动态初始化方式创建数组时,元素值只是默认值。例如:

public class ArrayTest6 {public static void main(String argv[]){int a[]= new int[5]; System.out.println(a[3]); //a[3]的默认值为0}
} 

对于基本数据类型而言,默认初始化值各有不同。
对于引用数据类型而言,默认初始化值为null(注意与0不同!)
在这里插入图片描述

public class ArrayTest7 {public static void main(String[] args) {//存储26个字母char[] letters = new char[26];System.out.println("letters数组的长度:" + letters.length);System.out.print("存储字母到letters数组之前:[");for (int i = 0; i < letters.length; i++) {if(i==0){System.out.print(letters[i]);}else{System.out.print("," + letters[i]);}}System.out.println("]");//存储5个姓名String[] names = new String[5];System.out.println("names数组的长度:" + names.length);System.out.print("存储姓名到names数组之前:[");for (int i = 0; i < names.length; i++) {if(i==0){System.out.print(names[i]);}else{System.out.print("," + names[i]);}}System.out.println("]");}
}

三 一维数组内存分析

3.1 Java虚拟机的内存划分

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
在这里插入图片描述

区域名称作用
虚拟机栈用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度
的各种基本数据类型、对象引用,方法执行完,自动释放。
堆内存存储对象(包括数组对象),new来创建的,都存储在堆内存。
方法区存储已被虚拟机加载的类信息、常量、(静态变量)、即时编译器编译后的代码等数据。
本地方法栈当程序中调用了native的本地方法时,本地方法执行期间的内存区域
程序计数器程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址

3.2 一维数组在内存中的存储

3.2.1 一个一维数组内存图

public static void main(String[] args) {int[] arr = new int[3];System.out.println(arr);//[I@5f150435
}

在这里插入图片描述

3.2.2 数组下标为什么是0开始

因为第一个元素距离数组首地址间隔0个单元格。

3.2.3 两个一维数组内存图

两个数组独立

public static void main(String[] args) {int[] arr = new int[3];int[] arr2 = new int[2];System.out.println(arr);System.out.println(arr2);
}

在这里插入图片描述

2.2.4 两个变量指向一个一维数组

两个数组变量本质上代表同一个数组。

public static void main(String[] args) {// 定义数组,存储3个元素int[] arr = new int[3];//数组索引进行赋值arr[0] = 5;arr[1] = 6;arr[2] = 7;//输出3个索引上的元素值System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);//定义数组变量arr2,将arr的地址赋值给arr2int[] arr2 = arr;arr2[1] = 9;System.out.println(arr[1]);
}

在这里插入图片描述

四 一维数组的应用

案例1:升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。

public class ArrayTest {public static void main(String[] args) {int[] arr = new int[]{8,2,1,0,3};int[] index = new int[]{2,0,3,2,4,0,1,3,2,3,3};String tel = "";for(int i = 0;i < index.length;i++){tel += arr[index[i]];}System.out.println("联系方式:" + tel);}
}

案例2:输出英文星期几
用一个数组,保存星期一到星期天的7个英语单词,从键盘输入1-7,显示对应的单词
{“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”}

public class WeekArrayTest {public static void main(String[] args) {//1. 声明并初始化星期的数组String[] weeks = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};//2. 使用Scanner从键盘获取1-7范围的整数Scanner scanner = new Scanner(System.in);System.out.println("请输入[1-7]范围的整数:");int number = scanner.nextInt();if(number < 1 || number > 7){System.out.println("你输入的输入非法");}else{//3. 根据输入的整数,到数组中相应的索引位置获取指定的元素(即:星期几)System.out.println("对应的星期为:" + weeks[number - 1]);}scanner.close();}
}

案例3:从键盘读入学生成绩,找出最高分,并输出学生成绩等级。

  • 成绩>=最高分-10 等级为’A’

  • 成绩>=最高分-20 等级为’B’

  • 成绩>=最高分-30 等级为’C’

  • 其余 等级为’D’

提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
在这里插入图片描述

public class ScoreTest1 {public static void main(String[] args) {//1. 根据提示,获取学生人数System.out.print("请输入学生人数:");Scanner scanner = new Scanner(System.in);int count = scanner.nextInt();//2. 根据学生人数,创建指定长度的数组 (使用动态初始化)int[] scores = new int[count];//3. 使用循环,依次给数组的元素赋值int maxScore = 0; //记录最高分System.out.println("请输入" + count + "个成绩");for (int i = 0; i < scores.length; i++) {scores[i] = scanner.nextInt();//4. 获取数组中元素的最大值,即为最高分if(maxScore < scores[i]){maxScore = scores[i];}}System.out.println("最高分是:" + maxScore);//5. 遍历数组元素,输出各自的分数,并根据其分数与最高分的差值,获取各自的等级char grade;for (int i = 0; i < scores.length; i++) {if(scores[i] >= maxScore - 10){grade = 'A';}else if(scores[i] >= maxScore - 20){grade = 'B';}else if(scores[i] >= maxScore - 30){grade = 'C';}else{grade = 'D';}System.out.println("student " + i + " socre is " + scores[i] + ", grade is " + grade);}//关闭资源scanner.close();}
}

http://www.ppmy.cn/news/240378.html

相关文章

HashMap ConcurrentModificationException

HashMap ConcurrentModificationException 前言 有一个应用场景&#xff0c;需要多线程访问同一HashMap&#xff0c;其中线程一只作遍历查询&#xff0c;线程二进行添加、修改或删除&#xff0c;在实际使用过程中遇到了ConcurrentModificationException的并发修改异常。 分析…

vim常见使用方法记录

一、文件查找 1.从开头处搜索 将vim调整为命令模式 假如查找字符串为“model”&#xff0c;在vim中键入命令&#xff1a;“/model” 按下回车&#xff0c;看到vim从头开始所要查找的字符"model"都被高亮显示 键入小写"n"查看下一个匹配的字符串 键入大写…

数据共享传输:台式机和笔记本同步文件!

为什么要在台式机和笔记本同步文件&#xff1f; “我想在台式机和笔记本同步文件。因为我工作时使用笔记本&#xff0c;在家里使用安装了Windows 10系统的台式机&#xff0c;我想要在笔记本和台式机之间同步应用程序、游戏、文档等。有没有一种可以在台式机和笔记本同步文件的…

ChatGPT中文版提示词学习手册, 学完工作效率提升百倍!

既然你对ChatGPT及其功能有了⼀些了解&#xff0c;让我们更深入地了解⼀下ChatGPT是什么以及它是如何工作的。 那么ChatGPT是如何工作的呢&#xff1f;在高层次上&#xff0c;这个过程可以分解为以下步骤&#xff1a; 1. 用户将文本输入ChatGPT界面。这可能是一个问题&#xf…

分享一款程序员起名神器,让你从此起名不再头秃

大家好&#xff0c;我是大目。最近偶然发现一款程序员起名神器&#xff0c;非常好用&#xff0c;推荐给大家。 素材发到视频号了&#xff0c;新号成立&#xff0c;欢迎点赞、收藏、关注、讨论。

华字后面配什么字比较好_华字起名配什么字好

华字读音是hu&#xff0c;起名笔画数是14划&#xff0c;五行属水。华字起名配什么字好&#xff1f;华字比较适合做女孩名字。华字为女孩起名&#xff0c;可取名华源&#xff0c;桦华&#xff0c;柏华&#xff0c;逢华&#xff0c;华章。 华字&#xff0c;象征光辉、生华&#x…

在线付费起名源码/宝宝起名/八字起名/周易取名/周易八字起名平台网站源码

宝宝起名/八字起名/周易取名/周易八字起名平台网站/在线付费起名源码&#xff0c;thinkphp框架开发周易八字起名网宝宝起名在线下单网站源码自适应可二开&#xff0c;PHP权威起名策划机构平台源码&#xff0c;Thinkphp3.2给宝宝起名在线算命网站站码之家源码&#xff0c;宝宝取…

【随便起的名字】

闲话 这个标题我不知道怎么写好&#xff0c;所以暂时不写题目&#xff0c;很像那种写作文先写内容后写题目的人。暂且认为我就是这种人吧。 面试 面试情况 首先说一下实习的感受&#xff0c;不是很严格的计算&#xff0c;实习了也近两个月了。出去实习是我2019年最后一个愿…