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




















