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