javaSE模块一笔记
第一阶段——模块一
一、计算机语言的发展
- 机器语言
- 汇编语言
- 高级语言:Java、Python、C等
二、Java语言的版本
- Java SE(Java Platfrom Standard Edition)称之为"Java平台标准版",是Java平台的基础。
- Java EE(Java Platform Enterprise Edition)称之为"Java平台企业版"。
- Java ME(Java Platform Micro Edition)称之为Java平台微型版。已经淘汰。
三、Java相关概念
- JDK: Java开发工具包
- JRE: Java程序运行时需要的环境
- JVM: Java 虚拟机,一种能够运行Java字节码的虚拟机。JVM把每一条要执行的字节码翻译成对应的机器码,然后由解释器执行。
- javac.exe: 编译器,主要用于将高级Java源代码翻译成字节码文件(.class文件,是一种特殊的二进制文件)。这里的字节码文件就是JVM的"机器语言",它是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的。
- java.exe: 解释器是JVM的一部分,主要用于启动JVM对字节码文件进行解释并执行,因为不同的硬件平台和操作系统对机器指令的识别规则是不一样的,所以JVM就将字节码文件解释成对应平台和系统的机器码来执行。从这里就体现出来的Java语言的跨平台性。
四、理解一处编译,到处运行(掌握)
自己总结:想要达到这样的目的,需要完成以下几步。
- 首先需要将Java源代码文件编译成JVM能够认识的字节码文件(特殊二进制文件)。如果不是跨平台的编译性语言,那么这个编译后的二进制文件就可以直接在该平台上执行了。
- 然后通过解释器将这个特殊的二进制文件解释成不同平台能够识别的机器码。比如,windows平台的JVM就会将这个特殊的二进制文件转化为windows平台能够执行的机器码。
五、JDK、JRE、JVM之间的关系
JDK包含JRE,而JRE又包含JVM
如果只需要运行Java程序,则只需要安装JRE就可以了。
六、变量(掌握)
本质是在内存中申请了一个存储单元,为了便于下次访问,还需要给该变量指定一个名字,用于记录该变量对应的存储单元。
1. 变量注意事项
- Java是强类型语言,在声明的时候需要指定变量类型。比如:Int age = 18;
- 在使用之前需要对变量初始化
- 变量不能重复声明
七、数据类型(掌握)
1. 基本数据类型(记住)
byte、short、int、long、float、double、boolean、char
1 2 4 8 4 8 1 2
数据类型范围从小到大排序(byte < char < short < int < long < float < double)
2. 引用数据类型(了解)
数组、类、接口、枚举、标注
八、进制之间的转换
1. 十进制转二进制
- 除2取余法:45 除以2,商22,余1;22除以2,商11,余0;11除以2,商5,余1;5除以2,商2,余1,;2除以2,商1,余0;1除以2,商0,余1。最后按照余数倒序排列,即101101。
- 拆分法:45 => 32 + 8 + 4 + 1, 对应二进制的权重(...32,16,8,4,2,1),有的就取1,没有的就取0。最后的结果是101101
2. 负十进制转换为二进制
- 第一步:将负数转化为整数,求其二进制
- 第二步:将第一步的结果按位取反,即0转换为1,1转换为0、
- 第三步:将第二步的结果再加1
九、单个字节所能表示的整数范围(掌握)
非负数所能表示的整数范围:0000 0000 ~ 0111 1111,即0 ~ 127
负数所能表示的整数范围:1000 000 ~ 1111 1111,即-128 ~ -1
因此,单个字节所能表示的整数范围为:-128 ~ 127
十、数据类型转换的注意事项
int i = 25;
byte b = i; // 这里会报错:不兼容的类型,从int转换为byte可能会有损失
System.out.println(b);
byte b1 = 25; // 这里是可以的
System.out.println(b);
// 解释原因:byte b = i是将一个int类型的变量i赋值给byte类型的b,这里的变量i的值是有可能改变的,如果i的取值超过了byte的取值范围,那肯定是不行的。所以这里在一开始就会报错,不管i的值是否超过byte类型的界限。
// 而byte b1 = 25,是将一个常量(直接量/字面值)赋值给b1,这时候编译器可以直接判断25是否是在byte类型的范围内,所以没有报错。
十一、字符类型(掌握)
要求掌握的ASCII码:'0' -48 , 'A' - 65, 'a' - 97, 空格 - 32, 换行符 - 10
Java字符类型采用的是Unicode字符集编码,Unicode是世界通用的定长字符集,所有的字符都是16位。
示例代码
char c3 = '\u738b'; // 王
char c4 = '\u6d9b'; // 涛
System.out.println(c3 + c4);
十二、数据类型强转的案例
示例代码
byte b = 10;
short s = 20;
s = 128;
b = (byte)s;
System.out.println(b); // -128
// 解释原因:short数据类型占两个字节,所以128表示成二进制为:0000 0000 1000 0000。现在需要将其转化为byte类型,而byte只占一个字节,所以,只能取0000 0000 1000 0000 的后八位,即1000 0000,并且byte类型的最高位表示符号位。因此,将1000 0000转换为10进制的结果为-128.
十三、运算符
1. 算数运算符++、--的使用
1.1 ++,--运算符前置
- 示例代码
int a = 3;
int b;
b = ++a + 10;
System.out.println(a);
System.out.println(b);
// 上面代码的输出结果a值为4,b值为14
- 总结:++,--运算符前置时,先将变量a的值自增1或者自减1,然后使用更新后的新值参与运算操作。
1.2 ++,--运算符后置
- 示例代码
int a = 3;
int b;
b = a++ + 10;
System.out.println(a);
System.out.println(b);
// 上面代码的输出结果a值为4,b值为13
- 总结:++,--运算符后置时,先使用变量a原有值参与运算操作,运算操作完成后,变量a的值自增1或者自减1。
1.3 笔试考点
int a = 3;
System.out.println(a++ + ++a) // 结果为8
2. 逻辑运算符的短路特性
- 对于逻辑与运算符来说,若第一个表达式为假则结果为假,此时跳过第二个表达式。
- 对于逻辑或运算符来说,若第一个表达式为真则结果为真,此时跳过第二个表达式。
3. 三元运算符
- 格式:(条件表达式)?表达式1:表达式2;
4. 赋值运算符(掌握)
4.1 注意事项
赋值运算符整体也是有值的
示例代码
int i = 5;
i = 7;
System.out.println(i = 7); // 结果为7
System.out.println(i); // 结果为7
4.2 笔试考点
byte b = 10;
System.out.println(b);
b = b + 2; //会报错:不兼容的类型,从int转换到byte可能会有损失。 说明 byte + int 的结果还是int类型。
b = b + (byte)2; // 还是会报上面相同的错误,从这里可以看出 byte + byte 的结果还是int类型,这是编译器做的优化。
b = byte(b + 2); // 强制类型转换,将int类型转化为byte类型
b += 2; // 实际上是真正等价于b = byte(b + 2);
System.out.println(b);
int i = 0;
i == 2; // 判断变量i的值是否等于2
2 == i; // 判断2是否等于变量i的值,从结果上看等价于 i == 2,但推荐使用此。
i = 2; // 将2赋值给变量1,并且将i原来的值覆盖。
2 = 1; // 报错
十四、流程控制
1. for循环
- for循环更适合明确循环次数的场合,但是不是只能用于该场合,无线循环也可以。
- for循环是判断条件成立后执行循环体
案例:使用for循环和break关键字模拟聊天过程,主要掌握变量flag的作用
import java.util.Scanner;
/**
* TODO 使用for循环和break关键字模拟聊天过程
* @author 凯尔王
* @date 2020年9月13日 上午7:54:48
*/
public class ForBreakTest {
public static void main(String[] args) {
// 声明一个布尔变量作为发送方标志
boolean flag = true;
// 使用无限循环
for(;;) {
// 1.提示用户要输入的聊天内容并用变量接收
System.out.println("请"+ (flag ? "张三": "李四") + "输入聊天内容:");
Scanner sc = new Scanner(System.in);
String str = sc.next();
// 2.判断用户输入的内容是不是"bye",如果是则聊天结束
if("bye".equals(str)) {
System.out.println("聊天结束");
break;
}
System.out.println((flag ? "张三": "李四") + "说: " + str);
flag = !flag;
}
}
}
2. 双重for循环
外层循环控制行,内层循环控制列。
2.1 案例
使用双重for循环打印图案
示例代码1
/**
* TODO 使用双重for循环打印如下图案
* *
**
***
****
*****
* @author 凯尔王
* @date 2020年9月13日 上午9:37:05
*/
public class DoubleForTest {
public static void main(String[] args) {
for(int i = 0; i < 5; i++) {
// 通过找规律发现,第一行打印一个*,第二行打印两个*,以此类推,所以每行j的取值的个数等于i
for(int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
示例代码2
/**
* TODO 使用双重for循环打印如下图案
* *****
****
***
**
*
* @author 凯尔王
* @date 2020年9月13日 上午9:37:05
*/
public class DoubleForTest2 {
public static void main(String[] args) {
for(int i = 0; i < 5; i++) {
// 这里就调过来了,j从5往下递减。
for(int j = 5; j > i; j--) {
System.out.print("*");
}
System.out.println();
}
}
}
示例代码3
/**
* TODO 使用双重for循环打印如下图案
* *
***
*****
*******
*********
* @author 凯尔王
* @date 2020年9月13日 上午9:37:05
*/
public class DoubleForTest3 {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++) {
// 控制每行空格的个数
for(int j = 1; j <= 5-i; j++) {
System.out.print(" ");
}
// 当前行的列数与当前行的行数为2*i -1 的关系
for(int j = 1; j <= 2*i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
示例代码4
/**
* TODO 编程使用双重for循环打印2~100之间的所有素数
* 素数的概念:只能被1和它本身整除的数就是素数
* @author 凯尔王
* @date 2020年9月13日 上午11:30:05
*/
public class ForFor {
public static void main(String[] args) {
for (int i = 2; i <= 100; i++) {
// 声明一个boolean类型的变量作为是否是素数的标记
boolean flag = true;
// 这里的优化在于Math.sqrt(i),只要循环到该数的平方跟就可以了,不用一直循环到该数-1.
for (int j = 2; j < Math.sqrt(i); j++) {
if(i % j == 0) {
flag = false;
break;
}
}
if(flag) {
System.out.println("i = " + i);
}
}
}
}
3. break关键字跳出多层循环
示例代码
/**
* TODO 使用双重for循环打印九九乘法表,并且在打印6*6=36之后退出
* @author 凯尔王
* @date 2020年9月13日 上午9:37:05
*/
public class DoubleForTest4 {
public static void main(String[] args) {
outer: for(int i = 1; i <=9; i++) {
// 这里就调过来了,j从5往下递减。
for(int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i*j + " ");
if(6 == j) {
break outer;
}
}
System.out.println();
}
}
}
4. switch语句的注意事项(掌握)
swtich()中支持的数据类型有int、short、char、byte类型,从jdk1.5开始支持枚举类型,从jdk1.7开始支持String类型
十五、数组
1. 数组的内存结构
1.1 内存结构之栈区
栈用于存放程序运行过程中所有的局部变量,一个运行的Java程序从开始到结束会有多次变量的声明
局部变量:在方法体中直接声明的变量就是局部变量
1.2 内存结构之堆区
JVM会在内存空间中开辟一个称为"堆"的存储空间,这部分空间用于存储使用new关键字创建的数组和对象。
2. 练习题目
public class ArrayInsertTest {
public static void main(String[] args) {
// 声明一个长度为5的int类型的数组
int[] arr = new int[5];
// 赋值
for (int i = 0; i < arr.length -1 ; i++) {
arr[i] = (i + 1) * 11;
}
// 打印
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// 将元素55插入到下标为0 的位置,原有元素向后移动,再打印所有元素
for (int i = arr.length - 1; i >= 0; i--) {
if(i == 0) {
arr[i] = 55;
}
else {
arr[i] = arr[i - 1];
}
}
System.out.println("-------------------");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
3. 数组的拷贝
// 方法1:System.arrayCopy(arr1, index1, arr2, index2, length);
// 方法2:Arrays.copyOf()
4. 数组工具类
java.utils.Arrays
4.1 常用方法(掌握)
- Arrays.toString(arr): 打印数组中的所有元素
- Arrays.fill(arr, val): 将指定的值赋值给数组中的所有元素
- Arrays.sort(arr): 对数组元素进行升序排序
- Arrays.binarySearch(arr, key):查找指定元素在数组中的位置。需要注意的是,如果查找的元素在数组中不存在,那么返回的结果是一个小于0的数,并不一定是-1。
5. 二维数组
5.1 考点
- 二维数组中的每个元素(即一维数组)的长度可以不一致。
int[][] arr = new arr[2][]
。
5.2 案例题目(了解)
使用二维数组实现杨辉三角
/**
* TODO 二维数组实现杨辉三角
* 1
11
121
1331
14641
* @author 凯尔王
* @date 2020年9月14日 下午8:18:20
*/
public class YangHuiSanJiaoTest {
public static void main(String[] args) {
// 声明一个二维数组,数组的长度固定
int[][] arr = new int[5][];
for (int i = 0; i < 5; i++) {
// 为二维数组的每一个元素再申请内存空间
arr[i] = new int[i + 1];
for (int j = 0; j <= i; j++) {
// 如果是每一行的第一个元素,或者行数和列数相等,则该位置的值为1
if(j == 0 || i ==j) {
arr[i][j] = 1;
}
// 否则该位置上的值等于上一行当前列和上一行前一列的值相加
else {
arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
}
}
}
// 打印结果
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print(arr[i][j]);
}
System.out.println();
}
}
}