六、数组
概念: 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;}} }