廖雪峰老师的java教程 -------------2021.8.21,wudibooo
Java程序基础
java简介
【JDK】
【JVM】
java程序基本结构
变量和数据类型
[这四个是整型]
- byte 1 [数字表示字节数]
- short 2
- int 4
- long 8
【这两个是浮点型】
- float 4 ,需要加上
f
后缀 - double 8
- char 2
- string 字符串
- final 常量
- var 关键词
var man = new ManClass() //等于ManClass man = new ManClass()
整数运算
【溢出问题】
【i++,++i】:前者是先赋值,再加,后者相反
【移位】
- >> :右移,低位舍弃,高位根据符号位补位,整数补0,负数补1
- >>>:无符号右移,无论怎么样都补零
- <<:左移,舍弃高位,低位补0
【运算优先级】
()
-
!
~
++
--
-
*
/
%
-
+
-
-
<<
>>
>>>
&
|
-
+=
-=
*=
/=
【类型变换】
- 在不同类型的整型相加时,结果时最大的那个类型
- 强制转换时,高转低,溢出会舍弃高位的数据,出现错误。
int i1 = 1234567;
short s1 = (short) i1; // -10617
浮点数运算
【精确问题】:在计算机中,有的浮点数无法用用二进制精确保存,比如0.1
【溢出问题】
【浮点数的比较】:一般是计算两者的绝对值得差,来判断T or F
【类型转换】
- 整型会自动转浮点型
- 可以将浮点型强制转为整型,但超出范围后将始终返回整型的最大值。
布尔运算
【关系运算符】
【短路运算】:如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。
boolean b = 5 < 3; //后面5/0 原本会报错,但是无论如何0与谁都得到0,所以没有报错
boolean result = b && (5 / 0 > 0);
【三元运算符】b? x:y
字符和字符串
【char】:保存一个Unicode字符
【char
是基本类型,字符串类型String
是引用类型】:基本类型的变量是“持有”某个数值,引用类型的变量是“指向”某个对象。
【tips】
- 语句从左到有执行。
int a = 72;
int b = 105;
int c = 65281;
// FIXME:
String s = ""+(char)a +(char)b +(char)c; //Hi!
//先生成一个空字符,在用char对a,b,c分别转为Unicode
数组类型
【数组的定义】
整形数组:值类型
int [] lsit = new int [5] //长度为5 , 初始值: int 0 float 0.0 boolfalse
int [] list = new int [] {1,2,3,4,5,6} //自动计算
int [] list = {1,2,3,4,5,6}
字符串数组:引用类型
String[] names = {"ABC", "XYZ", "zoo"};
2021.8.22
流程控制
输入和输出
【printl and print】:不需要换行就用print
【格式化输出】:printf
System.out.printf("%.2f\n", d); // 显示两位小数3.14
System.out.printf("%.4f\n", d); // 显示4位小数3.1416
【占位符】:
%d | 格式化输出整数 |
%x | 格式化输出十六进制整数 |
%f | 格式化输出浮点数 |
%e | 格式化输出科学计数法表示的浮点数 |
%s | 格式化字符串 |
【输入】:比较麻烦,要import java.util.Scanner
import java.util.Scanner;
public class hellow {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //新建一个对象
System.out.println("please input:");
String line = scanner.nextLine(); //接受一个string line ,还有nextint
System.out.println(line);
}
}
if判断
if( 条件1 ){
语句1
}else if( 条件2 ){
语句2
}else{
语句3
}
【判断应用类型】:就算值相同,在用==时,两者也不一定相等,要比较内容需要用equals()方法
swtich多重选择
switch (option) {
case 1: //条件也可以是字符串
System.out.println("Selected 1");
break;
case 2:
System.out.println("Selected 2");
break;
case 3:
System.out.println("Selected 3");
break;
default: //没有条件匹配,就执行dafault
System.out.println("Not selected");
break;
}
【tips】:java12之后可以不写break
switch (fruit) {
case "apple" -> System.out.println("Selected apple");
case "pear" -> System.out.println("Selected pear");
case "mango" -> { //多个语句要用花括号
System.out.println("Selected mango");
System.out.println("Good choice!");
}
default -> System.out.println("No fruit selected");
}
【yield】:swtich可以直接返回值,如果语句多需要利用yield来返回值
int opt = switch (fruit) {
case "apple" -> 1;
case "pear", "mango" -> 2;
default -> {
int code = fruit.hashCode();
yield code; // switch语句返回值
}
};
while循环
【先判断循环条件,再执行循环】
while (条件表达式) {
循环语句
}
do while循环
【先执行循环,再判断条件】
do {
执行循环语句
} while (条件表达式);
for 循环
for (int i=1; i<=100; i++) {
//先初始化int i =1,再判断条件,成立则执行下面的语句,最后更新计数
sum = sum + i;
}
【for each循环】:通常java用来遍历数组,类似python的 for in ,注意不是;是:
for (int n : ns) {
System.out.println(n);
}
break和continue
【break跳出自己所在的循环】【continue跳出本次的循环】
数组操作
遍历数组
【for】
【for each】
【java.util.Arrays】:Arrays.toString(ns)
数组排序
【冒泡排序】:一个个怼上去
【java.util.Arrays】:Arrays.sort()
多维数组
//二维
int [][] ns ={
{1,2},
{3,4}
}
//三维
int [][][] ns ={
{
{1,2},
{3,4}
} ,
{
{1,2},
{3,4}
}
}
【三维数组内存结构】
【遍历方法】:对每一层都用for each
for (int[] i : scores){
for (int j : i){sum = sum+j;}
}
命令行参数
- 命令行参数类型是
String[]
数组 - 命令行参数由JVM接收用户输入并传给
main
方法