Java SE
2021-12-03 15:54:11 0 举报
AI智能生成
JavaSe基础
作者其他创作
大纲/内容
JVM虚拟机
JVM体系结构
类加载器
加载
验证
准备
解析
初始化
双亲委派
启动类加载器
扩展类加载器
程序类加载器
自定义加载器
逐层向上请求,逐层向下加载,保证了安全性
沙箱安全
结构
字节码校验
双亲委派
区分了访问域,外层代码无法访问核心
存取控制器
安全管理器
安全软件包
提供者、签名、加密.....
Native(JNI)
调用本地方法接口
调用其他语言的接口
最初为了使用C/C++接口
程序计数器
线程私有
指向指向的指令
类似CPU从ip寄存器取出指向,eip指向下一条
方法区
线程共享
存放方法字节码
普通方法
构造方法
接口
........
静态变量
常量池
注意实例变量在堆中
栈
线程私有
生命周期和线程同步
存放
八大基本类型
对象引用
对象的实例在堆中
实例的方法
栈帧
每次进入和出去的其实都是栈帧
包含
方法索引
输入输出参数
变量
class引用
父帧
子帧
堆
JVM种类
Sun公司的HotSpot(主要研究对象)
内存分配
新生区
伊甸园区
幸存0区
幸存1区
满了之后会触发轻GC清理
养老区
满了之后重GC
元空间
Java8之后新名词,之前叫方法区、永久代
元空间不在JVM堆内存中,而直接在系统内存中
常量池、方法元信息、类元信息
调整
堆内存溢出:OOM
修改大小
-Xms2048m -Xmx1024m
显示信息
-XX:PrintGCDetails
JPofiler分析工具
Dump
-XX:+HeapDumpOutOfMemoryError
BEA公司的JRockit
IBM公司的J9 VM
GC
区域
新生区
幸存区from、to
老年区
轻/重GC
常用算法
引用清除法
复制算法
标记清除
标记压缩
弥补标记清除的不足
效率
内存效率
复制>标记清除>标记压缩
内存整齐
复制=标记压缩>标记清除
内存利用率
标记压缩=标记清除>复制
在不同区域使用不同算法才可以效率最高
JMM
Java内存模型
定义了线程和主内存之间的抽象关系
解决共享对象可见性问题:Volilate
保证修改完立刻刷新
加锁
JUC并发编程
java.util.concurrent
锁
Synchronized
作为关键字
同步代码块
Lock
Reentrantlook
区别
一个是关键字一个是类
lock可以获取锁的状态
lock手动、synchronized自动
synchronized获得不到锁会一直等,Lock可以选择等待时间
synchronized可重入、非公平,lock 可重入,公平/非公平,可响应中断
生产者消费者
8锁现象
集合不安全类
callable
countdownlatch、cyclicbarrier、semaphore
读写锁
阻塞队列
线程池
四大函数式接口
stream流式计算
分支合并
异步回调
JMM
volatile
单例模式
CAS
原子引用
Java认识
Java的诞生
1995
JavaSE
JavaME
Android
JavaEE
2006
Hadoop
JDK
开发者工具包
JRE
JRE
运行环境
JVM虚拟机
JRE、JDK、JVM的区别
JDK>JRE>JVM
Hallow World
javac hello.java编译
java hello.class运行
半解释半编译
基础语法
关键字
JavaDoc
帮助文档
javadoc
@author
@version
@since
@param
@return
@throws
数据类型
基本数据类型
整数
byte
short
int
long
浮点数
float
double
字符
char
多字节
Unicode
转义字符
布尔
Boolean
进制转换
引用数据类型
类
接口
数组
类型转换
自动
低转高
手动
高转低
常量和变量
数据类型名 变量名 = 值
作用域
类变量(静态变量)
实例变量(成员变量)
局部变量
常量
final
运算符
赋值运算符
自增自减运算符
算术运算符
关系运算符
逻辑运算符
位运算符
条件运算符
包
package
import
流程控制
顺序结构
选择结构
if-else
switch(支持string)
循环结构
while
do-while
for
foreach
方法
调用
类名.方法名
对象名.方法名
方法的定义
修饰符 返回值 名字(参数){return 返回值;}
重载
参数列表不同
形参和实参
可变长度参数
定义
函数名(类型...变量名) 注意:变长参数必须放到最后
使用
按数组的方法使用
值传递和引用传递的理解
基本类型都是值传递,对象的时候虽然是引用,但是它只是在栈中存放了一个指向堆中同样地方的指针,如果不改变这个对象的话,会调用原来的,但是如果改变了,它就会新在堆中开一块内存来指向
数组
定义
存放类型需要相同
使用
通过下标
数组初始化
异常
下标越界:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException
null异常
遍历
for循环
foreach
java.util.Arrays.toString
内存
多维数组
Arrays类操作数组
数组的总结
排序
插入排序
直接插入排序
希尔排序
选择排序
简单选择排序
堆排序
交换排序
冒泡排序
快速排序
归并排序
基数排序
面向对象
类和对象概念
类是对象的抽象,对象是类的具体
构造器
默认无参构造(如果手动定义了有参构造,必须手动加上无参构造)
可以重载
单例模式为私有
new
栈存放引用
堆存放实例对象
修饰符
public
protected
private
static
final
特征
封装
私有
继承
extends
Java只支持单继承但是可以多重继承
都继承与Object
子类拥有父类的特性
this指向本类
super指向父类
子主题
多态
父类引用指向子类
instanceof关键字判断
抽象类
abstract
抽象类可以放抽象方法,以及普通类的东西,但普通类不能放抽象方法
抽象方法必须在子类实现
不能直接new
接口
interface
只能放抽象方法
实现接口必须重写所有方法
只有一个接口方法的叫函数式接口,可以用lambda表达式写,例如runnable
也不能直接new
接口可以多继承
implement
内部类
成员内部类
定义在类内
内部类可以随意访问外部类,外部想访问内部需要先实例化对象
如果变量重名优先内部类
局部内部类
定义在方法内
权限仅限于方法内
静态内部类
static修饰的成员内部类
只能访问外部类的static修饰的方法和属性
匿名内部类
new 类名(){};
GUI中监听事件经常使用
泛型<>
泛型接口
泛型方法
泛型类
异常
throwable
exception
运行时异常
0不能被除
类未找到
空指针
数组越界
.........
代码检查时异常
error
JVM错误
栈越界
死递归
堆内存不够
AWT错误
关键字
try()
catch(){}
finally{}
throw
throws
自定义异常
常用类
Object类
getClass
toString
hashCode
clone
notify
wait
equals
Math类
Random类
File类
包装类
8种基本数据类型的包装类
Date类
String类
不可变
StringBuffer类
可变长 多线程安全
StringBuilder类
可变长
Timer类
集合框架
Collection
List 有序可重复
ArrayList
LinkedList
Vector
Set 无须不可重复
HashSet
TreeSet
collection工具类
Map
HashMap 据说是高频问点
JDK1.7:数组+链表
JDK1.8:数组+链表+红黑树
TreeMap
Iterator
I/0流
字节流
OutputStream
InputStream
字符流
Reader
Writer
节点流
处理流
buffer
BufferedInputStream
BufferedOutputStream
data
DataInputStream
DataOutputStream
转换流
InputStreamReader
OutputStreamWriter
Filter
print
scanner
多线程
基础概念
进程和线程
进程
是正在运行的软件
特点
独立性
进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位
动态行
进程的实质是程序的一次执行过程,进程是动态产生也是动态消亡
并发性
任何进程都可以和其他进行一起并发执行
线程
是进程中的单个顺序控制流,是一条执行路径
单线程
一个进程如果只有一条执行路径,则称为单线程程序
多线程
一个进程如果有多条执行路径,则称为多线程程序
并发和并行
并发
在同一时刻,有多个指令在单个cpu上交替执行
并行
在同一时刻,有多个指令在多个cpu上同时执行
线程创建
继承Thread 内部调用了native方法start0()
1、定义一个类继承Thread
2、在类中重写run方法
3、创建类的对象
4、启动线程
继承Runnable接口
函数式接口 lambda
流程
1、定义一个类实现runnable接口
2、在类中重写run方法
3、创建类的对象
4、创建Thread对象,把类的对象作为构造方法的参数
5、启动线程
Callable
带返回值
流程
1、定义一个类实现Calable接口
2、在类中重写call方法
3、创建future的实现类futureTask对象,把类的对象作为构造方法的参数
4、创建Thread对象,把FutureTask对象作为构造方法参数传入
5、启动线程
注意事项
为什么要重写run方法
run()方法是用来封装被线程执行的代码
run方法和start方法的区别
run():封装线程执行的代码,直接调用,相当于普通方法的调用,并没有开启线程
start方法:启动线程,然后由jvm调用此线程的run方法
三种方法的区别
实现Runnable、Callable接口
优点
扩展性强,实现接口的同时还可以继承其他的类
缺点
适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想
继承Thread类
优点
编程相对简单,可以直接使用thread中的方法
缺点
可以扩展性较差,不能在继承其他的类
静态代理
new Thread(Runnable实现类);
动态代理:自动实现接口类
lambda表达式
闭包
(参数)->{函数语句}
new Thread( ()->{
语句;}).start();
语句;}).start();
线程状态
新建
就绪
运行
阻塞
死亡
方法
sleep
join
yield
isaLive
start
priority
interrupt
同步
Synchronized
同步方法
同步代码块
死锁:相互抱着对方的锁
Lock
ReentrantLock
Lock
TryLock
UnLook
通信
缓冲区
标志位
wait()
notifyAll()
线程池
网络编程
IP、端口
Socket
TCP
三次握手四次挥手
可靠链接
UDP
URL
注解和反射
注解
元注解
四个
内置注解
三个
自定义注解
反射
类加载机制
方法
invoke
属性
set
构造方法
newInstance
解除私有保护
setAccessiable
0 条评论
下一页