导图社区 JavaSe
这是一篇关于JavaSe的思维导图,主要内容包括:反射,注解,线程和进程,IO流,集合,常用类,面向对象,数组,方法重载overload,return关键字,方法,多重循环,关键字break和continue,for循环,do...while循环,while循环,switch分支,if分支结构,Scanner,局部变量,常量,命名规范,运算符,类型。
编辑于2024-07-12 14:54:10JavaSe
单位换算
1TB = 1024GB
1GB = 1024MB
1MB = 1024KB
1KB = 1024Byte
1Byte = 8bit
Dos命令
dir
查看当前文件夹内容
cd 文件夹名
进入文件夹
cd ..
进入上层文件夹
cd \
进入根目录
cls
清屏
exit
退出终端
JDK、JRE和JVM
JVM
Java虚拟机 JVM相当于一个软件 在不同的平台模拟相同的环境 以实现跨平台的效果
JRE
Java运行环境,包含`JVM` 和运行时所需要的`核心类库`
JDK
Java开发工具包 ,包含`JRE` 和开发人员使用的工具
三者关系:JDK包含 JRE JRE包含JVM
关键字
被Java官方赋予了特殊含义的单词 全部小写
关键字众多,不需要记忆,注意后续取名字避免和关键字冲突即可
注释
用于对代码进行解释说明的文字 就是注释 ,不参与编译,只是起到解释说明的作用
单行注释
多行注释
文档注释
变量
变量就是用来记录数据的
变量的定义方式
先声明,再赋值
声明的同时赋值
同时声明多个类型的变量
基本数据类型
整数类型
byte
short
int
long
浮点类型
float
double
布尔类型
boolean
字符类型
char
转义符
\t
锁进
\n
换行
\r
回车
\\
反斜线
\'
单引号
\"
双引号
String类型
string是JDK提供的一个类 属于引用数据类型 任何英文双引号包括的内容 都是字符串
类型转换
自动类型转换
两种类型要相互兼容
等号左边取值范围大于等号右边
强制类型转换
两种数据类型要相互兼容
等号左边取值范围小于等号右边
运算符
算术运算符
+
-
*
/
%
++
--
赋值运算符
=
+=
-=
*=
/=
%=
关系运算符
>
<
=
>=
<=
==
!=
逻辑运算符
&&
||
!
三目运算符
布尔表达式?结果1:结果2
命名规范
类名:由一个或者多个单词组成 ,每个单词首字母大写
变量名:字(字母) 下(下划线) 美(美元符号) 人(人民币符号) 数(数字) 骆驼(驼峰命名)
可以以字母 、下划线、美元符号、人民币符号开头,可以包含数字,不能以数字开头 实际开发中只推荐使用单词
常量
程序中无法改变的数据
局部变量
定义位置
定义在方法体内
作用范围
离当前变量最近的大括号以内
重名问题
作用范围以内不能重名
默认值
局部变量没有默认值,必须先初始化赋值
声明周期
随着方法的入栈而生效,随着方法的出栈而消亡
存储位置
基本数据存储在堆中
引用数据 名字在栈 值在堆
Scanner
是JDK提供的一个类 位于java.util包下 用来接收用户在控制台输入的信息
next()
nextByte()
nextInt()
nextShort()
nextLong()
nextFloat()
nextDouble()
nextBoolean()
if分支结构
基本if结构
if(布尔表达式){ //代码块1 }
执行流程: 对布尔表达式进行判断。 结果为true,则先执行代码块1,再执行后续代码。 结果为false,则跳过代码块1,直接执行后续代码。
if-else结构
if(布尔表达式){ //代码块1 }else{ //代码块2 }
对布尔表达式进行判断。 结果为true,则先执行代码块1,再退出整个结构,执行后续代码。 结果为false,则先执行代码块2,再退出整个结构,执行后续代码。
多重if结构
if(布尔表达式1){ //代码块1 }else if(布尔表达式2){ //代码块2 }else if(布尔表达式3){ //代码块3 }else{ //代码块4 }
嵌套if
switch分支
switch(变量|表达式){ case 值1: 逻辑代码1; case 值2: 逻辑代码2; case 值n: 逻辑代码n; default: 未满足时的逻辑代码; }
如果变量中的值等于值1,则执行逻辑代码1。 如果变量中的值等于值2,则执行逻辑代码2。 如果变量中的值等于值n,则执行逻辑代码n。 如果变量中的值没有匹配的case值时,执行default中的逻辑代码。
支持的数据类型“byte short int char String(JDK7+) 枚举
while循环
计数器初始化; while ( 循环条件 ) { 循环操作; 计数器变化; }
任何循环都有四个必不可少的部分: 1.计数器初始化 2.循环条件 3.循环体 4.计数器变化
while循环特点:先判断 后执行 如果条件不成立 则一次都不执行
do...while循环
计数器初始化; do { 循环操作; 计数器变化; }while ( 循环条件 );
do-while循环可以用于实现循环次数确定 以及 循环次数不确定的情况
for循环
for(计数器初始化 ; 循环条件 ; 计数器变化){ 循环体; }
关键字break和continue
break
可以用于switch或者循环结构中 分别表示跳出switch结构 或者 中断(跳出)循环
continue
只能用在循环中 表示跳过本次循环 继续执行下一次循环
多重循环
外层循环控制行数
内层循环控制列数
方法
实现某一特定功能的代码,可以重复性使用
方法名命名规范:小写驼峰 见名知义
在需要调用方法的位置直接书写方法名()即可调用
参数
单个参数
多个参数
形参
形式参数 表示在方法定义的时候书写的参数 形参规定了参数的 个数、类型、顺序
表示实参必须遵循形参的规定 即必须传入对应 个数 类型 顺序的 实参
实参
实际参数 表示方法在调用的时候实际传入的参数
return关键字
当前方法执行完以后返回什么数据 那么就定义什么返回值类型即可
方法声明返回值不是void 那么必须在方法体中使用return关键字返回对应的结果
返回值声明是void 也可以使用return 此时return只表示结束方法 不能返回内容
方法重载overload
同一个类中的方法 名称相同 参数列表不同(参数的个数、类型、顺序至少有一个)
数组
一组`连续`的存储空间,存储多个`相同`数据类型的值,长度是`固定`的
数组的定义
先声明、再分配空间: 数据类型[] 数组名; 数组名 = new 数据类型[长度];
声明并分配空间: 数据类型[] 数组名 = new 数据类型[长度];
声明并赋值(繁): 数据类型[] 数组名 = new 数据类型[]{value1,value2,value3,...};
声明并赋值(简): 数据类型[] 数组名 = {value1,value2,value3,...};
数组的遍历
逐一对数组中的元素进行访问
数组的长度
length
数组的默认值
整数 0
浮点数 0.0
字符 '0'
布尔 false
引用类型 null
值传递和引用传递的区别
基本数据类型属于'值传递',传递的就是值的副本,值的拷贝,在方法中对参数的修改不会影响原变量
引用数据类型属于'引用传递' 传递的是地址,也就是引用,在方法中对参数的修改会影响原变量
Arrays工具类
toString(数组名) : 将数组中的元素转换为字符串
copyOf(数组名,新长度) : 复制数组
sort(数组名) : 将数组按照升序排序 属于快速排序 实现原理为 递归
fill(数组名,填充元素) : 将数组按照指定元素进行填充
binarySearch(数组名,元素) : 使用二分查找法查找某个元素在数组中的下标
二维数组
面向对象
特征
属性
行为
方法
类和对象
类是一个抽象的概念
对象是一个具体的概念
实例变量
定义位置
类的内部,方法的外部
默认值
有默认值
使用范围
本类
命名冲突
可以和局部变量重名
存储位置
堆中
生命周期
随着对象的创建而产生,对象被GC回收而死亡
构造方法
访问修饰符 + 类名(){}
名称与类名完全相同。 没有返回值类型。 创建对象时,触发构造方法的调用,不可通过句点手动调用
如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法。如果定义了有参构造方法,则无参构造方法将会被覆盖,如需使用,必须显式书写。
this关键字
表示当前对象
可以访问本类的
实例属性
实例方法
构造方法,this访问构造方法 必须在本类构造的第一句
封装
属性私有
方法公开
高内聚、低耦合
访问修饰符
public > proetected > default > private
super
super用于访问父类的信息
super.属性名
super.方法名
super访问父类的构造方法
super() 必须在子类构造方法中的第一句
子类的每一个构造方法中 都默认访问(调用)父类的无参构造方法
继承
子类继承父类 子类与父类是is-a的关系
父类中书写各个子类共有的属性和方法
子类中书写独有的属性和方法
只支持单继承
私有的属性和方法 以及子类无法访问的属性和方法 是无法继承的
创建子类对象并不会创建父类对象 会执行父类的构造方法
static关键字
修饰属性
static修饰属性,称之为静态属性,也叫静态变量,也叫类变量
被static修饰的属性 不属于任何对象 属于当前类 可以被此类的所有对象共享 在内存中只存在一份
修饰方法
静态方法,本类中直接调用 其他类通过类名加点调用
静态方法 不同于静态属性 因为方法只有调用的过程 调用就会进栈
修饰代码块
随着JVM加载类而执行 多个静态代码块按照书写顺序执行 每个只执行一次 因为类只加载一次
普通/实例代码块是随着对象的创建而执行的 每创建一个对象 就执行一次
重写override
方法重写属于对父类方法的覆盖,所以如果需要继续使用父类方法的功能,则必须在子类中使用super关键字调用
存在于父子类之间
方法名称相同
参数列表相同
返回值相同,或者是其子类
访问权限不能严于父类 (不能窄化父类的访问权限)
静态方法可以被继承,但是不能被重写
不能抛出、声明比父类更多的异常
Object类
重写toString
重写equals
重写hashcode
多态
同一个引用类型,使用不同的实例而执行不同操作(父类引用指向子类对象)
父类引用指向子类对象属于向上转型,此时通过父类引用,
可以访问的是子类重写或者继承父类的方法 不能访问子类独有的方法
通过 对象名 instanceof 类名 判断,如果类型正确 则父类转换子类 不正确 则不转
表示判断左侧的对象是否属于右侧的类型及其子类 是则结果为true 不是则结果为false
抽象类abstract
抽象方法没有方法体 必须存在于抽象类 均使用abstract修饰
抽象类不能直接new对象 必须通过new子类的方式创建对象(多态向上转型)
子类必须重写抽象类中的所有抽象方法 除非子类也是抽象类
抽象类中可以书写普通属性 普通方法 静态方法 构造方法
抽象类作为父类 实现多态的方式与之前一致
final关键字
修饰属性
被final修饰的属性称之为常量
基本数据类型:值不能被改变
引用数据类型:地址不能被改变 地址中的内容(属性)是可以改变
修饰方法
final修饰的方法不能被子类重写
修饰类
final修饰的类不能被继承
接口Interface
接口中的方法默认都为全局抽象方法 即不管是否书写均使用public abstract修饰
接口不能直接new对象,必须通过子类来new对象,然后调用方法
实现类(子类)必须实现(重写)接口中的所有抽象方法 除非实现类是抽象类 或者 是 接口
接口中不能书写普通属性、普通方法、构造方法、静态方法
类支持单继承和多重继承,但类可以实现多个接口,接口也可以继承多个接口
异常
try...catch
fianlly
throw和throws
throws
用于在方法声明的位置 参数列表之后 声明当前方法可能会出现哪些异常 可以声明多个异常,多个异常使用逗号分割
throw
用于在方法体内抛出异常 一句只能抛出一个异常
自定义异常
继承异常父类 Throwable 、Exception 、RuntimeException 三者其中之一
调用父类中的有参构造完成异常信息的初始化
常用类
枚举类
包装类
基本数据类型--->包装类
valueOf
包装类--->基本数据类型
xxxValue
基本数据类型--->字符串
toString
字符串--->基本数据类型
parseXXX
Math
abs()
ceil
floor
max
min
random
round
System
currentTimeMillis()
getProperty
getProperties
clearProperty
exit
gc
nanoTime
arrayCopy
String
length
equals
toLowerCase
toUpperCase
concat
indexOf
subString
split
charAt
contains
stratswith
endwith
isEmpty
toCharArray
replace
Date
SimpleDateFormat
Calendar
LocalDate
now()
of()
LocalTime
now
of
LocalDateTime
now
of
设计模式
集合
Collection
List
ArrayList
常用方法
add
remove
set
get
clear
iterator
遍历方式
普通for循环
增强for循环
迭代器
数据结构
有序 有下标 允许重复 允许null元素 线程不安全
集合扩容:为原来数组长度的1.5倍
查询和修改块
增加和删除慢
Vector
ArrayList线程不安全 Vector线程安全 ArrayList无参构造维护长度为0空数组 Vector无参构造维护长度为10的数组 ArrayList扩容1.5倍 Vector扩容2倍 ArrayList不允许指定增量 Vector可以指定增量
LinkedArrayList
常用方法
add
remove
set
get
clear
iterator
遍历方式
普通for循环
增强for循环
迭代器
数据结构
有序 空间不连续 有下标 可以重复 允许null元素 线程不安全
双向链表 没有初始大小 没有上限大小 不需要扩容
查询、修改慢
增加、删除快
Set
HashSet
add
clear
remove
isEmpty
iterator
size
LinkedHashSet
有序的Set集合 顺序为根据元素插入的顺序 继承自 HashSet 底层实现为LinkedHashMap
TreeSet
有序的Set集合 顺序为根据元素比较的顺序 底层实现为TreeMap 最终父接口为 Set接口
Map
HashMap
常用方法
put
get
values
entrySet
size
replace
遍历方式
获取所有的键,根据键获取值
获取所有值
获取所有键值对的组合
获取所有所有键的迭代器
获取所有值的迭代器
获取所有键值对的迭代器
数据结构
JDK1.7 数组 + 单向链表 JDK1.8 数组 + 单向链表 + 红黑树
HashTable
HashMap是线程不安全的 Hashtable线程安全 HashMap使用懒加载思想 当我们第一次添加元素 将初始化长度为16的数组 Hashtable在调用无参构造即初始化长度为11数组 HashMap扩容为2倍 Hashtable扩容为2倍 +1
Properties
LinkedHashMap
LinkedHashMap一个有序的Map集合 顺序为添加顺序 继承自HashMap
TreeMap
TreeMap 有序的Map集合 顺序为根据键比较的顺序
IO流
File类
getName
getPath
isFile
isDirectory
length
exists
字节流
InputStream
FileInputStream
read
close
OutputStream
OutputStream
write
close
字符流
Reader
FileReader
BufferedReader
InputStreamReader
Writer
FileWriter
BufferedWriter
OutputStreamWriter
数据流
DataInputStream
DataOutputStream
对象流
ObjectInputStream
ObjectOutputStream
线程和进程
进程
进程 进行中应用 程序 属于资源分配的基本单位
线程
线程是包含在进程之中的 一个进程至少有一个线程 否则将无法运行 线程是CPU调度运算的基本单位
并发和并行
并发
同时发生 轮流交替执行 宏观同时执行 微观轮流交替执行
并行
严格意义上的同时执行
主线程
main方法为程序的入口 底层由main线程负责执行 由JVM自动调用执行
currentThread()
getName
setName
创建线程
继承Thread
实现Runnable接口
线程的状态
创建 就绪 运行 阻塞 死亡
线程的优先级
优先级越高越好 优先级高的线程只是获得CPU资源的概率较大 并不一定能够保证
Max_property=10
Norm_property = 5
Min_property = 1
线程的休眠
sleep(long millis) 让当前线程等待指定时间 然后再继续执行
线程的插队和礼让
join
yield
同步Synchronized
同步方法
同步代码块
多个并发线程访问同一资源的同步代码块时 同一时刻只能有一个线程进入synchronized(this)同步代码块 当一个线程访问一个synchronized(this)同步代码块时,其他synchronized(this)同步代码块同样被锁定 当一个线程访问一个synchronized(this)同步代码块时,其他线程可以访问该资源的非synchronized(this)同步代码
生产者和消费者模式
wait 等待
notify 唤醒
notifyall 唤醒全部
注解
元注解
@Target
TYPE
FIELD
METHOD
PARAMETER
CONSTRUCTOR
LOCAL_VARIABLE
ANNOTATION_TYPE
@Inherited
表示可以被子类继承
@Retention
CLASS
SOURCE
RUNTIME
@Documented
反射
获取class对象
getClass
forName
类名.class
使用类加载器
获取属性
获取方法
获取构造方法
获取注解