六、数组
概念: 1.数组是引用数据类型 2.数组中的数据叫做元素 3.元素都有标号叫做索引/下标 4.下标从0开始 5.数组一旦初始化成功,长度不可变(意味着数组没有添加和删除) 6.数组中的元素在内存中是挨在一起的
声明: 数据类型[] 数组名; --- 推荐 数据类型 数组名[];
6.1一维数组
6.1.1静态初始化:
元素类型[] 数组名 = new 元素的类型[]{元素1,元素2,....}; String[] names = new String[]{"麻生希","椎名空","水菜丽","朝桐光","爱田奈奈"};
先声明,再初始化 String[] names; names = new String[]{"麻生希","椎名空","水菜丽","朝桐光","爱田奈奈"};
当声明与静态初始化在一个语句时,可以简略成: 元素的类型[] 数组名 = {元素1,元素2,....}; String[] names = {"麻生希","椎名空","水菜丽","朝桐光","爱田奈奈"};
//设置指定下标上的元素 names[1] = "曾子俊"; //获取指定下标上的元素 String str = names[1]; System.out.println("获取指定下标上的元素:" + str); //获取元素个数 int len = names.length; System.out.println("获取元素个数:" + len); System.out.println("----------------------------------"); //遍历元素 -- for循环 for(int i = 0;i<names.length;i++){ System.out.println(names[i]); }
6.1.2foreach/增强for循环
for(String element : names){//循环遍历names中的元素,依次赋值给element变量 System.out.println(element); }
6.1.3for vs foreach
循环数组时使用到下标,就用for循环 循环数组时不使用到下标,就用foreach
6.1.3动态初始化
程序员指定长度,数据由系统自动分配默认值。
整数类型默认0 浮点类型默认0.0 字符类型默认' ' 布尔类型默认false 引用类型默认null - 空
元素类型[] 数组名 = new 元素类型[数组长度] String[] names = new String[5];//[null,null,null,null,null]
元素类型[] 数组名; 数组名 = new 元素类型[数组长度] String[] names; names = new String[5];
//设置指定下标上的元素 names[0] = "曾子俊1"; names[1] = "曾子俊2"; names[2] = "曾子俊3"; names[3] = "曾子俊4"; names[4] = "曾子俊5"; 此时如果再声明一个元素names[5] = "用良心做教育"; 会报错ArrayIndexOutOfBoundsException - 数组下标越界异常
案例:
创建长度为5的int数组,使用控制台输入元素,再获取数组中的最大值并输出 注意: int类型的数组是引用数据类型(数组都是引用数据类型) int类型数组中的元素是基本数据类型
Scanner scan = new Scanner(System.in); //创建长度为5的int数组,使用控制台输入元素,再获取数组中的最大值并输出 /**注意: int类型的数组是引用数据类型(数组都是引用数据类型) int类型数组中的元素是基本数据类型*/ int[] arr = new int[5]; for(int i = 0;i<arr.length;i++){ System.out.println("请输入第" + (i+1) + "个数字:"); int num = scan.nextInt(); arr[i] = num; } //假设数组中第一个元素为最大值 int max = arr[0]; for(int i = 1;i<arr.length;i++){ if(max < arr[i]){ max = arr[i]; } } System.out.println("最大值为:" + max); }
七、补一个上午的方法万年历
import java.util.Scanner; public class Test08{ //只能初始年的1月1日为星期一的才行 public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.println("请输入开始年:"); int startYear = scan.nextInt(); System.out.println("请输入年:"); int year = scan.nextInt(); System.out.println("请输入月:"); int month = scan.nextInt(); printCalendar(startYear,year,month); } //打印日历 public static void printCalendar(int startYear,int year,int month){ int week=getWeek(startYear,year,month); int day=getDay(year,month); int count=0; System.out.println(year+"年"+month+"月"); System.out.println("一\t二\t三\t四\t五\t六\t日"); for(int i=1;i<week;i++){ System.out.print("\t"); count++; } for(int i=1;i<=day;i++){ System.out.print(i+"\t"); count++; if(count%7==0){ System.out.println(); } } } //获取星期 public static int getWeek(int startYear,int year,int month){ int allDay=getAllDay(startYear,year,month); int week=allDay%7; if(week==0){ week=7; } return week; } //获取总天数 public static int getAllDay(int startYear,int endYear,int endMonth){ int allDay=getAllDayOfYear(startYear,endYear)+getAllDayOfMonth(endYear,endMonth)+1; return allDay; } //获取月的总天数 public static int getAllDayOfMonth(int year,int endMonth){ int allDayOfMonth=0; for(int i=1;i<endMonth;i++){ allDayOfMonth+=getDay(year,i); } return allDayOfMonth; } //获取当月天数 public static int getDay(int year,int month){ int day=0; switch(month){ case 1:case 3:case 5:case 7:case 8:case 10:case 12: day=31; break; case 4:case 6:case 9:case 11: day=30; break; case 2: if(isLeapYear(year)){ day=29; }else{ day=28; } break; } return day; } //获取年的总天数 public static int getAllDayOfYear(int startYear,int endYear){ int allDayOfYear=0; for(int i=startYear;i<endYear;i++){ if(isLeapYear(i)){ allDayOfYear+=366; }else{ allDayOfYear+=365; } } return allDayOfYear; } //判断闰年的方法 public static boolean isLeapYear(int year){ if(year%4==0&&year%100!=0||year%400==0){ return true; } else{ return false; } } }