目录
数组概述
- 数组(Array),是多个相同类型数据按照以一定顺序排序的集合体,并使用一个名字命名(用变量存储指向堆内存的内存地址),并通过下标从0开始对集合体里面按照顺序存储相同类型的数据进行统一管理.
- 因此数组内的名词有:
- 数组名
- 元素
- 角标(最初最末下标)、下标、索引
- 数组长度==元素个数
- 数组特点:
- 数组属于引用类型变量,用变量存储指向堆内存的内存地址。
- 数组元素可以是相同的基本数据类型,也可以是相同的引用类型
- 数组元素会在内存中开辟一条连续的内存空间,是有序排列的,目的是方便查找
- 数组的长度一旦确认,就不能更改。后面我们学习数组拓展数组时都是将旧数组元素提取出来放到新数组中,然后丢弃旧数组。
- 数组分类:
- 维数分类:一维数组、二维数组等
- 按照元素数组类型分类:基本数据类型数组、引用数据类型数组
(前置知识)JVM内存_方法区、堆、虚拟机栈的简单介绍
一维数组的使用
package javase5;
import java.util.Scanner;
public class Array1 {
static char c1;
public static void main(String[] args) {
int[] intArray = null;//一维数组声明
int[] intArray1 = new int[]{0, 1, 2, 3, 4};//一维数组静态初始化方法1:数组初始化和赋值一同完成
int[] intArray2 = {0, 1, 2, 3, 4};//一维数组静态初始化方法2:数组初始化和赋值一同完成
int[] intArray3 = new int[5];//以为数组静态初始化方法:数组初始化和赋值分开
intArray3[0] = 0;
intArray3[1] = 1;
int length1 = intArray3.length;//5
intArray3[2] = 2;
intArray3[3] = 3;
intArray3[4] = 4;
int length2 = intArray3.length;//5
// intArray3[5] = 5;//超过了数组角标,运行时数组下标越界异常java.lang.ArrayIndexOutOfBoundsException: 5
//遍历数组
//普通for循环
for (int i = 0; i < intArray3.length; i++) {
System.out.print(intArray3[i]);//01234
}
//高效for循环for(遍历出来的数据类型 遍历出来的数据的变量名 : 被遍历的对象){
// 循环体,循环次数为被遍历对象的长度
// }
for (int i : intArray3) {
System.out.print(i);//01234
}
System.out.println('\n' + "----------分割线------------");
/*各种类型数组动态初始化时自身的默认值*/
//int[]
int[] arr1 = new int[4];
for (int i : arr1) {
System.out.print(i);//0000
}
System.out.println('\n' + "----------分割线------------");
//short[]
short[] arr2 = new short[4];
for (int i : arr2) {
System.out.print(i);//0000
}
System.out.println('\n' + "----------分割线------------");
//byte[]
byte[] arr3 = new byte[4];
for (int i : arr3) {
System.out.print(i);
}
System.out.println('\n' + "----------分割线------------");
//float[]
float[] arr4 = new float[4];
for (float i : arr4) {
System.out.print(i);//0.00.00.00.0
}
System.out.println('\n' + "----------分割线------------");
//double
double[] arr5 = new double[4];
for (double i : arr5) {
System.out.print(i);//0.00.00.00.0
}
System.out.println('\n' + "----------分割线------------");
//char[]
char[] arr6 = new char[4];
for (char i : arr6) {
System.out.print(i);//4个都是空串
}
/*char值默认就是空字符,空字符不能直接对比,在用==于基本数据类型对比时空串会转换成0来对比*/
// if(''==0) System.out.println("不能直接对比");//编译错误,空字符文字
if (arr6[0] == 0)System.out.println("char数组里面的元素默认为空串");
System.out.println('\n' + "----------分割线------------");
//String[]
String[] arr7 = new String[4];
for (String i : arr7) {
System.out.print(i);//nullnullnullnull
}
/*
* 2. 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
* 成绩>=最高分-10 等级为’A’
* 成绩>=最高分-20 等级为’B’
* 成绩>=最高分-30 等级为’C’
* 其余等级为’D’
* 提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
*/
//1.使用Scanner,读取学生的个数
Scanner scan = new Scanner(System.in);
System.out.print("请输入学生人数:");
int num = scan.nextInt();
//2.创建数组,存储学生成绩,动态初始化
int[] str = new int[num];
System.out.println("请输入" + num + "个学生成绩");
//3.给数组中的元素赋值
int maxnum = 0;
for(int i = 0;i < str.length;i++){
str[i] = scan.nextInt();
//4.获取数组元素中的最大值:最高分
if(maxnum < str[i]){
maxnum = str[i];
}
}
//5.根据每个学生成绩与最高分的差值,得到每个学生的等级,并输出等级和成绩
char Grade; //成绩等级
for(int i = 0;i < str.length;i++){
if(maxnum - str[i] <= 10){
Grade = 'A';
}else if(maxnum - str[i] <= 20){
Grade = 'B';
}else if(maxnum - str[i] <= 30){
Grade = 'C';
}else{
Grade = 'D';
}
System.out.println("student " + i + "score is" + str[i] +
" grade is " + Grade);
}
}
}
一维数组内存解析
int[] arr = new int[]{1,2,3};
String[] arr1 = new String[4];
arr1[1] = “刘德华”;
arr1[2] = “张学友”;
arr1 = new String[3];
System.out.println(arr1[1]);//null