【天天Java系列】04_数组_一维数组

1.数组的概述

1.1 数组的概念

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

  • 数组名
  • 下标(或索引)
  • 元素
  • 数组的长度
    在这里插入图片描述

数组的特点:

  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
  • 创建数组对象会在内存中开辟一整块连续的空间。占据的空间的大小,取决于数组的长度和数组中元素的类型
  • 数组中的元素在内存中是依次紧密排列的、有序的
  • 数组,一旦初始化完成,其长度就是确定的,数组的长度一旦确定,就不能修改
  • 我们可以直接通过下标(或索引)的方式调用指定位置的元素
  • 数组名中引用的是这块连续空间的首地址

1.2 数组的分类

1、按照元素类型分:

  • 基本数据类型元素的数组:每个元素位置存储基本数据类型的值
  • 引用数据类型元素的数组:每个元素位置存储对象(本质是存储对象的首地址)

2、按照维度分:

  • 一维数组:存储一组数据
  • 二维数组:存储多组数据,相当于二维表,一行代表一组数据,只是这里的二维表每一行长度不要求一样

在这里插入图片描述

2.一维数组的使用

2.1 一维数组的声明

格式:
元素的数据类型[ ] 一维数组的名称
举例:

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

数组的声明,需要明确:

  1. 数组的维度:在Java中数组的符号是[],[]表示一维,[][]表示二维
  2. 数组的元素类型:即创建的数组容器可以存储什么数据类型的数据。元素的类型可以是任意的Java的数据类型。如:int、String、Student
  3. 数组名:就是代表某个数组的标识符,数组名其实也是变量名,按照变量的命名规范来命名。数组名是个引用数据类型的变量,因为它代表一组数据

举例:

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

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

2.2 一维数组的初始化

2.2.1 静态初始化

  • 如果数组的初始化和数组元素的赋值操作同时进行,那就称为静态初始化
  • 静态初始化,本质时用静态数据(编译时已知)为数组初始化。此时数组的长度由长度静态数据的个数决定
  • 一维数组声明和静态初始化格式1:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2.....};
或
数据类型[] 数组名;
数组名 = new 数据类型[]{元素1,元素2......};
	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,…};//必须在一个语句中完成,不能分成两个语句写

例如,定义存储1,2,3整数的数组容器
int[] arr = {1,2,3}; //正确
int[] arr;
arr = {1,2,3}; // 错误

2.2.2 动态初始化

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

格式:
数组存储的元素数据类型[] 数组名字 = new 数组存储的元素的数据类型长度;

数组存储的数据类型[] 数组名字;
数组名字 = new 数组存储的数据类型长度;

**注意:**数组有定长特性,长度一旦指定,不可更改

举例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[2*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]);//下标从0开始
	}
}

		

2.4 一维数组的遍历

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

举例1

public class ArrayTest4{
	public static void main(String[] args){
		int[] arr = new int[]{1,2,3,4,5};
		System.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("]");
		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[] agrs){
		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.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.一维数组内存分析

3.1 Java虚拟机的内存划分

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

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

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

1、一个一维数组内存图

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

在这里插入图片描述
2、数组下标为什么是0开始
因为第一个元素距离数组首地址间隔0个单元格
3、两个一维数组内存图

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

在这里插入图片描述
4、两个变量指向一个一维数组
两个数组变量本质上同一个数组。

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

	

在这里插入图片描述

4.一维数组的应用

案例 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”}

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

案例 3:从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
• 成绩>=最高分-10 等级为’A’
• 成绩>=最高分-20 等级为’B’
• 成绩>=最高分-30 等级为’C’
• 其余 等级为’D’
提示:先读入学生人数,根据人数创建 int 数组,存放学生成绩

public class ScoreTest1{
	public static void main(String[] args){
		System.out.print("请输入学生人数:");
		Scanner scan = new Scanner(System.in);
		int count = scan.nextInt();
		int[] scores = new int[count];
		int max = 0;
		System.out.println("请输入" + count + "学生成绩");
		for(int i = 0;i < scores.length;i++){
			scores[i] = scan.nextInt();
			System.out.println(scores[i]);
			if(max < scores[i]){
				max = scores[i];
			}
		}
		System.out.println("最高分是:" + max);
		char[] grades = new char[count];
		for(int i = 0;i < grades.length;i++){
			if(max - scores[i] <= 10){
				grades[i] = 'A';
			}else if  (max - scores[i] <= 20){
				grades[i] = 'B';
			}else if  (max - scores[i] <= 30){
				grades[i] = 'C';
			}else{
				grades[i] = 'D';
			}
		
		}
		for(int i = 0;i < scores.length;i++){
			System.out.println("student " + i + " is " + scores[i] + " grade " + grades[i]);
		}
		scan.close();
	}
} 
			
		
		
		
		
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lanbabela

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值