day00 计算机基础
三分看,七分练
day01 Java入门
Java语言的特点
1.面向对象
(两个基本概念:类、对象三大特性:封装、继承、多态)
2.健壮性
(去掉了诸如指针、内存的申请与释放等,提供了一个相对安全的内存管理和访问机制)
3.跨平台性Write once,Run Anywhere
(JVM,Java Virtual Machine)
JDK,JRE,JVM三者之间的关系
- JRE=JVM+Java SE标准类库
- JDK=JRE+开发工具集
文档注释
/**
文档注释
@author wow808
@version v1.0
文档注释修饰的类通常为public
使用的命令为
javadoc -d myDirectory -author -version myJava.java
*/
day02 标识符和变量
标识符的命名规则
(不遵守则编译不通过)
- 英文大小写字母,0-9,_或$组成
- 数字不可以开头
- 不可以使用关键字和保留字,但可以包含
- 严格区分大小写,长度无限制
- 不能包含空格
标识符的命名规范
- 包名:多单词组成的所有字母小写:xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词字母小写,第二个单词开始首字母大写:xxxYyyZzz
- 常量名:所有字母都大写。多单词时用下划线连接:XXX_YYY_ZZZ
变量的分类
8种基本数据类型
基本数据类型
- 整形 byte\short\int\long
- 浮点型 float\double
- 字符型 char
- 布尔型 boolean
引用数据类型
- 类(class)
- 接口(interface)
- 数组(array)
自动类型提升
小转大(表示范围)
byte\char\short>int>long>float>double
当byte、char、short三种结果做运算时,结果为int
强制类型转换(自动类型的提升的逆运算,截断)
整型常量默认int,浮点型常量默认为double
/*无法得到你想要的效果*/
System.out.println('*'+'\t'+'*');
System.out.println('*'+'\t'+'*');
Day03 运算符
算术运算符
++,–,+=等不会改变数据类型
位运算符
在一定范围内,x<<n,相当于
x*2^n
如何高效的计算
2*8
即2<<3
Day04 分支结构
Scanner
对于char型的获取,Scanner并没有提供相关的方法,只能获取一个字符串
随机数
如何获取一个随机数:10-99
double value = Math.random();//[0.0,1.0)
int value1 = (int)Math.random()*90+10;//[10.0,100.0)
/*
Math.random()*(99-10+1)+10
自己根据范围摸索规矩
公式:[a,b]:(int)(Math.random()*(b-a+1))+a
*/
switch case
一旦case满足条件,在遇到break之前,程序均会依次向下执行。
例:
class SwitchCaseTest{
public static void main(String[] args){
int number = 1;
switch(number){
case 0:
System.out.println("zero");
//break;
case 1:
System.out.println("one");
//break;
case 2:
System.out.println("two");
//break;
case 3:
System.out.println("three");
//break;
/*
输出结果为:
one
two
three
*/
}
}
}
default可放置在任意位置,但是最后执行。注意要加break;
switch结构中的表达式,只能是6种类型:
byte/short/int/char/枚举类型(jdk5.0)/String(jdk7.0)
错误: 编码GBK的不可映射字符
问题原因:
WINDOWS和PowerShell的默认编码为GBK,而VSCode、Notepad++等编辑器的默认编码为UTF-8
解决方法:
1.改变系统默认编码为UTF-8
2.将编辑器编码格式改为GBK
3.用javac -encoding UTF-8编译(推荐)
例题 用switchcase解决0-100内分数是否及格的问题
switch(score/60)
case 0:
System.out.println("不及格");
break;
case 1:
System.out.println("及格");
break;
例题 用switchcase解决,输入2019年的month和day,输出这是2019年的第n天
/*
编写程序,从键盘上输入2019年的month和day,程序输出
输入的日期为2019年的第几天
*/
import java.util.Scanner;
public class SwitchCaseTest2{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("Please enter month:");
int month = scan.nextInt();
System.out.println("Please enter day:");
int day = scan.nextInt();
System.out.println(month+","+day);
int num = 0;
switch(month){
case 12:
num+=30;
case 11:
num+=31;
case 10:
num+=30;
case 9:
num+=31;
case 8:
num+=31;
case 7:
num+=30;
case 6:
num+=31;
case 5:
num+=30;
case 4:
num+=31;
case 3:
num+=28;
case 2:
num+=31;
case 1:
num+=day;
break;
}
System.out.println("这是2019年的第"+num+"天");
}
}
/*
这道题考查了1.switchcase中break的妙用2.注意每个月份是加前一个月份的全天数
*/
switch-case执行效率稍高,但均可转换为if-else
Day05 循环结构
输出一定范围内的质数
/*
输出某个范围内的所有质数,并查看耗时
*/
public class PrimeTest{
public static void main(String[] args){
long start = System.currentTimeMillis();
boolean isFlag = true;
for(int i=2;i<100000;i++){
isFlag = true;
//优化二,针对质数的优化
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
isFlag = false;
//优化一,发现因子后第一时间break
break;
}
}
if(isFlag){
System.out.println(i);
}
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
/*不用isFlag,利用continue
public class PrimeTest{
public static void main(String[] args){
long start = System.currentTimeMillis();
for(int i=2;i<100000;i++){
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
continue;
}
}
System.out.println(i);
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
*/
Day06-07 数组
注意
- 数组是引用数据类型,数组的元素可以是任意类型
- 数组的长度一旦确定,不再更改
二维数组元素默认初始化值
public class ArrayTest{
public static void main(String[] args){
int[][] arr = new int[4][3];
//地址值中几个"["代表是几维数组,I代表元素的数据类型为Int
System.out.println(arr[0]);//[I@15db9742
System.out.println(arr[0][0]);//0
System.out.println(arr);//[[I@6d06d69c
//特殊情况,动态初始化时内层个数不设置,则外层元素无地址值,为null
double [][] arr1 = new double[4][];
System.out.println(arr1[1]);//null
}
}
数组中涉及的常见算法
- 数组元素的赋值:杨辉三角、回形数等(多考察)
- 求数值数组中元素的最大值、最小值、平均数、总和等
- 数组的复制、反转、查找(多考察)(线性查找、二分查找)
- 数组元素的排序(多考察)
杨辉三角形
import java.util.Scanner;
public class YangHuiTest {
public static void main(String[] args) {
System.out.println("想打印几行杨辉三角?");
Scanner scan = new Scanner(System.in);
int line = scan.nextInt();
//动态初始化杨辉三角,注意如果声明为new int[line][line]则是在浪费空间
int[][] yangHui = new int[line][];
//遍历赋值
for(int i=0;i<yangHui.length;i++) {
yangHui[i] = new int [i+1];
//首尾元素赋值
yangHui[i][0]=yangHui[i][i]=1;
//给每行元素赋值,注意j从1(每行第二数开始)
for(int j=1;j<i;j++) {
yangHui[i][j] = yangHui[i-1][j-1]+yangHui[i-1][j];
}
}
//遍历输出
for(int i=0;i<yangHui.length;i++) {
for(int j=0;j<=i;j++) {
System.out.print(yangHui[i][j]);
}
System.out.println();
}
}
}
笔试题
创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值,同时要求元素的值各不相同
package fun.wow808.java;
/*
* 创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,
* 且是随机赋值,同时要求元素的值各不相同
* */
public class RandomTest{
public static void main(String[] args) {
int[] arr = new int[6];
for(int i=0;i<arr.length;i++) {
int num = (int)(Math.random()*30+1);
boolean isFlag = true;
while(true) {
for(int j=0;j<arr.length;j++) {
if(num == arr[i]) {
isFlag = false;
break;
}
}
if(isFlag) {
arr[i] = num;
break;
}
num = (int)(Math.random()*30+1);
}
}
//遍历
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
}
公式获得[A,B]闭区间内的随机数
用(int)(Math.random()*(B-A+1)+A)
冒泡排序必须掌握
public class BubbleSortTest {
public static void main(String[] args) {
int[] arr = new int[] {1,8,12,3,5,9,10,34,0};
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr.length-1;j++) {
if(arr[j]>arr[j+1]) {
int swap = arr[j];
arr[j] = arr[j+1];
arr[j+1] = swap;
}
}
}
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+"\t");
}
}
}
java.util.Arrays,操作数组的工具类
数组中的常见异常
int[][] arr2 = new int[4][];
System.out.println(arr[2]);//null
System.out.println(arr[2][0]);//NullPointerException