1、数组是什么?
数组就是用来存储一批同种类型数据的内存区域(可以理解成容器)。
2、为什么要使用数组捏?
- 代码繁琐:大量的变量定义
- 业务功能实现很麻烦
- 单一值类型变量有时候很难满足应用程序的设计要求。
- 数组类型变量可以同时存储多个同类型基础数据类型变量或对象。
3、对于数组我们应该学会什么?
- 如何定义数组存储数据?
- 怎么操作数组元素?
- 怎么解决实际问题?
- 数组的内存原理?
- 数组使用的注意点。
4、数组的特点:
1、只能存放同一数据类型的数据;
2、所有元素数据存放在连续内存空间中;
3、数组大小一旦确定,不能更改。
4、数组通过索引进行区分,数组中的第一个元素的索引为0,最后一个元素索引为数组长度-1。
5、数组在内存中是地址连续的一串空间。
6、数组元素都是变量。元素类型为定义数组类型。
7、数组变量存放的是连续空间首地址。
8、数组创建后,每个元素都会做初始化。int——0 double——0.0 引用类型——null
5、数组定义方式one
静态初始化数组:
定义数组时直接给数组赋值。
格式:
// 数据类型[] 数据名称 = new 数据类型[] { 元素1,元素2,......} //double [] scores = new double[] {99.5 , 88.0 , 75.5 } ; double [] scores = {99.5 , 88.0 , 75.5 } ;// 简化写法 //int [] age = new int[] {12 , 24 , 36} ; int [] age = {12 , 24 , 36} ; // 目标:理解数组的注意事项。 // 1、 数据类型[] 数组名称 也可以写成 数据类型 数组名称 [] 。 int [] ages = {11 , 23 , 45}; int ages1 [] = {11 , 23 , 45}; // 2、 什么类型的数组只能存放什么类型的元素。 // String [] names = {"西门吹雪" , "孤独求败" , 23}; // 错误! // 3、 数组一旦定义出来后,类型和长度就固定了。 int [] ages2 = {11 , 23 , 45}; System.out.println(ages2[3]); // 报错!:长度固定是3了,不能访问第4个元素!!
访问数组的元素:
数组中的元素通过用对该数组的变量名(引用)加上一个用于描述我们要访问数组哪一个元素的整型索引值来访问。
// 目标:学会访问数组的元素。 int [] ages = {12 , 24 , 36 }; // 0 1 2 // 取值: 数组名称[常识] System.out.println(ages[0]);//12 System.out.println(ages[1]);//24 System.out.println(ages[2]);//36 // 赋值: 数组名称[索引] = 数据; ages[2] = 100 ; System.out.println(ages[2]);//100 //访问数组的长度 System.out.println(ages.length);//3 //数组的最大索引怎么表示? 数组名.length - 1 //前提:元素个数大于0
6、数组定义方式two
动态初始化数组:
使用new关键字初始化数组,并指定数组大小。
定义数组时,只确定元素的类型和数组的长度,之后再存入具体数据。
格式:
// 当前已经知道存入的元素值,用静态初始化。;当前不知道要存入的数据,用动态初始化。 // 目标:学会动态初始化数组的定义和使用。 // 定义数组时候只确定元素的类型和数组的长度,之后再存入具体数据。 // 动态初始化写法:数据类型[] 数组名 = new 数据类型[长度]; double [] scores = new double[3] ; // {0.0 , 0.0 , 0.0} // 0 1 2 //赋值: scores[0] = 99.5; System.out.println(scores[0]); System.out.println(scores[2]); // 不赋值会采用默认值。 String[] names = new String[90] ; names[0] = "189191"; names[2] = "马儿扎哈5661"; System.out.println(names[0]); System.out.println(names[1]); // null 是String类型的默认值。 System.out.println(names[2]);
两种数组定义时的特点和场景的区别:
- 当前已经知道存入的元素值,使用静态初始化
- 当前还不知道要存入哪些元素数据,使用动态初始化
掌握动态初始化元素默认值的规则:
//1、整型数组的元素默认值都是0. int[] arr = new int [10]; System.out.println(arr[0]); System.out.println(arr[9]); //2、字符char数组的元素默认值是多少呢? 0 ; char[] chars = new char[100] ; System.out.println((int)chars[0]); System.out.println((int)chars[99]); //3、浮点型数组的元素默认值 是0.0 。 double [] scores = new double[90]; System.out.println(scores[0]); System.out.println(scores[89]); //4、布尔型数组元素默认值为false。 boolean[] booleans = new boolean[100] ; System.out.println(booleans[0]); System.out.println(booleans[99]); //5、引用类型的元素默认值为null。 String[] names = new String[100] ; System.out.println(names[0]); System.out.println(names[99]);
7、数组的遍历
- 遍历:就是一个一个数据的访问。
- 为什么要遍历?因为搜索、数据统计等都需要用到遍历。
// 目标:学会进行数组元素的遍历 // 什么是遍历?:一个一个把数据访问一遍。 int [] arr = {12 , 24 , 12 , 48 , 98} ; // 0 1 2 3 4 for (int i = 0 ; i < 5 ; i++){ System.out.println(arr[i]); } // 终极数组遍历形式: for (int i = 0 ; i < arr.length ; i++){ System.out.println(arr[i]); } //原始遍历方式 // System.out.println(arr[0]); // System.out.println(arr[1]); // System.out.println(arr[2]); // System.out.println(arr[3]); // System.out.println(arr[4]);
8、数组的长度:
- 因为数组对象的内存空间是连续的。所以在分配空间的时候必须知道数组的长度。而一旦分配好后就不能修改了。
- 在使用访问数组元素时,特别要注意,不要超出数组所分配的空间。否则会出现运行时异常:ArrayIndexOutOfBoundsException(数组下标越界异常)。
- Java语言的数组与其它语言的数组的不同之处在于:Java中的数组是对象。这样做的好处之一为:Java中的每个数组都有一个length属性来代表数组的大小,可以极大地减少数组访问越界的可能性。
小练习:
实现ATM的多用户登录
1 创建一个User类
包括属性有 1 卡号 字符串类型
2 密码 字符串类型
3 账上余额 double 类型
2 创建一个存放User数组 存放 5个用户
3 创一个ATM类 类中有一个登录的方法。登录方法需传入User数组 ,并返回登录用户的下标即可。用户类:
public class AtmUser { public String id; //卡号 public String password;//密码 public double money;//卡上余额 public String userName;//用户名 public AtmUser() { } public AtmUser(String id, String password , double money,String userName) { this.id = id; this.password = password; this.money = money; this.userName = userName; }
ATM类:
public class Test2Atm { public static void main(String[] args) { //创建一个存放用户的数组(五个用户) AtmUser [] atmUsers = new AtmUser[5]; AtmUser atmUser1 = new AtmUser("admin1","123456",1000,"张三"); AtmUser atmUser2 = new AtmUser("admin2","123456",3000,"李四"); AtmUser atmUser3 = new AtmUser("admin3","123456",5000,"王五"); AtmUser atmUser4 = new AtmUser("admin4","123456",7000,"小黑"); AtmUser atmUser5 = new AtmUser("admin5","123456",9000,"小白"); atmUsers[0] = atmUser1; atmUsers[1] = atmUser2; atmUsers[2] = atmUser3; atmUsers[3] = atmUser4; atmUsers[4] = atmUser5; for (int i = 0; i < atmUsers.length; i++) { System.out.println(atmUsers[i].id + "\t" +atmUsers[i].money); } /*System.out.println("欢迎来到登录界面"); Scanner sc = new Scanner(System.in); System.out.println("请输入您的卡号:"); String userId = sc.next(); System.out.println("请输入您的密码:"); String userPassWord = sc.next(); index(atmUsers,userId,userPassWord);*/ getIndex(atmUsers); } //登录方法 /* public static void index (AtmUser [] atmUsers,String userId , String userPassWord){ //定义一个临时变量接登录用户的下标 int index = 0; for (int i = 0; i < atmUsers.length; i++) { AtmUser atmUser = atmUsers[i]; if (atmUser.id.equals(userId) && atmUser.password.equals(userPassWord)) { //登陆成功 System.out.println("登陆成功!" + "您的账户余额为:" + atmUser.money); index = i; System.out.println("该用户用户名为" + atmUser.id + ",下标为:" + index); break; } } if (index == 0){ System.out.println("您输入的用户名或密码有误。"); } }*/ //登陆方法:(死循环) public static void getIndex (AtmUser [] atmUsers){ //定义一个临时变量接登录用户的下标 int index = 0; while (true) { System.out.println("欢迎来到登录界面"); Scanner sc = new Scanner(System.in); System.out.println("请输入您的卡号:"); String userId = sc.next(); System.out.println("请输入您的密码:"); String userPassWord = sc.next(); for (int i = 0; i < atmUsers.length; i++) { AtmUser atmUser = atmUsers[i]; if (atmUser.id.equals(userId) && atmUser.password.equals(userPassWord)) { //登陆成功 System.out.println("登陆成功!" + "您的账户余额为:" + atmUser.money); index = i; System.out.println("该用户用户名为" + atmUser.id + ",下标为:" + index); break; } } if (index == 0) { System.out.println("您输入的用户名或密码有误。"); }else{ break; } } } }
9、多维数组:
- 在Java中,我们还可以创建多维的数组。
- 与一维数组一样,多维数组也是对象,需要一个引用。 语法也可以从一维数组过度而来:
一维数组:int[] a = new int[5];
二维数组:int[][] b = new int[5][5];
三维数组:int[][][] c = new int[5][5][5];
依次类推……
代码演示:
//创建一个一维数组 int [] nums = new int[5]; //创建一个二维数组 //第一个3表示3行; // 第二个3表示3列 //二维数组可以理解为一个行和列的一个数组 int [] [] arr = new int[3][3]; //获取第二行第二列的值 arr[1][1] = 10; Scanner sc = new Scanner(System.in); System.out.println(arr.length);//3 //当使用 二维数组时 数组.length 得到的是行数 //获取列数的长度 System.out.println(arr[0].length);//3 //往二维数组里存值 for (int i = 0; i < arr.length; i++) { System.out.println("请输入第" + (i+1) + "行的数据"); for (int j = 0; j < arr[i].length; j++) { System.out.println("请输入第" + (i+1) + "行,第" + (j+1) + "的数据"); arr[i][j] = sc.nextInt(); } } //输出输入的结果 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + " "); } System.out.println(""); }
小练习:
输入三个同学的 语文,数学,英文的分数。计算出,分别打印每位同学与每门学科的总分与平均分。
/* 输入三个同学的 语文,数学,英文的分数 计算出,三位同学的 总分 平均。 */ double sum = 0;//总分 double [] [] grades = new double[3][3]; for (int i = 0; i < grades.length; i++) { int studentSum = 0; System.out.println("请输入第" + (i+1) + "个同学成绩(语文、数学、英语)"); for (int j = 0; j < grades[i].length; j++) { System.out.println("请输入第" + (i+1) + "个同学的第" + (j+1) + "门的成绩"); grades[i][j] = sc.nextDouble(); studentSum += grades[i][j]; sum += grades[i][j]; } System.out.println("第" + (i+1) + "位同学的总成绩为:" + studentSum); System.out.println("第" + (i+1) + "位同学的平均成绩为:" + studentSum / grades[0].length); } //输出输入的结果 System.out.println("语文" + "\t\t" + "数学" + "\t\t" + "英语" + "\t\t"); for (int i = 0; i < grades.length; i++) { for (int j = 0; j < grades[i].length; j++) { System.out.print(grades[i][j] + "\t"); } System.out.println(""); } System.out.println("三位同学总分是:" + sum); System.out.println("三位同学平均分是:" + sum/(grades.length * grades[0].length)); /* 每个学科的总成绩 */ //1、定义一个学科的数组 double [] subjectSum = new double[3]; for (int i = 0; i < subjectSum.length; i++) { for (int j = 0; j < grades[i].length; j++) { subjectSum[i] += grades[j][i]; } } /* 打印每个学科的总成绩和平均分 */ for (int i = 0; i < subjectSum.length; i++) { System.out.println("第" + (i+1) + "门学科的总成绩为:" + subjectSum[i] + "此学科平均成绩为:" + (String.format("%.2f",subjectSum[i] / 3)));//、如何保留两位小数的方法:String.format("%.2f",f) }
java如何保留两位小数:
使用
java.math.BigDecimal
使用
java.text.DecimalFormat
使用
java.text.NumberFormat
使用
java.util.Formatter
使用
String.format
一dian小知识:
- 获取字符串中的第几个元素
- 字符串转换成字符数组
- 字符数组转换成字符串
- 字符串的比较不能使用==,而应该使用equals方法
程序实现如下:
//一个字符串 本质上是一个字符数组
String str = "hello";
char [] chars = {'h' , 'e' , 'l' , 'l' , 'o'};
//获得第几个字符,使用charAt方法charAt(索引)
/*char c = str.charAt(1);
System.out.println(c);*/
//字符串转换为字符数组
/*char [] chars1 = str.toCharArray();
for (int i = 0; i < chars1.length; i++) {
System.out.println(chars1[i]);
}*/
//把字符数组转换成字符串
/*String str1 = String.valueOf(chars);
System.out.println(str1);*/
//字符串比较:
Scanner sc = new Scanner(System.in);
System.out.println("请输入密码:");
String pwd = sc.next();
//字符串比较不能使用==,应该使用:.equals方法。
if (pwd.equals("loveedu")){
System.out.println("成功");
}else{
System.out.println("失败");
}
一dian注意事项
// 注意事项。
//问题1:如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数据索引越界异常)
int [] arr = {11 , 22 , 33} ;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// System.out.println(arr[3]); // 出现异常
//问题2:如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现NullPointerException(空指针异常)
arr = null ;
System.out.println(arr); // null
System.out.println(arr.length); // 出现异常
关于数组的许多练习题,我都放下下面链接啦,也是我自己做的一些练习。