习题
- 输⼊⼀个数,判断它是否能被3、5、7整除,注意考虑同时整除的情况
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字");
int num = scanner.nextInt();
boolean flag1 = (num % 3 == 0);//能够被3整除
boolean flag2 = (num % 5 == 0);//能够被5整除
boolean flag3 = (num % 7 == 0);//能够被7整除
if (flag1 && flag2 && flag3){
System.out.println("能够被3,5,7整除");
}else if (flag1 && flag2){
System.out.println("能够被3,5整除");
}else if (flag1 && flag3){
System.out.println("能够被3,7整除");
}else if (flag2 && flag3){
System.out.println("能够被5,7整除");
}else if (flag1){
System.out.println("能够被3整除");
}else if (flag2){
System.out.println("能够被5整除");
}else if (flag3){
System.out.println("能够被7整除");
}else {
System.out.println("不能被3,5,7整除");
}
- 计算⽤户输⼊的⽇期离1900年1⽉1⽇相距多少天
// 1900 6 1 31 + 28 + 31 +30 + 31
Scanner scanner = new Scanner(System.in);
// 年
int year = scanner.nextInt();
// 月
int month = scanner.nextInt();
// 日
int day = scanner.nextInt();
// 1901 1 3
// totalDay代表的是总天数
// 计算 天
int totalDay = day - 1;
// 计算 年 循环的添加每一年的天数
for (int y = 1900;y < year;y++){
// 判断是否是闰年
// 闰年 能被4整除并且不能被100整除
// 闰年 能够被400整除
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
totalDay += 366;
}else {
totalDay += 365;
}
}
// 计算月 循环的添加每个月的天数
for (int m = 1; m < month;m++){
switch (m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
totalDay += 31;
break;
case 2:
// 闰年
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){
totalDay += 29;
break;
}
totalDay += 28;
break;
default:
totalDay += 30;
break;
}
}
System.out.println("距离1900年1月1日的天数是" + totalDay + "天");
1 数组
1.1 概述
- 可以存放多个相同数据类型变量的容器。
- 在数组中的变量,称之为数组的元素。
- 数组可以存储基本数据类型,也可以存储引用数据类型。
1.2 定义格式
- 数组的定义格式
- 格式1:数据类型[ ] 数组名;(推荐)
- 格式2:数据类型 数组名[ ];
1.3 数组的初始化
- 概述
- Java中的数组必须先初始化,才可以使用。
- 所谓的初始化:就是为数组中的数组元素分配内存空间,并且为每个数组元素赋值。
- 数组的初始化方式:
- 动态初始化:初始化时只指定数组的长度,由系统为数组分配初始化值。
- 静态初始化:初始化时指定每个数组元素的初始化值,由系统决定数组长度。
1.4 动态初始化
- 初始化时只指定数组长度,由系统为数组分配初始化值。
- 格式:数据类型[] 数组名 = new 数据类型[数组长度];
- 数组长度其实就是数组中元素的个数
1.5 访问数组元素
- 直接在控制台输出数组名,结果是数组堆内存中的地址。
- 在数组中每个元素都是有编号的,这个编号从0开始。最大的编号是数组的长度 - 1
- 这个编号有一个专业的叫法:索引 也称之为下标
- 使用数组名和索引配置,我们就可以轻松获取数组中指定索引的元素
- 格式: 数组名[索引];
1.6 java中的内存分配
Java程序在运行时,需要在内存中分配空间。
为了提高运算效率,java中对于空间进行了不同区域的划分,每一片区域都有特定的处理数据方式和内存管理方式。
- 栈 用来存放局部变量的
- 局部变量是定义在方法中或者语句的变量
- 大白话解释:凡是定义在方法的大括号的变量都是局部变量.比如:main方法 if语句 循环语句
- 存放在栈中
- 局部变量使用完毕,会立即回收
- 本质上栈内存是用于计算的
- 堆 存储的都是对象
- 凡是new出来的东西,都在堆内存中。
- 对象存储在堆内存中,具有一个首地址值。
- 其中不同的数据类型,都将被赋予一个初始化的默认值。
- byte/short/int的默认值是0
- long默认值是0L
- float默认值是0.0F
- double默认值是0.0
- char类型默认值是\u0000,表示空格
- boolean类型是false
- 引用数据类型默认值都是null
- 方法区 存储和.class相关的信息
- 本地方法区 与操作系统相关
- 寄存器 与CPU相关,性能非常高
1.7 数组内存图解
- 定义两个数组。先定义一个数组赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组,然后给第二个数组赋值,再次输出两个数组的名和元素。
// 定义两个数组。
// 先定义一个数组赋值,输出。
// 然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组,
// 然后给第二个数组赋值,再次输出两个数组的名和元素。
int[] arr1 = new int[3];
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
System.out.println(arr1);// [I@5594a1b5
System.out.println(arr1[0]);// 10
System.out.println(arr1[1]);// 20
System.out.println(arr1[2]);// 30
int[] arr2 = arr1;
arr2[0] = 100;
arr2[1] = 200;
arr2[2] = 300;
System.out.println(arr1);// [I@5594a1b5
System.out.println(arr1[0]);// 100
System.out.println(arr1[1]);// 200
System.out.println(arr1[2]);// 300
System.out.println(arr2);// [I@5594a1b5
System.out.println(arr2[0]);// 100
System.out.println(arr2[1]);// 200
System.out.println(arr2[2]);// 300
1.8 静态初始化
- 概述
- 初始化时指定每个数组元素的初始值,由系统决定数组的长度。
- 格式
- 数据类型[] 数组名 = new 数据类型[]{元素值1,元素值2,元素值3…};
- int[] array = new int[]{1,2,3}
- 简便格式
- 数据类型[] 数组名 = {元素值1,元素值2,元素值3…};
- int[] array = {1,2,3};
- 注意点:简便格式不能拆分来进行初始化,因为不能确定数组的数据类型。
1.9 数组常遇的问题
- ArrayIndexOutOfBoundsException 数组s索引越界
- 当数组中的索引大于数组长度- 1 或者索引小于0时会出现的问题
- NullPointerException 空指针异常
- 对象的值是一个null常量
1.10 获取数组的长度
格式:数组名.length
1.11 数组的遍历
int[] arr1 = {7,3,4,8,5,6,1,98,56,23,4,5,6};
for (int i = 0;i < arr1.length;i++){
System.out.println(arr1[i]);
}
// 增强for循环 i代表数组中的元素
for (int i : arr1) {
System.out.println(i);
}
增强for循环和普通for循环的区别:
- 增强for循环中不能获取索引,普通for循环中可以获取索引
- 增强for循环中不能直接进行运算,普通for循环中可以对数组元素进行运算