一、关键字
我们第一章案例中有很多关键字,比如class、public、static、void等,这些关键字依旧被java定义好了,可以拿来用,不需要死记硬背,按照官方文档查询即可
#官方文档
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
常用关键字
二、标识符
上面的关键字的定义好的,那么标识符就是我们自定义的,通常来说我们称之为变量
比如说我们在定义class类的时候,是不是都是随便起名 比如class xxx 这个就是变量(标识符) 但是标识符的定义需要遵循一定的命名规则,如下
1、 标识符命名规则
由26个英文字母大小写 0-9 下划线_ 或者$ 组成
不可以数字开头
不可以使用关键字,但是能包含关键字
java中严格区分大小写,长度无限制
标识符不能包含空格
2、标识符命名格式
数据类型 变量名 = 变量值
案例
char gender 变量初始化 #java语言必须要先定于变量名,才能使用
gender = ‘男’ 变量赋值
3、基本数据类型
整型 byte short int long
浮点型 float double
字符型 chart
布尔型 boolean
#引用数据类型,现在不用了解类 class
数组 array
接口 interface
枚举 enum
注解 annotation
记录 record
1、整型的数据范围
计算机存储单位
2、浮点类型范围
浮点数 不适合在精确小数点的环境,比如银行,舍弃的小数点也是很多钱
BigDecimal 来替换浮点
3、字符型
4、布尔值
4、运算符规则
当容量小的数据类型和容量大的数据类型做运算时,结果自动转换为容量大的数据类型
案例
int i1 = 10
long l1 = i1
float f1 = l1
double d1 = f1
此时的容量小或者大,不是说内存空间的大小,而是表示数据范围的大小,long(8字节) float(4字节),int 是4字节可以把数据赋值给long 8字节,float 比long的范围还要大,那么long可以赋值给float
三、数组
数组是多个相同类型数据,按照一定顺序排序的集合,并使用一个名字命名,并通过编号的方式对这些数据统一管理
1、数组定义
案例1 数组定义 初始化值
int num1 = 10;
int num2;
num2 = 20#声明数组
double[] prices;#声明什么new什么 初始化步骤
prices = new double[]{1.1,2.2,3.3} #初始化 并赋值
案例2
String[] fods;
foods = new String[]{"你好","你好2","你好3"}
案例3
#不指定数组元素 指定长度
String[] foods = new String[4]; #如果不带花括号,可以直接写数字#表示能存放的大小,后续在添加数组的值
案例1和案例2 是静态,数组变量的初始化与数组元素的操作同时进行
案例3 是动态的 #数组变量的赋值与数组元素赋值操作分开案例1和案例2定义的值就是数组的长度
小结
数组一旦初始化完成,数组的长度就确定了,并且不可更改静态定义 写花括号里
int[] arr1 = new int[]{1,2,3,4}
动态 写大括号里
int arr[] = new int[4]
2、数组元素调用
1、获取索引位值
int[] arr1 = new int[]{1,2,3,4}#调用
arr1[0] #从0 开始
arr1[1]
arr1[2]
arr1[3]
2、给索引位赋值
int[] arr1 = new int[4]#赋值
arr1[0] = 555
arr1[0] = 666
3、获取数组长度
int[] arr1 = new int[4]#获取数组容量大小
arr1.length
4、如何遍历数组
int[] arr1 = new int[4]
for (int i = 0; i <= 4; i ++){System.out.println(arr1[i])
}或者
for (int i = 0; i <= prices.length; i ++){System.out.println(arr1[i])
}
5、数组元素默认初始化值
int[] arr1 = new int[4]
System.outprintln(arr1[0])此时默认值是什么整型 0
浮点型 0.0
字符型 0
字符串 null
布尔类型 false
3、多维数组格式
#定义一维数组
int[] arr1 = new int[]{1,2,3};#定义二维数组 静态
int[][] arr2 = new int[][]{{1,2,3},{4,5,6}};#定义动态二维数组
#可以定义3个子数组(元素)
#每个子数组里面可以放4个元素
String[][] arr3 = new String[3][4]; #动态二维数组2
#将第二个置空
#置空表示没设置上线,写入的时候根据写入的元素决定
String[][] arr3 = new String[3][];
关于数组的写法
int[][] arr5 =
int[] arr5[] =
int arrt5[][] =这3种写法都是堆的类型推断
#写的时候如果是在一行,并且带有值的时候
#可以把右边的new int[][] 去掉,也是可以的
int[][] arr2 = {{1,2,3},{4,5,6}};
二维数组的调用
int[][] arr2 = {{1,2,3},{4,5,6}};#调用内层元素
arr2[0][0] #第一个数组的第一个元素
arr2[1][2] #第二个数组的第三个元素2#我们调用的时候如果不指定内存元素
#只指定第一个数组,那么只会打印数组的内存地址
arr2[1]#如果是普通数据升级为二维数组
arr4[0] = new int[4] #给数组添加一个子数组
二维数组的长度
#定义二维数组 静态
int[][] arr2 = new int[][]{{1,2,3},{4,5,6}};arr2.length 是2 因为有2个元素
arr2[0].length 是3 因为数组1有3个元素
如何遍历二维数组
int[][] arr2 = new int[][]{{1,2,3},{4,5,6}};for (int i = 0; i < arr2.length; i++){for (int j = 0; j < arr2[i].length; i++){System.out.println(arr2[i][j])
}
二维数组的默认值
#动态初始化方法1
int[][] arr2 = new int[3][2]#外层元素默认值
System.out.println(arr2[0]) 内存地址值
System.out.println(arr2[0])
#内层元素默认值
System.out.println(arr2[0][]) //0#动态初始化方法2
int[][] arr2 = new int[3][]#外层元素默认值
System.out.println(arr2[0]) //null
#内层元素默认值
System.out.println(arr2[0][]) //报错,空指针,因为光有栈名称,没有堆的具体数
4、数组案例
1、写出一维数组初始化的两种方式
int[] arr = new int[5];//动态初始化String[] arr1 = new String[]{"Tom","Jerry","Jim"};//静态初始化//数组一旦初始化,其长度就是确定的。arr.length
//数组长度一旦确定,就不可修改。
2、写出二维数组初始化的两种方式
int[][] arr = new int[4][3];//动态初始化1
int[][] arr1 = new int[4][];//动态初始化2int[][] arr2 = new int[][]{{1,2,3},{4,5,6},{7,8}};//静态初始化
3、不同类型的一维数组元素的默认初始化值各是多少
整型 : 0
浮点型:0.0
char:0
boolean :false
引用类型:null
4、遍历如下的二维数组
int[][] arr = new int[][]{{1,2,3},{4,5},{6,7,8}};
public class Exercise1 {public static void main(String[] args) {int[][] arr = new int[][]{{1,2,3},{4,5},{6,7,8}};for(int i = 0;i < arr.length;i++){for(int j = 0;j < arr[i].length;j++){System.out.print(arr[i][j] + "\t");}System.out.println();}}
}
5、小组学员姓名
用一个数组存储本组学员的姓名,先从键盘输入小组人数,再从键盘输入每一个学员的姓名,然后遍历显示。
import java.util.Scanner;public class Exercise2 {public static void main(String[] args) {//用一个数组存储本组学员的姓名//元素的类型是String,长度是多少?//长度的确定:(1)根据自己小组定(2)可以从键盘输入Scanner input = new Scanner(System.in);System.out.print("请输入小组的人数:");int count = input.nextInt();//声明数组并且初始化String[] names = new String[count];//此时names数组中都是默认值nullfor(int i=0; i<names.length; i++){System.out.print("请输入第"+ (i+1) + "个同学的姓名:");names[i] = input.next();}//全部输入完后显示System.out.println("本组学员的姓名如下:");for(int i=0; i<names.length; i++){System.out.print(names[i] + "\t");}System.out.println();input.close();}
}
6、统计低于平均分的学生人数
先从键盘输入本组学员的人数,再从键盘输入本组学员的姓名和成绩,最后统计:
本组学员的平均分,
低于平均分的学员人数,
哪些学员低于平均分,
最高分和最低分分别是谁。
import java.util.Scanner;public class Exercise3 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请录入本组学员人数:");int count = input.nextInt();int[] grades = new int[count];String[] names = new String[count];for (int i = 0; i < grades.length; i++) {System.out.print("第" + (i+1) + "个学员的姓名:");names[i] = input.next();System.out.print("第" + (i+1) + "个学员的成绩:");grades[i] = input.nextInt();}input.close();//学员姓名和成绩System.out.println("所有学员的成绩如下:");for (int i = 0; i < names.length; i++) {System.out.println(names[i] + ":" + grades[i]);}//找出最高分、最低分、累加总分,计算平均分int max = grades[0];int min = grades[0];double sum = 0;for (int i = 1; i < grades.length; i++) {if(grades[i] > max){max = grades[i];}if(grades[i] < min){min = grades[i];}sum += grades[i];}double avg = sum/grades.length;//输出结果System.out.println("最高分成绩是:" + max);System.out.println("最第分成绩是:" + min);System.out.println("平均分成绩是:" + avg);System.out.println("获得最高分的有:");for (int i = 0; i < names.length; i++) {if(max == grades[i]){System.out.println(names[i]);}}System.out.println("获得最第分的有:");for (int i = 0; i < names.length; i++) {if(min == grades[i]){System.out.println(names[i]);}}System.out.println("低于平均分的有:");int total = 0;for (int i = 0; i < names.length; i++) {if(grades[i] < avg){System.out.println(names[i]);total++;}}System.out.println("低于平均分的一共有:" + total +"人");}
}
7、一年12个月的存储
用一个数组,保存12个月的英语单词,从键盘输入1-12,显示对应的单词。
{"January","February","March","April","May","June","July","August","September","October","November","December"}
import java.util.Scanner;public class Exercise4 {public static void main(String[] args) {String[] monthNames = {"January","February","March","April","May","June","July","August","September","October","November","December"};Scanner input = new Scanner(System.in);System.out.print("请输入月份值:");int month = input.nextInt();if(month <1 || month> 12){System.out.println("输入有误");}else{System.out.println("月份" + month +"是" + monthNames[month-1]);}input.close();}
}
8、随机产生偶数并排序
随机产生10个[1,100]之间的偶数存储到数组中,并按照从小到大排序输出。
public class Exercise5 {public static void main(String[] args) {int[] arr = new int[10];//随机产生10个[1,100]的偶数for (int i = 0; i < arr.length; i++) {/*Math.random():[0,1)的小数Math.random()*50:[0,50)的小数Math.random()*50+1:[1,51)的小数(int)(Math.random()*50 + 1):[1,51)的整数,即[1,50]的整数(int)(Math.random()*50 + 1) * 2 : [1,100]的偶数*/arr[i] = (int)(Math.random()*50 + 1) * 2;}//排序for (int i = 1; i < arr.length; i++) {for(int j=0; j<arr.length - i; j++){if(arr[j] > arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}//显示结果for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
9、正序、逆序遍历英文字母
要求使用char数组存储26个英文字母,并分别用正序和逆序方式显示输出。要求10个一行。
public class Exercise6 {public static void main(String[] args) {char[] letters = new char[26];for (int i=0; i<letters.length; i++){letters[i] = (char)('a' + i);}System.out.println("小写字母的正序排序:");int count = 0;for (int i = 0; i <letters.length; i++) {count++;if(count == 10 || i == letters.length-1){System.out.println(letters[i]);count = 0;}else if(count < 10) {System.out.print(letters[i]+",");}}System.out.println("小写字母的逆序排序:");count = 0;for (int i = letters.length-1; i >= 0; i--) {count++;if(count == 10 || i == 0){System.out.println(letters[i]);count = 0;}else if(count < 10) {System.out.print(letters[i]+",");}}}
}
10、查找满分学员
先从键盘输入本组学员的人数,再从键盘输入本组学员的姓名和成绩,显示学员姓名和成绩。最后查找是否有满分(100)学员,如果有显示姓名,否则显示没有满分学员。
import java.util.Scanner;public class Exercise7 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请录入本组学员人数:");int count = input.nextInt();int[] grades = new int[count];String[] names = new String[count];for (int i = 0; i < grades.length; i++) {System.out.print("第" + (i+1) + "个学员的姓名:");names[i] = input.next();System.out.print("第" + (i+1) + "个学员的成绩:");grades[i] = input.nextInt();}input.close();//输出学员姓名和成绩System.out.println("所有学员的成绩如下:");for (int i = 0; i < names.length; i++) {System.out.println(names[i] + ":" + grades[i]);}//查找满分学员System.out.println("本班满分学员:");boolean flag = false;for(int i=0; i<grades.length; i++){if(grades[i] == 100){System.out.println(names[i]);flag = true;}}if(!flag){System.out.println("没有");}}
}
11、随机生成大乐透
模拟大乐透号码:- 一组大乐透号码由10个1-99之间的随机数字组成,可以重复
- 打印大乐透号码信息
public class Exercise8 {public static void main(String[] args) {//1、声明并创建数组int[] arr = new int[10];//2、为元素赋值java.util.Random rand = new java.util.Random();for (int i = 0; i < arr.length; i++) {arr[i] = rand.nextInt(99)+1;}//3、输出for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}}
12、升级大乐透
大乐透(前区“35选5”+后区“12选2”),即前区在1-35之间的号码中随机选取5个,后区在1-12之间的号码中随机选取2个,组成一期的中奖号码,请用程序模拟产生一组大乐透中奖号码。
开发提示:
声明一个int类型的数组front,长度为35,默认值都是0;
声明一个int类型的数组after,长度为12,默认值都是0;
随机产生[0,35)之间的整数。如果随机产生的是0,那么就把front[0]修改为1,如果随机产生的是5,那么就把front[5]修改为1,如果随机产生的是10,就把front[10]修改为1。但是如果本次随机产生的是5,而front[5]已经是1了,那么需要重新随机产生一个整数。用这种方式把front数组的5个元素修改为1。
随机产生[0,12)之间的整数。使用同样的方式,把after数组的2个元素修改为1。
遍历front和after数组,输出大乐透中奖号码,判断front和after数组元素是否为1,如果为1,就显示它的下标+1值。
public class Exercise9 {public static void main(String[] args) {int[] front = new int[35];int[] after = new int[12];for (int i = 1; i <=5; i++) {/*Math.random():[0,1)的小数Math.random() * front.length:[0,front.length)的小数(int)(Math.random() * front.length):[0,front.length)的整数,[0,front.length-1]*/int index;do{index = (int)(Math.random() * front.length);}while(front[index]==1);front[index] = 1;}for (int i = 1; i <=2; i++) {int index;do{index = (int)(Math.random() * after.length);}while(after[index]==1);after[index] = 1;}System.out.println("本期大乐透中奖号码:");System.out.print("前区号码为:");for (int i = 0; i < front.length; i++) {if(front[i] == 1){System.out.print(i+1+"\t");}}System.out.print("\n后区号码为:");for (int i = 0; i < after.length; i++) {if(after[i] == 1){System.out.print(i+1+"\t");}}System.out.println();}
}
13、判断单词是否是回文单词
从键盘输入一个单词,判断它是否是回文单词。开发提示:
- 从键盘输入一个单词,存放到一个String类型的变量word中
- 通过word.toCharArray()可以根据字符串word得到一个char[]类型的数组。其中toCharArray()是String类型提供的系统函数,就像Math.random()等函数一样,后面会学到,这里先提前用一下。它的作用就是创建一个char[]数组,并把字符串中的每一个字符依次存储到这个char[]数组中。Scanner input = new Scanner(System.in);System.out.print("请输入一个英语单词:");String word = input.next(); //假如输入的英语单词是momchar[] wordCharArray = word.toCharArray(); // wordCharArray字符数组内容是{'m','o','m'}
/*** @author 尚硅谷-宋红康* @create 19:39*/
public class Exercise10 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请输入一个英语单词:");String word = input.next(); //假如输入的英语单词是mominput.close();char[] wordCharArray = word.toCharArray(); // wordCharArray字符数组内容是{'m','o','m'}//(1)先假设它是对称的boolean flag = true;//(2)遍历,查看数组的元素是否首尾对称//left表示左边的下标//right表示右边的下标for(int left=0,right=wordCharArray.length-1; left<right; left++,right--){if(wordCharArray[left] != wordCharArray[right]){flag = false;break;}}if(flag){System.out.println(word + "是回文单词");}else{System.out.println(word + "不是回文单词");}}
}
14、寻找锦鲤
公司年会有一个寻找锦鲤的游戏,每一个员工随意写一个字,如果在“锦鲤”词库中有这个字,那么就奖励500元锦鲤红包,否则就没有,每人只能玩一次。
现有锦鲤字库如下,它们按照Unicode编码值从小到大排序:
char[] koiFishWords = {'一','今','地','定'};
public class Exercise11 {public static void main(String[] args) {char[] koiFishWords = {'一','今','地','定'};Scanner input = new Scanner(System.in);System.out.print("请输入一个字:");char word = input.next().charAt(0);input.close();int index = -1;for(int left = 0,right = koiFishWords.length-1; left<=right; ){//int mid = (left+right)/2;int mid = left + (right-left)/2;if(koiFishWords[mid] == word){index = mid;break;}else if(word > koiFishWords[mid]){//说明target在[mid]右边left = mid+1;}else{//说明target<arr[mid],target在[mid]左边right= mid-1;}}if(index!=-1){System.out.println("你是锦鲤!!!恭喜获得锦鲤红包500元");}else{System.out.println("o(╥﹏╥)o");}}
}
15、绳子覆盖点
import java.util.Arrays;public class Exercise12 {public static void main(String[] args) {double[] arr = new double[10];for (int i = 0; i < arr.length-1; i++) {arr[i] = Math.random() * 100;//[0,100)之间的小数}arr[arr.length-1] = 0;System.out.println("直线上每一个点距离下一个点的距离:"+Arrays.toString(arr));double length = 150.5;int count = 0;double sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];if(sum<=length) {count++;}else {break;}}System.out.println("长度为:" + length + "的绳子最多能覆盖" +count+"个点");}
}
16、学生成绩统计
需求:保存全班的每个组的成绩,并对成绩做统计
使用二维数组保存全班的每个组的成绩,
从键盘输入一共有几组
从键盘输入每一组分别有多少人
从键盘输入每一个同学的成绩
并对成绩做如下统计:
统计每一组的最高分、最低分
统计每一组的平均分
统计全班的最高分、最低分
统计全班的平均分
统计全班的总人数
public class Exercise13 {public static void main(String[] args){java.util.Scanner input = new java.util.Scanner(System.in);//(1)从键盘输入一共有几组,确定二维数组的行数System.out.print("请输入一共有几组:");int group = input.nextInt();//(2)创建二维数组,并确定行数int[][] arr = new int[group][];//(3)从键盘输入每一组分别有多少人,确定每一行的列数for(int i=0; i<arr.length; i++){System.out.print("请输入第" + (i+1) + "组有几个人:");arr[i] = new int[input.nextInt()];//(4)从键盘输入每一个同学的成绩for(int j = 0; j<arr[i].length; j++){System.out.print("请输入第" + (j+1) + "个组员的成绩:");arr[i][j] = input.nextInt();}}//(4)显示成绩表System.out.println("每组成绩如下:");for(int i=0; i<arr.length; i++){for(int j=0; j<arr[i].length; j++){System.out.print(arr[i][j] + "\t");}System.out.println();}/*4. 统计每一组的最高分、最低分5. 统计每一组的平均分6. 统计全班的最高分、最低分7. 统计全班的平均分8. 统计全班的总人数*/int[] groupMax = new int[group];//有几组就有几个元素int[] groupMin = new int[group];double[] groupAvg = new double[group];int max = -1;//全班的最高分int min = 101;//全班的最低分,假设成绩的范围是[0,100]double sum = 0;int count = 0 ;//把每一组的最高分,最低分,都初始化为特殊值for(int i=0; i<group; i++){groupMax[i] = -1;groupMin[i] = 101;}//统计for(int i=0; i<arr.length; i++){double groupSum = 0;//每一组累加总分,都是从0开始for(int j=0; j<arr[i].length; j++){if(arr[i][j] > groupMax[i]){//找每组的最高分groupMax[i] = arr[i][j];}if(arr[i][j] < groupMin[i]){//找每组的最低分groupMin[i] = arr[i][j];}if(arr[i][j] > max){//找全班的最高分max = arr[i][j];}if(arr[i][j] < min){//找全班的最低分min = arr[i][j];}groupSum += arr[i][j];//累加每一组的总分sum += arr[i][j];//累加全部的总分count++;//累加总人数}//每一组的平均分 = 每一组的总分/每一组的人数groupAvg[i] = groupSum / arr[i].length;}//全部的平均分 = 全部的总分 / 总人数double avg = sum / count;System.out.println("全班的最高分:" + max);System.out.println("全班的最低分:" + min);System.out.println("全班的平均分:" + avg);System.out.println("全班的总人数:" + count);for(int i=0; i<arr.length; i++){System.out.println("第" + (i+1) + "组的最高分:" + groupMax[i]);System.out.println("第" + (i+1) + "组的最低分:" + groupMin[i]);System.out.println("第" + (i+1) + "组的平均分:" + groupAvg[i]);}}
}