【Java】Java基础知识
康奈尔笔记法(Cornell Notes System)是由美国康奈尔大学教授沃尔特·波克发明的一种笔记方法。将笔记纸分为 3 个栏目:笔记、关键词、总结,来高效记笔记,并便于复习巩固知识点。实际操作: 用简洁的语句在笔记栏记下重点知识。 将笔记栏中的知识点提炼为关键词和要点,写在关键词栏。在总结栏写下本次学习总结。 遮盖笔记栏的内容,通过关键词栏的要点概括,复述出笔记内容来巩固知识。 |
---|
Java快速入门
Java程序基本结构
关键词 面向对象(class) 类的结构 |
---|
| 笔记栏
Java是面向对象的语言,程序的基本单位:class
类的定义:public class Hello {}
public 访问修饰符,public表示类是公开的
class 关键字
Hello 类名,习惯以大写字母开头
方法的定义:public static void main(String[] args) {
// 方法代码…}
static 修饰符,静态方法
void 无返回值
main 方法名
String[] args 签名,方法中传入的参数
在方法内部,语句才是真正的执行代码。Java的每一行语句必须以分号结束
注释
单行注释 //
多行注释 / /,可以多行
特殊的多行注释,在类和方法的定义处,可以用于自动创建文档
/*
*/ |
| —- |
| 总结栏
| | —- |
变量和数据类型
关键词 基本类型变量 引用类型变量 |
---|
| 笔记栏
定义变量:int x = 100;
int 指定变量类型
x 变量名称
100 变量赋值
基本数据类型(有默认值):
整数类型:byte(1字节=1byte),short(2字节),int(4字节),long(8字节)
byte:-128 ~ 127
short: -32768 ~ 32767
int: -2147483648 ~ 2147483647
long: -9223372036854775808 ~ 9223372036854775807
浮点数类型:float(4字节),double(8字节)
float:需要加上“f”后缀,3.4x1038f
double:1.79x10308
字符类型:char(2字节)
char:单引号表示
布尔类型:boolean
boolean:true、false
其余的变量都是引用类型(默认值:null):
引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置
常量:final修饰符,初始化后不可重新赋值,常用全部大写加下滑线表示
var关键字:var sb = new StringBuilder();省略变量类型,根据赋值语句自动推断
变量的作用范围:以{ }作为它们自身的范围,从定义处开始,到语句块结束,作用域最小化原则 |
| —- |
| 总结栏
| | —- |
整数运算
关键词 四则运算 溢出 自增/自减 移位运算 位运算 |
---|
| 笔记栏
四则运算
同初等数学,可以使用任意嵌套的小括号
整数除法只能得到结果的整数部分
求余:%
除数为0编译不会报错,运行时会
计算结果超出返回,产生溢出,不会报错,但是结果会有错误
例:整数 2147483640 + 15 = -2147483641
最高位计算结果为1,结果变成负数
简写运算符:+=,-=,*=,/=
n += 100 -> n = n + 100
自增/自减:对一个整数进行加1和减1的操作
++n 先加1再引用n
n++ 先引用n再加1
移位运算(相当于每移动1位就 乘2(左移) 或者 除2(右移))
左移,所有位数往左移动X位
当最高位变为1,结果变为负数
右移,所有位数往右移动X位
负数右移,高位补1
无符号右移:>>>,无论正负数,高位补0
byte和short进行移位时,会先转换为int
位运算
与(&):两个数都为1,结果才为1
或(|):两个数有一个为1,结果就为1
非(~):0和1互换
异或(^):两个数不同,结果为1;否则为0
整数位运算,按位对齐依次对每一位进行运算
运算优先级
()
! ~ ++ —
/ %
+ -
<< >> >>>
&
|
+= -= *= /=
类型自动提升与强制转型
两个整数类型不一致,结果为较大类型的整数 short + int -> int
强制转型:超出范围的强制转型会得到错误的结果,强制转型,int的两个高位字节直接被扔掉,仅保留了低位的两个字节: |
| —- |
总结栏 练习 计算前N个自然数的和可以根据公式:(1+N)×N/2 请根据公式计算前N个自然数的和: public class Main { public static void main(String[] args) { int n = 100; int sum = (1 + n) * n >> 1; System.out.println(sum); System.out.println(sum == 5050 ? “测试通过” : “测试失败”); } } |
---|
浮点运算
关键词 运算误差 类型提升 溢出 强制转型 |
---|
| 笔记栏
浮点数只能进行加减乘除这些数值计算,不能做位运算和移位运算。
运算误差:浮点数常常无法精确表示
浮点数0.1无法精确表示,十进制的0.1换算成二进制是一个无限循环小数
正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数
类型提升:
参与运算的两个数有整形有浮点型,那么整型可以自动提升到浮点型
如果都是整形,结果也保留整形
溢出:浮点数运算在除数为0时,不会报错,但会返回几个特殊值:
NaN表示Not a Number
Infinity表示无穷大
-Infinity表示负无穷大
强制转型:浮点数强制转为整数,小数部分会被丢掉,超过整型最大值,返回最大值 | | —- |
| 总结栏
练习
public static void _main(String[] args) {
_double _a = 1.0;
_double _b = 3.0;
_double _c = -4.0;
// 求平方根可用 Math.sqrt():
// System.out.println(Math.sqrt(2)); ==> 1.414
double r = Math._sqrt(b b - 4 a c);
_double _r1 = ( - b + r)/2a ;
_double _r2 = (- b - r)/2*a;
System._out_.println(r1);<br /> System._out_.println(r2);<br /> System._out_.println(r1 == 1 && r2 == -4 ? "测试通过" : "测试失败");<br />} |
| —- |
布尔运算
关键词 运算符优先级 短路运算 三元运算符 |
---|
| 笔记栏
布尔运算是关系运算,布尔类型只有true和false两个值
关系运算符及优先级:
非运算:!
比较运算符:>,>=,<,<=
比较运算符:==,!=
与运算:&&
或运算:||
短路运算:布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果
false && x的结果总是false,确定第一个为false,直接返回false
true || x的结果总是true,确定第一个为true,直接返回true
三元运算符:b ? x : y 根据布尔值b的结果,true返回x,false返回y | | —- |
| 总结栏
练习
判断指定年龄是否是小学生(6~12岁):
public static void _main(String[] args) {
_int _age = 7;
// primary student的定义: 6~12岁
boolean isPrimaryStudent = age >= 6 && age <= 12;
System._out.println(isPrimaryStudent ? “Yes” : “No”);
} |
| —- |
字符和字符串
关键词 字符类型 字符串类型 字符串连接 多行字符串 不可变特性 空值 |
---|
| 笔记栏
字符类型(char),基本类型,保存一个Unicode字符,单引号表示
英文字符、中文字符都用char类型表示,占用2个字节
显示字符的Unicode编码:int n1 = ‘A’; // 字母“A”的Unicodde编码是65
直接用转义字符\u+Unicode编码来表示一个字符:char c3 = ‘\u0041’; // ‘A’,因为十六进制0041 = 十进制65
字符串类型(String),引用类型,双引号表示
特殊字符需要使用转义字符:
\“ 表示字符”
\‘ 表示字符’
\\ 表示字符\
\n 表示换行符
\r 表示回车符
\t 表示Tab
\u#### 表示一个Unicode编码的字符
字符串连接,使用+连接任意数据类型,先将其他类型转为字符串类型再连接
多行字符串,Java 13开始,用”””…”””表示多行字符串
不可变特性:字符串内容不可变
空值(null):引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。
null与””:空字符串””是一个有效的字符串不等于null |
| —- |
| 总结栏
练习
请将一组int值视为字符的Unicode编码,然后将它们拼成一个字符串:
public static void _main(String[] args) {
// 请将下面一组int值视为字符的Unicode码,把它们拼成一个字符串:
int _a = 72;
_int _b = 105;
_int _c = 65281;
// String s1 = a + b + c ; // 提示错误,编译不通过
_String s2 = (_char)a + (char)b + (char)c + “”; // 先计算3个字符的整数相加值,再转为字符串
_String s3 = “” + a + b + c + “”; // 将三个字符的整数值进行拼接
String s4 = “” + (_char)a + (char)b + (char)c; // 正解,后续的字符都当成字符串处理
_System._out.println(“\ns2:” + s2 + “\ns3:” + s3 + “\ns4:” + s4);
} |
| —- |
数组类型
关键词 定义数组 数组特点 数组大小不可变 字符串数组 |
---|
| 笔记栏
类型相同的一组变量,使用数组类型“类型[]”定义,如:int[] ns = new int[5];
特点:
需指定数组大小,int[5]表示一个可以容纳5个int元素的数组
元素初始化:整型都是0,浮点型是0.0,布尔型是false
数组一旦创建后,大小就不可改变
使用索引访问元素,索引从0开始,变量名[索引]:ns[0]、ns[1]……
赋值语句,变量名[索引] = x:ns[2] = 79;
获取数组大小,变量名.length:ns.length
引用类型,索引超出范围,报错
定义时指定初始化元素,编译器自动推断数组大小:int[] ns = new int[] { 68, 79, 91, 85, 62 }; ,简写-> int[] ns = { 68, 79, 91, 85, 62 };
字符串数组:数组中的元素类型是引用类型 | | —- |
| 总结栏
| | —- |
流程控制
输入输出
关键词 输出 格式化输出 占位符 输入 |
---|
| 笔记栏
输出:System.out.println()向屏幕输出一些内容
println:换行
print:不换行
格式化输出:使用System.out.printf(),通过使用占位符%?,printf()可以把后面的参数格式化成指定格式
占位符:
%d 格式化输出整数
%x 格式化输出十六进制整数
%f 格式化输出浮点数
%e 格式化输出科学计数法表示的浮点数
%s 格式化字符串
%表示占位符,连续两个%%表示一个%字符本身
详细的格式化参数请参考JDK文档java.util.Formatter
输入:创建Scanner对象并传入System.in
scanner.nextLine() 读取用户输入的字符串
scanner.nextInt() 读取用户输入的整数
|
| —- |
| 总结栏
| | —- |
if判断
关键词 基本语法 else 多个判断串联 判断顺序 边界问题 判断引用类型相等 |
---|
| 笔记栏
基本语法:
if (条件) {
// 条件满足时执行
}
if语句包含的块可以包含多条语句
语句块只有一行语句时,可以省略花括号{},但是不建议省略
else:当条件判断为false时,将执行else的语句块:
语法:if(条件){
// 为true时,执行的语句块
}else{
// 为false时,执行的语句块
}
多个判断串联:if……else if ……
判断语句的执行顺序:
从上到下,可能出现前面的条件成功后导致跳过后续条件,所以正确方式是判断范围从大到小
也可以借用这个特性,优先过滤掉不符合条件的大部分数据
判断引用类型相等
值是否相等,用==
对于引用类型,==表示引用的变了是否相等即存储地址是否相等
引用类型,应该使用equals()方法
引申:引用变量为null,使用时会报NullPointerException
s1 != null && s1.equals(“hello”),避免对象为空的情况
或者比较时把非空的变量放在前面:”Hello”.equals(a)
边界问题
常见的一个例子,循环中跳出,i < 10时结束循环,注意i开始的序号以及i=10时此循环是跳出还是最后一次执行
减少复杂度
条件合并
条件反转 |
| —- |
总结栏 练习 请用if … else编写一个程序,用于计算体质指数BMI,并打印结果。 BMI = 体重(kg)除以身高(m)的平方 BMI结果: 过轻:低于18.5 正常:18.5-25 过重:25-28 肥胖:28-32 非常肥胖:高于32 public static void _main(String[] args) { BigDecimal weight = _new _BigDecimal(“”); BigDecimal hight = _new _BigDecimal(“”); _double _BMI = weight.divide(hight, 2, RoundingMode._HALF_UP).doubleValue(); if (BMI < 18.5) { System.out.println(“过轻”); } else if (BMI < 25) { System.out.println(“正常”); } else if (BMI < 28) { System.out.println(“过重”); } else if (BMI < 32) { System.out.println(“肥胖”); } else { System.out.println(“非常肥胖”); } } |
---|
switch多重选择
| 关键词
语法
break
default
转if
执行语句相同
顺序
字符串、枚举
表达式
赋值
yield
| | —- |
| 笔记栏
swith(表达式){
case X1 :
执行代码;
break;
case X2 :
执行代码;
break;
}
根据表达式计算结果,匹配case结果,遇到break结束执行
如果没有加break会继续执行后续的语句,直到遇到break或者switch结束,可能匹配多个结果造成执行结果错误
添加default,未匹配任何选项,执行default
swith相当于多个if……else if……
多个case的执行语句相同可以写
case 2 :
case 3 :
System.out.println(“Hello World!”);
break;
case的顺序不影响程序逻辑,但是建议以自然顺序排列,方便阅读
switch也支持字符串、枚举
表达式(Java 12):使用->
不用再写break
多条执行语句用{}括起来
赋值
复杂语句返回值,用yield | | —- |
| 总结栏
| | —- |
while循环
| 关键词
语法
先判断再循环
死循环
| | —- |
| 笔记栏
语法
while (条件表达式) {
循环语句
}
在每次循环开始前,首先判断条件是否成立,成立执行,不成立结束循环
有可能一次都不执行
循环条件永远满足,造成死循环,导致100%的CPU占用 | | —- |
| 总结栏
| | —- |
do while循环
| 关键词
语法
至少执行一次
| | —- |
| 笔记栏
语法
do {
执行循环语句
} while (条件表达式);
先执行一次循环语句,再进行判断,条件满足时继续循环 | | —- |
| 总结栏
| | —- |
for 循环
| 关键词
语法
计数器
for each
| | —- |
| 笔记栏
使用最广泛。使用计数器实现,每次循环前检查循环条件,循环后更新计数器。
语法
for (初始条件; 循环检测条件; 循环后更新计数器) {
// 执行语句
}
计数器可以在循环内修改,但是为了避免不必要的错误,正常都写在for()语句中
计数器同样也可以定义在外面
for循环还可以缺少初始化语句、循环条件和每次循环更新语句
for each循环遍历,访问数组的每一个元素
语法:
for (元素类型 x : 数组) {
// 执行语句
} |
| —- |
| 总结栏
| | —- |
break和continue
| 关键词
break
continue
作用域
| | —- |
| 笔记栏
break结束循环
通常与if一起使用,达到某个条件之后结束循环
continue结束本次循环,开始下个循环
通常与if一起使用,跳过某些条件
break和continue的作用域都是最近一层的循环 | | —- |
| 总结栏
| | —- |
数组操作
遍历数组
| 关键词
for循环遍历
while循环
| | —- |
| 笔记栏
数组最常见的一个操作就是遍历
索引从0开始
索引范围为数组长度
for each更加简洁,但是拿不到元素的索引
while需要借助Iterator
public static void _main(String[] args) {
_int[] arrays = {1, 2, 3, 4};
Iterator
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
} |
| —- |
| 总结栏
| | —- |
数组排序
| 关键词
冒泡排序
插入排序
快速排序
Arrays.sort();
| | —- |
| 笔记栏
冒泡排序:每轮循环之后,最大的数被排在最前或者最后
插入排序:从第二个数开始,与之前的数进行比较,小于的话则交换2者顺序
取一个数作为中位数,小于中位数的放置于左边,大于的放置于右边,左边跟右边的数据重复同样的操作
JDK内置的Arrays.sort()排序方法 | | —- |
| 总结栏
| | —- |
多维数组
| 关键词
二维数组
Arrays.deepToString
三维数组
| | —- |
| 笔记栏
二维数组:数组的数组
访问二维数组的某个元素需要使用array[row][col]
二维数组的array[0]指向二位数组的第一个数组
二维数组每个数组长度不要求相同
Java标准库的Arrays.deepToString()打印二维数组
三位数组:二位数组的数组
访问三维数组的某个元素array[index][row][col]
理论上可以定义任意维度数组 |
| —- |
| 总结栏
| | —- |
命令行参数
| 关键词
main方法
| | —- |
笔记栏 Java程序的入口是main方法,main方法可以接受一个命令行参数,是一个String[]数组 由JVM接收用户输入并传给main方法 必须在命令行执行 接收到参数后自行解析 |
---|
| 总结栏
| | —- |
面向对象编程
面向对象基础
| 关键词
面向对象
class和instance
field
创建实例
访问属性
| | —- |
| 笔记栏
面向对象编程:通过对象的方式,把现实世界映射到计算机模型的一种编程方法。举例:现实世界中定义了“人”这种抽象概念,对应到代码中可以定义为一个类(class),而具体的个人则是实例(instance)
class和instance:
class是一个对象模板,定义了如何创建实例,是一种数据类型
instance是根据class创建的对象实例,可以创建多个instance,每个instance类型相同,但各自属性可能不相同 |
| —- |
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
| 关键词
| | —- |
笔记栏 |
---|
| 总结栏
| | —- |
该文档使用了 康奈尔笔记法 模板,点击立刻体验 |
---|