**数组:**是多个相同类型数据按一定的顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理
数组中的概念:
数组的特点:
1、按照元素类型分:
2、按照维度分:
格式:
元素的数据类型[ ] 一维数组的名称
举例:
int[] arr;
double[] arr1;
String[] arr3;//引用类型变量数组
数组的声明,需要明确:
举例:
public class ArrayTest1{
public static void main(String[] args){
//比如,要存储一个小组的成绩
int[] scores;
System.out.println(scores);//未初始化不能使用
//比如,要存储一组姓名
String[] names;
}
}
**注意:**Java语言中声明数组时不能指定其长度(数组中元素的个数)。例如:
int a[5];//错误
数据类型[] 数组名 = 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}; // 错误
数组变量的初始化和数组元素的赋值操作分开进行,即为动态初始化。
动态初始化中,只确定了元素的个数(即数组的长度),而元素值此时只是默认值,还并未真正赋自己期望的值。真正期望的数据需要后续单独一个一个赋值
格式:
数组存储的元素数据类型[] 数组名字 = 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};//错误的,后面有{}指定元素列表,就不需要在[]中指定元素个数了
数组的元素总个数,即数组的长度
每个数组都有一个属性length指明它的长度,例如:arr.length指明数组arr的长度(即元素个数)
每个数组都具有长度,而一旦初始化,其长度就是确定,且是不可变的
如何表示数组中的一个元素?
每个存储到数组的元素,都会自动拥有一个编号,从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开始
}
}
将数组中的每个元素分别取出来,就是遍历。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("]");
}
}
数组是引用类型,当我们使用动态初始化方式创建数组时,元素值只是默认值。例如:
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("]");
}
}
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式
区域名称 | 作用 |
---|---|
虚拟机栈 | 用于存储正在执行的每个Java方法的局部变量表等。局部变量存放了编译期可知长度 的各种数据类型、对象引用,方法执行完,自动释放 |
堆内存 | 存储对象(包括数组对象),new来创建的,都存储在堆内存 |
方法区 | 存储已被虚拟机加载的类信息、常量(静态变量)、即时编译器后的代码等数据 |
本地方法栈 | 当程序中调用了native的本地方法时,本地方法执行期间的内存区域 |
程序计数器 | 程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令地址 |
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]);
}
案例 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();
}
}