JavaSE
2022-04-21 23:19:41 28 举报
AI智能生成
JavaSE 全流程详细思维导图
作者其他创作
大纲/内容
基础语法
1.HelloWorld
javac Hello.java
java Hello
2.注释
单行注释 //
多行注释 /* */
文档注释 /** */
javaDoc
@author
@version
@since
@param
@return
@throws
3.数据类型
基本数据类型
整数型
浮点型
字符型
布尔型
引用数据类型
字符串(String
)
)
数组(Array)
对象(Object)
4.类型转换
自动类型提升
向上转型(upcasting)
强制类型转换
向下转型(downcasting) 注:有可能导致精度丢失
5.运算符(operator)
算数运算符
+ - * / ++ --
赋值运算符
= += -= *= /= %=
关系运算符
> < >= <= == !=
逻辑运算符
&& || !
三目(三元)运算符
布尔表达式 ? 结果1 : 结果2
位运算符
& | ^ ~ >> << >>>
6.流程控制
分支
if
if 单选择结构
if-else 多选择
switch
jdk1.7后支持了String
case 穿透 (break)
default
循环(loop)
while
do...while
for
for(int i = 0; 条件 ; i++)
for( ; ; ) : 等同于while
嵌套循环
break & continue
break : 跳出循环
continue : 终止当次循环
return : 结束当前方法
7.变量(variable)
作用域
成员变量
类变量 (静态变量)
实例变量
局部变量
命名规范
见名知意
驼峰原则
变量|方法名 小驼峰
类名 大驼峰
常量:大写 下划线
8.数组(Array)
数组的初始化
静态初始化
{1,2,3,4,5}
动态初始化
new int[5]
默认值问题
数组特点
1、数组的长度不可变
2、数组的下标范围[0,length-1]
数组的遍历
普通for
增强for
数组的内存图
二维数组
二维数组的遍历
内存图
八大排序算法(arithmetic)
冒泡排序(Bubble Sort)
选择排序(Selection Sort)
插入排序(Insertion Sort)
希尔排序(Shell Sort) [较难]
快速排序(Quick Sort)
归并排序(Marge Sort)
基数排序(Radix Sort)
堆排序(Heap Sort)
二分查找(binary search)
稀疏数组
面向对象(OOP)
面向对象上
面向对象和面向过程思想对比
类与对象
类是对象的抽象;类是模板
对象是类的具体;对象是类的实例
创建类 创建对象
类
对象
成员变量
内存图
栈存放引用地址
堆存放具体对象
包(backage)
通常采用域名倒写
导包(import)
静态导入(import static)
方法(Method)
作用
方法声明和调用
修饰符 返回值 方法名(参数名){return 返回值;}
方法调用
静态方法: 类名.方法
非静态: 对象.方法
方法的形参与实参
成员变量和局部变量
值传递 & 引用传递
基本类型数据 - 值传递
引用类型数据 - 引用传递
内存图
方法的重载(overload)
方法名相同,参数列表不同,顺序个数不同
可变参数(parameter)
1.底层采用数组存储数据
2.实参的个数是0 - n个
3.可变参数必须位于参数列表的最后
递归(recursion)
递归调用
面向对象中
封装
权限修饰符
属性封装
set get
继承
如何实现继承
资源使用问题
方法重写*
@overwrite
super
this
Object 祖父类
多态
向上转型
Anmal a = new Dog()
编译时
运行时
向下转型
instanceof
控制权限
权限修饰符作用域
修饰符使用位置
虚方法与非虚方法
构造器(construction)
final关键字
static
实例化问题
对象实例化
类的初始化
面向对象下
抽象(abstract)
抽象类
抽象方法
is a的关系
接口(interface)
约束,只能定义方法名
实现接口必须要重写接口中的方法。
只有一个方法的接口叫做函数式接口,可以使用lambda表达式简化
接口的成员
内部类(Inner Class)
静态成员内部类
非静态成员内部类
局部内部类
匿名内部类
注解(annotation)
三种常见注解
@Override
@Deprecated
子主题
元注解: 修饰注解的注解,定义注解时使用
自定义注解
异常
1.异常体系
Throwable
Error
Exception
RunTimeException
IOException
2.异常处理
try{} chatch(){} finally
throw throws
3.自定义异常
常用类
枚举
jdk5前
1.构造器私有
2.显示的提供对象
jdk5后
enum类型
values
valueOf
自定义枚举类型默认继承自Enum
包装类
万物皆对象
八大包装类
自动装箱与拆箱
缓存问题(cache)
基本数据类型与字符串转换
Double d = 100?
Math
Math类方法
rount 四舍五入
Random
Big
BigInteger
BigDecimal
Arrays
常用方法
sort
copyOf
binarySearch
fill
asList
System下 arraycopy
String
特点
拼接问题
String类方法
charAt
substring
replace
matches
split
indexOf
内存问题
intern() 保证字符串常量池一定有该字符串
StringBuffer | StringBuilder
可变长字符串 链式编程
为何可变?
常用方法
区别
日期
jdk8以前
Date
Calendar
DataFrmat
jdk8以后
LocalDate
LocalTime
LocaDateTime
方法
DateTimeFormatter
System
arraycopy
currentTimeMillis
Runtime
集合
Collection
List
ArrayList
ArrayList 底层是Object类型的数组 Object[];
查询检索效率较高,随机增删元素效率较低。
ArrayList 默认初始化容量为10(添加第一个元素时)。
ArrayList 集合的扩容,增长到元容量的1.5倍。
ArrayList是非线程安全的。
LinkedList
LinkedList 集合底层为双向链表,内存地址不连续。
随机增删元素效率较高,查询检索效率较低。
LinkedList是非线程安全的
Vector
Vector 底层是Object类型的数组 Object[];
Vector是线程安全的,效率相对较低。
Set
HashSet
LinkedHashSet
TreeSet
Map
HashMap
HashMap 底层是哈希表(散列表)的数据结构,无序不可重复。
通过构造器初始化对象时,初始容量是多少?
空参构造器:在添加第一个元素时,默认初始化容量为16。
有参构造器:在添加第一个元素时,初始化容量为比指定容量大的 最小的2的次幂。
哈希算法:哈希表添加元素时,如何得到元素要添加的位置?
1.计算key的哈希值 -- 做到不同的元素哈希值尽量不同。
2.二次哈希 : 将哈希值的高低16位进行异或运算。 -- 减少哈希冲突。
3.二次哈希的值再与容量进行取模运算。 (如容量为16, n%16 = n&15与运算)。
关于HashMap集合的扩容: 何时扩容?如何扩容?
默认加载因子是0,75(数组容量达到75%时扩容),扩容为原容量的2倍,这是为了重新分布效率。
扩容后重新计算哈希值,均衡分布,重新分布后其位置保持不动 或 换为当前位置的二倍。
JDK8: 引入红黑树,链表的头插法改为尾插法。
链表长度达到 8、容量达到64时 转为红黑树,以进一步提升查询效率(很少出现)当红黑树节点减少到 6 时退化回链表。
LinkedHashMap
kay 有序、不可重复
底层结构:哈希表基础上维护一个链表,用于维护元素的迭代顺序
Hashtable
Key或Value不允许为null
Properties
Key和Value都是String类型
setProperty();
getProperty();
配置文件的读取(store、load)
SortedMap
TreeMap
TreeMap集合底层是一个 红黑二叉树
可以对Key做自动排序
TreeSet 对引用类型排序,引用类型需要自定义类实现Comparable接口。或在参数传入Comparator比较器
放到TreeSet集合的元素,等同于放到TreeMap集合Key部分
Iterator
快速失败机制 (fail - fast)
当集合结构发生改变,迭代器必须重新获取
增强for循环(foreach)
其内部原理是一个 Iterator 迭代器
泛型
规定输入数据类型
类型参数
泛型的上限 T extends A
泛型擦除
类型通配符 <?>
<? extends 上限> 设定通配符上限
<? super 下限> 设定通配符下限
IO
File
方法
代表了物理盘符中的一个文件或文件夹
IO流的分类
流向分
角色分
数据分
四大基流
InputStream
OutputStream
Reader
Writer
节点流
FIleInputStream
FileOutputStream
FileReader
FileWriter
处理流
缓冲流
字节缓冲流
BufferedInputStream
BufferedOutputStream
字符缓冲流
BufferedReader
BufferedWriter
转换流
InputStreamReader
OutputStreamWriter
数据流
DataInputStream
DataOutputStream
对象流
ObjectInputStream
ObjectOutputStream
序列化
(1)参与序列化和反序列化的对象,必须实现Serializable接口。
(2)如果某些属性不参与序列化,如果是实现Serializable接口的,直接在属性前面加transient修饰。
(3)Serializable这个标志接口是给java虚拟机参考的,java虚拟机看到这个接口之后,会为该类自动生成一个序列化版本号。
打印流
PrintStream
多线程
进程 and 线程
(1)进程是操作系统资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。
创建多线程*
继承Thread
实现Runnable接口
Thread 类常用方法
currentThread.getName()
休眠 sleep(long millis);
放弃 yield();
结合 join();
设置优先级 setPriority()
设置守护线程 setDaemon()
生命周期
新建(New)
就绪(Runnable)
运行(Running)
阻塞(Blocked)
死亡(Dead)
线程同步(安全问题)*
什么时候数据会存在线程安全问题?
条件1:多线程并发
条件2:有共享数据
条件3:有共享修改的行为
解决线程安全问题
synchronized
同步代码块 synchronized(监视器对象)
同步方法
同步监视器对象必须是相同的
线程的状态(阻塞)
lock锁 (没讲)
死锁(deadlock)
线程通信(等待唤醒机制)*
wait()
notify()
notifyAll()
sleep()和wait()方法的区别
sleep()不释放锁,wait()释放锁
sleep()指定休眠的时间,wait()可以指定时间也可以无限等待直到notify或notifyAll
sleep()在Thread类中声明的静态方法,wait方法在Object类中声明
如何合理的终止一个线程?
stop() 已过时、不推荐。
加入一个标记 (makr),终止时改为folse,return;
网络编程
网络编程三要素
IP
指互联网协议地址(Internet Protocol Address)
端口(prot)
标识设备中的进程
网络通信协议
连接和通信的规则
协议
Tcp 协议
三次握手 四次挥手
Udp 协议
Socket 编程
Udp 编程
Url资源定位符
统一资源定位符,它表示 Internet 上某一资源的地址
<传续协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
反射
类加载的过程
(1)加载:load
将class文件加载到内存
(2)链接:link
① 验证:校验被加载的class文件的合法性,并且不会危害虚拟机的自身安全
(所有的java的字节码文件 cafebaby 开头)。
(所有的java的字节码文件 cafebaby 开头)。
② 准备:为 类变量(成员变量) 分配内存 (方法区中) 并设置默认值 (0,null,false),为静态常量赋初始值 (常量池中)。
③ 解析:把字节码中的符号引用 (类似全类名) 替换为对应的直接地址引用
(3)初始化:initialize
1. 静态成员变量 显示赋值语句
2. 静态代码块内容
哪些操作会导致类初始化?
1.创建对象 (new)
2.使用了当前类中的静态方法 (静态方法、静态属性)
3.反射操作
注:类的初始化只会执行一次 (双亲委派机制)
哪些操作会导致类初始化滞后?
1.创建该类型数组
2.使用了类中的静态常量
3.子类使用了从父类继承的静态资源,只会导致父类初始化,不会导致子类初始化
类加载器(ClassLoader)
(1)引导类加载器(Bootstrap ClassLoader)又称为根类加载器
(2)扩展类加载器 (Extension ClassLoader)
(3)应用程序类加载器 (Application ClassLoader)。
(4)自定义类加载器。(略)
双亲委托机制(双亲委派)
① 避免类的重复加载
② 保护程序安全,防止核心API被随意篡改
lang.Class类
类的加载过程
关于java.lang.Class类的理解
获取CLass对象的四种方式:
调用运行时类的属性: .class
通过运行时类的对象,调用getClass()
调用Class的静态方法: forName(String classPath(全类名))//包名+类名
使用类的加载器: ClassLoader.loadClass
通过反射获取运行时类对象
代理模式
静态代理
动态代理
AOP 面向切面编程
正则表达式(RegExp)
元字符
字符匹配符、预定义字符类
[ ] 可接受的字符列表
[^] 不可接收的字符列表
- 连字符 (A-Z) A-Z任意一个
. 匹配除/n 外的任何字符
\\d 匹配单个数字字符
\\D 匹配单个非数字字符
\\w 匹配单个数字、大小写字母
\\W (\\w取反)
选择匹配符
| 匹配 | 之前或之后的表达式
限定符
* 指定字符重复0次或n次
+ 指定字符重复1次或n次
? 指定字符重复0次或1次
{n} 只能输入3个字符
{n,},}指定至少n个匹配
{n,m} 指定至少n个但不多与m个匹配
定位符
^ 指定起始字符
$ 指定结束字符
\\b 匹配目标字符串的边界
\B 匹配目标字符串的非边界
非命名分组、命名分组
(?:pattern)
(?=pattern)
(?!pattern)
Pattern 类
matcher
matches
split
Matcher 类
find
group
replaceAll
分组、捕获、反向引用
String 类中使用正则表达式
replaceAll
replaceFirst
matches
split
关于优化
贪婪模式(Greedy)
RegExp 默认为贪婪匹配
懒惰模式(Reluctant)
当 ? 紧跟其他限定符匹配模式时,匹配模式为“懒惰模式”
Jdk8新特性
函数式接口 (Single Abstract Method)
函数式接口(SAM):只有一个抽象方法的接口
四大内置函数式接口
Consumer<T> 消费型结构
Supplier<T> 供给型接口
Predicate<T> 判断型接口
Function<T,R> 功能型接口
@FunctionalInterface 注解 检测是否为函数式接口
Lambda表达式
-> :Lambda操作符 或 箭头操作符
->左边 :Lambda形参列表 (其实就是接口中抽象方法的形参列表)
->右边 :Lambda体 (其实就是重写的抽象方法的方法体)
Lambda表达式本质: 作为函数式接口的实例
方法引用
使用格式: 类(或对象) :: 方法名
使用格式
重写方法的形参是方法体内调用的方法对象 类型(类名)::方法
重写方法的形参与方法体内调用方法的实参匹配 类型(类名)::静态方法 或 对象::普通方法
类名::静态方法名 Math::rendom
类名::静态方法名 Person::getName
对象名::方法名 p1::getName
构造器引用、数组引用
强大的Stream API
函数式编程风格
Stream关注的是对数据的运算,与CPU打交道 集合关注的是数据的存储,与内存打交道
①Stream 自己不会存储元素。
②Stream 不会改变源对象。每次处理都会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
创建流
中间操作
筛选与切片
映射
排序
终止操作
匹配与查找
归约
收集
Optional 类
解决空指针问题
Optional.ofNullable
optionalGirl.orElse(new Girl("赵丽颖"));
0 条评论
下一页