一、数组概述
1.概念:
(1)相同类型的集合
(2)按顺序存放
(3)用编号进行管理
(4)用一个名字命名
生动的例子:美团上点餐的界面
相关名词:数组名,元素,角标(索引),长度
2.特点:
(1)数组是引用数据类型,数组里面的元素可以是基本数据类型和引用数据类型
(2)创建数组是在内存中开辟一块连续的空间
(3)长度一旦确定,就不可以修改(若不够,只能再添加一个新的)
(4)数组是有序排列的
3.分类:
(1)按维数:一维,二维.....
(2)按数组元素类型:基本数据类型、引用数据类型
二、关于一位数组的使用说明:
1.一维数组的声明和初始化
//1.数组声明和初始化分开进行
//声明格式如下:数组元素类型 [] 数组名;
int [] name;
//初始化格式如下:有静态和动态之分
//静态初始化: 数组名=new 数组元素类型 {};即表示数组元素初始化的赋值操作同时进行
name=new int[] {1,2,3,4};
//动态初始化: 数组名=new 数组元素类型 [长度];即表示数组元素初始化的赋值操作分别进行
name=new int[10];
//2.数组声明和初始化同时进行
int [] names=new int[10];//或者 int [] names=new int{2,3,4,};
System.out.println(name[2]);
注意:上面图片中的第2点写错啦 int 【】names=new int【】{1,2,3,4};【】漏掉咯
注意:一旦初始化完成,其长度就确定了
2.如何调用数组指定位置的元素
(1)通过角标的方式,数组角标从0开始,到n-1结束
(2)具体格式
String names[]=new String[3];
names[0]="hei";
names[1]="he";
names[2]="he";
(3)注意:假如下标超过n-1时,编译不会报错(语法没问题,new string是动态的,察觉不出来),但是运行会报错
3.获取数组长度
格式:names.length
4.如何遍历数组元素
多种格式
(1)用静态初始化
String names[]=new String[] {"y","x","c"};
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
(2)还可以静态不用new
String names[]= {"y","x","c"};
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
(3)用动态但是要额外赋值,不赋值输出会为null
String names[]= new String[2];
names[0]="y";
names[1]="x";
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
5.数组元素的默认初始化值
(1)数组元素是整形:默认为0;
(2)浮点型:默认为0.0
(3)string:默认为null
(4)char:0 注意不是‘0’,是对应的ascll码值为0,输出来的效果有点像空格不显示,可以去判断若char【0】==0 输出***,则可以通过是否输出***来判断
(5)boolean型,默认为false
6.数组的内存解析
一位数组的内存解析详述:
1.第一行代码 int【】arr=new int【】{1,2,3}
首先,arr是main方法里面的属于局部变量,因此为栈空间里面的,后面的为new结构的为堆,然后堆里面的通过传递首地址给栈,使得两者有联系,原先堆里面的值默认为0,又因为是静态初始化附带赋值操作,所以值变为1,2,3
2.第二行代码 string 【】arr1=new string【4】;arr1【1】=“刘德华”;arr【2】=“张学友”
首先判断同上,arr1为栈,new为堆,传递首地址0x12ab,默认值为null,后因赋值第二三个元素的值,所以相应的null值会改变
3.arr1=new string【3】
看到new就要开辟一块新的堆空间,将新的string附给arr1,会传递新的首地址,因此原本的会作废,并且动态初始化未赋值,所以输出只会是null
一位数组的练习题:
我的答案:18013820100
注意:那个tel是string类型的,故后面的+不是表示加法意义,而是连接意义
练习二
解题思路:
提示:
(1)写Scanner scanner=new Scanner(syetem.in)的时候回报错,用快捷加ctrl shift+o会更快,当然也可以点报错的那里
(2)在代码中间想要快速换行,按shift+enter更快;按住crtl shift+enter会空出上一行,同理想删除一行,按住shift+backpace
package pratice3_12;
import java.util.Scanner;
public class Pratice3_12 {
public static void main(String[] args) {
// 先整理思路:
Object system;
// 1.先读取学生个数,利用scanner
//2.创立学生成绩数组,动态,也是利用scanner
//3.遍历成绩数组,定义最高分,找到最大值
//4.找到最大值后根据关系仍然去遍历输出最后格式和等级
Scanner s = new Scanner(System.in);// 记住System的首字母大写
System.out.println("请输入学生人数");
int num = s.nextInt();
int[] score = new int[num];
int MaxScore = 0;
char grade = 0;
System.out.println("请输入学生成绩");
for (int i = 0; i < score.length; i++) {
score[i] = s.nextInt();
if (MaxScore < score[i]) {
MaxScore = score[i];
}
}
System.out.println("最高分为"+MaxScore);
for (int i = 0; i < score.length; i++) {
if(MaxScore-score[i]<=10) {
grade='A';
}else if(MaxScore-score[i]<=20){
grade='B';
}else if(MaxScore-score[i]<=30){
grade='C';
}else if(MaxScore-score[i]<=40){
grade='D';
}
System.out.println("student"+i+" "+"成绩为"+score[i]+" "+"等级为"+grade);
}
}
}
整理:这个题目很简单,但是对于我来说还是理解了好一会儿,尤其是昨天刚上机写过今天再写一次输入函数和遍历那些还是有些不熟悉,果然是要多多练习啊