day1(7.19)
一. 阶段一 JavaSE基础
#第一章. JAVA基础语法
1-1.java概述
JRE 和 JDKF
JRE : JRE是 Java Runtime Environment 缩写,指Java运行环境,包含 JVM 虚拟机及 Java 核心类库。
类 :java 文件在代码中的集合体现
类库:存放多个 java 文件的仓库
###JDK、JRE 和 JVM 的关系
![image-20220725192934930](https://i-blog.csdnimg.cn/blog_migrate/83b5ed85384f7f464bb450a1a13bc637.png)
JDK的安装目录
![image-20220725193109294](https://i-blog.csdnimg.cn/blog_migrate/98f3d274b3be1dd3e96e49f9429d7cb7.png)
1-2. 第一个java程序
常用 DOS 命令
![image-20220725193320459](https://i-blog.csdnimg.cn/blog_migrate/5fbc38449a017a98e9b7d7fca03fef55.png)
Path 环境变量的配置
-
为什么要配置环境变量
作用:能够在任意目录(文件夹路径)下, 都能访问到bin目录中的javac和java工具
###HelloWorld
- public : 目前可以看到的效果是,起到限制作用,要求文件名和类名称保持一致, 且一个文件中可以出现多个类, 但只有一个能被public修饰.
1-3. 基础语法
###常量分类
![image-20220725193923882](https://i-blog.csdnimg.cn/blog_migrate/1d1cd3907b47fd22e984b636becd30db.png)
数据类型内存占用和取值范围
![image-20220725194102961](https://i-blog.csdnimg.cn/blog_migrate/3e5a05d3d72542262ff359bd4b21ddfb.png)
###变量的注意事项
- 变量的作用域在定义变量时的大括号内
* 变量名不允许重复定义
* 一条语句可以定义多个变量
* 变量在使用之前一定要进行赋值
* 定义float和long变量的注意事项
* 变量的作用域范围
标识符
-
常见命名约定
类型转换
- 隐式转换
* 小的数据类型,和大的数据类型运算,小的会提升为大的之后,再进行运算
* 特殊关注:byte short char 三种数据在运算的时候,不管是否有更高的数据类型,都会提升为int,然后再进行运算
- 强制转换
注意:强制类型转换,有可能会发生精度损失
day2(7.20)
1-4. 运算符
算术运算符
- 当(byte short char int)在一起运算的时候,都会提升为int之后,再进行运算
- char提升为int的过程,就是查找码表中,字符所对应的数值表示形式
赋值运算符
![image-20220725195542341](https://i-blog.csdnimg.cn/blog_migrate/74800fda2b5c3cfceb7d775d36ca2859.png)
###关系运算符
- 关系运算符的结果都是boolean类型,要么是true,要么是false。
- 千万不要把“==”误写成“=”。
逻辑运算符
![image-20220725195744496](https://i-blog.csdnimg.cn/blog_migrate/000f191a316094dd88a88cfb01b3bb22.png)
![image-20220725195815903](https://i-blog.csdnimg.cn/blog_migrate/fe61fe7c69387ad7cf734d85f336b280.png)
三元运算符
![image-20220725195919221](https://i-blog.csdnimg.cn/blog_migrate/3e283ec1156d8a4626e28dda3d268ca1.png)
1-5. 分支语句
switch语句
![image-20220725200420476](https://i-blog.csdnimg.cn/blog_migrate/06a52f9aa1007ca5f672a3e64d4ca83a.png)
注意事项:
* case给出的值不允许重复
* case后面的值只能是常量,不能是变量
- case穿透现象
* 注意:在switch语句中,如果case控制的语句体后面不写break,将出现穿透现象
* 当开始case穿透,后续的case就不会具有匹配效果,内部的语句都会执行,直到看见break,或者将整体switch语句执行完毕,才会结束。
*应用场景:当发现switch语句中,多个case给出的语句体出现了重复的,就可以考虑使用case穿透来优化代码。
![image-20220725204619255](https://i-blog.csdnimg.cn/blog_migrate/ddcb7ed59055f60d889c75c957b87256.png)
day3(7.22)
1-6. 循环语句
while循环语句格式
![image-20220725205114482](https://i-blog.csdnimg.cn/blog_migrate/aff9dcc932fc4a0040317f7ab019242d.png)
do…while循环语句
三种循环的区别
- 三种循环的区别:
* for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
* do...while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断
- for和while的区别:
* 条件控制语句所控制的自增变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
* 条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
- 死循环格式:
for(;;) { }
while(true) { }
do{ }while(true);
while的死循环格式是最常用的
命令提示符窗口中Ctrl+C可以结束死循环
跳转控制语句
- continue 用在循环中,基于条件控制,跳过某次循环体内容的执行,继续下一次的执行
- break 用在循环中,基于条件控制,终止循环体内容的执行,也就是说结束当前的整个循环
Random
day4(7.23)
1-7. 数组
动态初始化
- 范例: int [ ] arr = new int[3];
Java中内存分配
栈内存:方法运行时,进入的内存,局部变量都存放于这块内存当中
堆内存:new出来的内容都会进入堆内存,并且会存在地址值
方法区:字节码文件(.class文件)加载时进入的内存
本地方法栈:调用操作系统相关资源
寄存器:交给CPU去使用
- 数据类型默认值
![image-20220725210158473](https://i-blog.csdnimg.cn/blog_migrate/ef03ff44cd20f02b18a1ace933820efd.png)
- 引用数据类型:引用、记录了地址值的变量,所对应的数据类型,就是引用数据类型
静态初始化
-
范例: int [ ] arr = new int[ ] { 1 , 2 , 3 } ;
-
范例: int [ ] arr = { 1 , 2 , 3 } ;
day5(7.25)
##1-8. 方法
###方法调用过程
-
方法没有被调用的时候,都在方法区中的字节码文件(.class)中存储
-
方法被调用的时候,需要进入到栈内存中运行
![image-20220725184951068](https://i-blog.csdnimg.cn/blog_migrate/7d109c86969d6f82b13094cbb33ba935.png)
###带参数方法的定义和调用
形参和实参
形参:全称形式参数,是指方法定义中的参数
实参:全称实际参数,方法调用中的参数
带返回值方法的定义和调用
方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
方法的注意事项
* 方法不能嵌套定义
* 方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return语句不写
如果要编写return,后面不能跟具体的数据。
* return语句下面,不能编写代码,因为永远执行不到,属于无效的代码
方法的参数传递
- 对于基本数据类型的参数,形式参数的改变,不影响实际参数的值
- 对于引用类型的参数,形式参数的改变,影响实际参数的值
- 所以, 利用这一点, 基本不需要返回引用数据类型
day6
1-9. Debug&位运算&二维数组
-
debug过程中if语句中的括号的布尔值可以把鼠标放上去查看
-
debug中遇到键盘录入时, 需要录入, 不然会卡住
二维数组
-
动态初始化
* 格式1:数据类型[][] 变量名; * 格式2:数据类型 变量名[][]; * 格式3:数据类型[] 变量名[];
-
静态初始化
* 格式:数据类型 [][] 变量名 = new 数据类型[][]{{元素1,元素2},{元素1,元素2}}; * 简化格式:数据类型 [][] 变量名 = {{元素1,元素2},{元素1,元素2}}; 或 * int arr[][] = {arr1,arr2,arr3}
-
二维数组的遍历
![image-20220726182046366](https://i-blog.csdnimg.cn/blog_migrate/9aec6d01a475fd342fdf280b2a82419e.png)
进制
-
不同进制的书写格式
* 十进制:Java中,数值默认都是10进制,不需要加任何修饰。 * 二进制:数值前面以0b开头,b大小写都可以。 * 八进制:数值前面以0开头。 * 十六进制:数值前面以0x开头,x大小写都可以。
注意:以上内容是jdk7版本之后才被支持。
进制转换
-
任意进制到十进制的转换
* 公式:系数 * 基数的权次幂 相加 系数:每一【位】上的数 基数:几进制,就是几 权:从数值的右侧,以0开始,逐个+1增加
-
进制到任意进制的转换
* 公式:除基取余 使用源数据,不断的除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着拼起来即可
源码反码补码
强转过后,都是补码状态
-
原码反码补码介绍
注意:计算机中的数据,都是以二进制补码的形式在运算,而补码则是通过反码和原码推算出来的。
-
源码(可直观看出数据大小)
* 原码(可直观看出数据大小) 就是二进制定点表示法,即最高位为符号位,【0】表示正,【1】表示负,其余位表示数值的大小。 通过一个字节表示+7和-7,代码:byte b1 = 7; byte b2 = -7; 一个字节等于8个比特位,也就是8个二进制位 0(符号位) 0000111 1(符号位) 0000111
-
反码
* 正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
-
补码(数据以该状态进行运算)
* 正数的补码与其原码相同;负数的补码是在其反码的末位加1。 * 也可以通过补码反向推导源码
###位运算
位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行运算。
在二进制位运算中,1表示true,0表示false。
- 位运算符介绍
![image-20220726190544499](https://i-blog.csdnimg.cn/blog_migrate/d720dd0282e4ddb0eb59b8f03bd83f19.png)
-
& 位与 : 遇false则false, 遇0则0
00000000 00000000 00000000 00000110 // 6的二进制
& 00000000 00000000 00000000 00000010 // 2的二进制
00000000 00000000 00000000 00000010 // 结果: 2 -
| 位或 : 遇true则true, 遇1则1
-
^ 位异或 : 相同为false, 不同为true
* 异或运算的特点 * 一个数,被另外一个数,异或两次,该数本身不变。
-
~ 取反 : 全部取反, 0变1, 1变0 (也包括符号位)
00000000 00000000 00000000 00000110 // 6的二进制补码
~ 11111111 11111111 11111111 11111001
-
1 // -1求反码
11111111 11111111 11111111 11111000 // 反码推原码 10000000 00000000 00000000 00000111 // -7
-
位移运算符
-
<< : 有符号左移运算,二进制位向左移动, 左边符号位丢弃, 右边补齐0
运算规律: 向左移动几位, 就是乘以2的几次幂
12 << 2 (0)0000000 00000000 00000000 000011000 // 12的二进制
>>: 有符号右移运算,二进制位向右移动, 使用符号位进行补位运算规律: 向右移动几位, 就是除以2的几次幂
000000000 00000000 00000000 0000001(1) // 3的二进制
-
>>> 无符号右移运算符, 无论符号位是0还是1,都补0 010000000 00000000 00000000 00000110 // -6的二进制 (h)
day7
#第二章. 面向对象基础
2-1. 类与对象
- 面向对象和面向过程的思想对比
面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的
面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的功能
- 垃圾回收
注意:当堆内存中,对象或数组产生的地址,通过任何方式都不能被找到后,就会被判定为内存中的“垃圾”
垃圾会被Java垃圾回收器,空闲的时候自动进行清理
- 什么是成员变量和局部变量
成员变量:类中方法外的变量
局部变量:方法中的变量
###成员变量和局部变量区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中方法外 | 方法内或者方法声明上(形参) |
内存中位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用完毕而消失 |
初始化值不同 | 有默认的初始化值 | 没有默认的初始化值,必须先定义,赋值,才能使用 |
##2-2 关键字及构造方法
private关键字
是一个权限修饰符
可以修饰成员(成员变量和成员方法)
被private修饰的成员只能在本类中才能访问
针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
this关键字
-
局部变量和成员变量如果重名,Java使用的是就近原则
-
this关键字的作用:可以调用本类的成员(变量, 方法), 解决局部变量和成员变量的重名问题
当方法内局部变量和成员变量重名的时候,必须使用this进行区分,如果没有出现重名的现象,可以省略this不写!
- this:代表所在类的对象引用, 记住:方法被哪个对象调用,this就代表哪个对象
this相当于汉字"我",this表示当前对象,哪个对象正在调用方法,那么这个方法内的this表示的就是那个对象;
###封装
隐藏实现细节,仅对外暴露公共的访问方式
- 封装常见的体现:
1、私有成员变量,提供setXxx和getXxx方法
2、将代码抽取到方法中,这是对代码的一种封装
3、将属性抽取到类当中,这是对数据的一种封装
- 封装的好处:
1、提高了代码的安全性
2、提高了代码的复用性
构造方法
- 构造方法的注意事项
构造方法的创建
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
构造方法的重载
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
推荐的使用方式
无论是否使用,都手动书写无参数构造方法,和带参数构造方法
day8
#第三章. API基础
- API
应用程序编程接口;可以简单一点理解就是别人提前写好的代码!
- api文档
为了方便程序员使用别人提前准备好的api,通常api都会有一个对应的api文档,api文档相当于是一套代码的使用说明书;
Scanner
next() : 遇到了空格, 就不再录入数据了
结束标记: 空格, tab键
nextLine() : 可以将数据完整的接收过来
结束标记: 回车换行符
nextLine不建议和其他方法一块使用
* nextInt和nextLine方法配合使用的时候, nextLine方法就没有键盘录入的机会了
* 建议: 今后键盘录入数据的时候, 如果是字符串和整数一起接受, 建议使用next方法接受字符串.
3-1 String常用方法
###String概述
* String 类在 java.lang 包下,所以使用的时候不需要导包. lang包下不需要导包
* String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例
也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象
* 字符串不可变,它们的值在创建后不能被更改(不可变性)
- String字符串的特点
* Java 程序中所有的双引号字符串,都是 String 类的对象
* 字符串不可变,它们的值在创建后不能被更改
* 虽然 String 的值是不可变的,但是它们可以被共享
String类常见构造方法:
public String() : 创建一个空白字符串对象,不含有任何内容
public String(char[] chs) : 根据字符数组的内容,来创建字符串对象
public String(String original) : 根据传入的字符串内容,来创建字符串对象
String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
注意:
String这个类比较特殊, 打印其对象名的时候, 不会出现内存地址, 而是该对象所记录的真实内容.
面向对象-继承, Object类
创建字符串对象的区别对比
内存图视频请见–阶段一 JavaSE基础: 3-1-05 创建字符串对象的区别对比
- 构造方法能创建对象,双引号也能创建字符串对象,有什么区别吗?
* 以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,
JVM 都只会建立一个 String 对象,并在字符串常量池中维护
* 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
* 双引号创建的字符串对象,在字符串常量池中存储,通过构造方法创建的字符串对象,在堆内存中存储
* 字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在
不存在:创建
存在:不会重新创建,而是直接复用
* 注意:字符串常量池在JDK7版本开始从方法区中挪到了堆内存
- 一个加号,堆内存中俩对象
字符串的比较
-
使用 == 做比较
基本类型:比较的是数据值是否相同 引用类型:比较的是地址值是否相同
-
字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()
String常用方法
![image-20220729183907050](https://i-blog.csdnimg.cn/blog_migrate/da7dfb304e8dee034b8d6b989dc53b48.png)
![image-20220729184148331](https://i-blog.csdnimg.cn/blog_migrate/27a55436bfb4654a0ca85f9a4e3cc97d.png)
* toUpperCase: 转大写
* toLowerCase: 转小写
* 找索引:
indexOf(""): 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
lastIndexOf(""): 返回指定字符在此字符串中最后一次出现处的索引。
* boolean startsWith(String prefix, int toffset)
测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
* boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
- 对字符串的切分
空白字符串(长度为0的字符串)留头不留尾, 前面有的话会留下一个长度为0的字符串;
如果以点为分割的时候,需要写成 \\. 即可
##3-2 StringBuilder
StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器
* StringBuilder和String的区别:
String :内容是不可变的
StringBuilder:内容是可变的
- 作用:提高字符串的操作效率, 同时还提供了一些字符串的简单操作;(例如字符串反转)
###构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
常用方法
方法名 | 说明 |
---|---|
public StringBuilder append (任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
public int length() | 返回长度 ( 字符出现的个数) |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
- StringBuilder提高效率原理图
内存图请见: 阶段一 JavaSE基础 3-2-18
StringBuilder 和 String 相互转化
- 为什么要将String转成StringBuilder?
答: 因为如果想对字符串进行拼接,或反转,Sting自身拼接效率低,且没有反转的功能,而StringBuilder拼接效率高,且可以反转,所以此时需要将String转成StringBuilder再
- 为什么要将StringBuilder转成String?
答: 因为StringBuilder没有比较内容是否相同的功能,如果需要比较两个字符串的内容是否相同,需要使用STring的equals方法才能完成!
- StringBuilder 转换为 String
public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
- String 转换为 StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
day9
##3-3 集合的常用方法
ArrayList
- ArrayList构造方法和添加方法
方法名 | 说明 |
---|---|
public ArrayList() | 创建一个空的集合对象 |
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
- ArrayList集合常用方法
方法名 | 说明 |
---|---|
public boolean remove(Object o) | 删除指定的元素(只能删除第一个),返回删除是否成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |
###ArrayList案例
- 案例:集合删除元素
需求:创建一个存储String的集合,内部存储(test,张三,李四,test,test)字符串
删除所有的test字符串,删除后,将集合剩余元素打印在控制台
思路:
1.创建集合对象
2.调用add方法,添加字符串
3.遍历集合,取出每一个字符串元素
4.加入if判断,如果是test字符串,调用remove方法删除
5.打印集合元素
为什么不用remove方法?
remove方法只能删除第一个
正向遍历配合i- - , 逆向遍历可以不需要
学生管理系统
- 删除/修改学生学号不存在问题
思路:定义一个方法,该方法用于从集合中,查找【学号】在【集合】中出现的索引位置
public static int getIndex(ArrayList<Student> list, String sid) {
...
}
学号存在:返回正确的索引位置
学号不存在:返回 -1