Java
2020-04-17 09:54:34 18 举报
AI智能生成
java基础详版本
作者其他创作
大纲/内容
设计模式
单例模式
观察者模式
角色
抽象被观察者->提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现
抽象观察者->为所有的具体观察者定义一个接口,在得到主题通知时更新自己
具体被观察者->也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知
具体观察者->实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调
步骤
代理模式
工厂模式
简单工厂:定义一个创建对象的接口,让其子类自己觉得实例化那一个工厂类,工厂模式使其创建过程延迟到子类进行
工厂方法:
抽象工厂模式:
构建者模式
责任链模式
io
类加载器
过程
加载
链接
验证
准备
解析
初始化
PDM(双亲委托机制)
根加载器
扩展加载器
系统加载器
JVM运行时内存
程序计数器
在JVM规范中规定,如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined
jvm栈
本地方法栈
本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。在JVM规范中,并没有对本地方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。
java堆
Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的,这部分空间也是Java垃圾收集器管理的主要区域,堆是被所有线程共享的,在JVM中只有一个堆
方法区
线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。
在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。
直接内存
垃圾回收机制
网络
http
基本概念:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少
特点 :1.支持客户/服务器模式。(C/S模式)2,简单快速:客户向服务器请求服务时,只需传送请求方法和路径.3灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。4:无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。5:无状态:HTTP协议是无状态协议。
工作流程:第一步:建立TCP/IP连接,客户端与服务器通过Socket三次握手进行连接
第二步:客户端向服务端发起HTTP请求(例如:POST/login.html http/1.1)
第三步:客户端发送请求头信息,请求内容,最后会发送一空白行,标示客户端请求完毕
第四步:服务器做出应答,表示对于客户端请求的应答,例如:HTTP/1.1 200 OK
第五步:服务器向客户端发送应答头信息
第六步:服务器向客户端发送请求头信息后,也会发送一空白行,标示应答头信息发送完毕,接着就以Content-type要求的数据格式发送数据给客户端
第七步:服务端关闭TCP连接,如果服务器或者客户端增Connection:keep-alive就表示客户端与服务器端继续保存连接,在下次请求时可以继续使用这次的连接
第二步:客户端向服务端发起HTTP请求(例如:POST/login.html http/1.1)
第三步:客户端发送请求头信息,请求内容,最后会发送一空白行,标示客户端请求完毕
第四步:服务器做出应答,表示对于客户端请求的应答,例如:HTTP/1.1 200 OK
第五步:服务器向客户端发送应答头信息
第六步:服务器向客户端发送请求头信息后,也会发送一空白行,标示应答头信息发送完毕,接着就以Content-type要求的数据格式发送数据给客户端
第七步:服务端关闭TCP连接,如果服务器或者客户端增Connection:keep-alive就表示客户端与服务器端继续保存连接,在下次请求时可以继续使用这次的连接
https
基本概念:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL
特点:HTTPS是HTTP协议的修改,它加密数据并确保其机密性。其配置可保护用户在与网站交互时免于窃取个人信息和计费数据。相比于http,https可以提供更加优质保密的信息,保证了用户数据的安全性,此外https同时也一定程度上保护了服务端,使用恶意攻击和伪装数据的成本大大提高。
工作流程:第一步:客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
第二步:Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
第三步:客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
第四步:客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
第五步:Web服务器利用自己的私钥解密出会话密钥。
第六步:Web服务器利用会话密钥加密与客户端之间的通信。
最后说一句 ,ssl证书阿里云上可以免费申请一年
第二步:Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
第三步:客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
第四步:客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
第五步:Web服务器利用自己的私钥解密出会话密钥。
第六步:Web服务器利用会话密钥加密与客户端之间的通信。
最后说一句 ,ssl证书阿里云上可以免费申请一年
反射
通过反射可以获取类信息
getDeclaredFileds()
getMethods()
getConstructors()
getSupperclass()
getInterfaces()
getSimpleName()
getCanonicalName()
动态创建对象
newInstance()
Constructor
newInstance(Object...args)
返回类对象
forName("类的完全限定命名)
设定成员变量的值
Field
set(Object target,Object value)
Object get()
调用方法
Method
invoke(Object obj,Object ... args)
如何访问私有方法、属性
注解
元注解
@Retention
RetentionPolicy.SOURCE:只有源代码期间保留,编译器编译时丢弃
RetentionPolicy.CLASS:保留到编译器,加载到JVM时会被丢弃
RetentionPolicy.RUNTIME:可加载到JVM中,运行时可通过反射获取注解信息
@Documented
生成Javadoc时,包含@Documented注解的元素
@Target
ElementType.TYPE:class、接口(包括注解)、枚举
子主题
ElementType.FIELD:属性
ElementType.METHOD:方法
ElementType.PARAMETER:参数
ElementType.CONSTRUCTOR:构造方法
ElementType.LOCAL_VARIABLE:局部变量
ElementType.ANNOTATION_TYPE:注解
ElementType.PACKAGE:包
ElementType.TYPE_PARAMETER:用在类型参数上
@Inherited
父类的注解是否可被子类继承
@Repeatable
Java 1.8 加入,可重复添加多个注解
定义
@Override:实现/重写父类方法
@SuppressWarnings:忽略编译器警告
@SafeVarargs:参数安全注解,Java 1.7 加入
@Deprecated:废弃注解
@FunctionalInterface:函数式接口注解,Java 8加入
线程
创建线程
继承Thread类重写run方法
实现Runnable接口重写run方法
显示Callable<T>接口重写call方法
Future<T>
可以在线程执行结束之后得到一个结果
Thread类的方法
对象方法
启动线程-start()
设置/获取进程优先级 setPriority/getPriority
设置守护线程(后台线程)setDaemon(boolean)
中断线程 interrupt()
子主题
子主题
静态方法
sleep() 线程休眠
yield()让出cpu
currentThread()获得正在执行的线程
线程同步
线程池
组成
1.线程池管理器->用于管理线程池,包括创建线程池、销毁线程池、添加线程池
2.工作线程PoolWorker->线程池中线程,在没有任务时处于等待状态,可以循环的执行任务
3.任务接口task->每个任务必须实现的接口,以供工作线程调度任务的执行,主要规定了任务的入口,任务执行完后端收尾工作,任务的执行状态等
4.任务队列taskQueue->存放没有处理的任务,提供一种缓冲机制
常见线程池
newSingleThreadExecutor
newFixedThreadExecutor
newCacheThreadExecutor(推荐使用)
newScheduleThreadExecutor
子主题
Lock和synchronized
synchronized
对象锁
代码块形式
手动指定锁定对象,也可是是this,也可以是自定义的
方法锁形式
synchronized修饰普通方法,锁对象默认为this
类锁
修饰静态方法
synchronized用在静态方法上,默认的锁就是当前所在的Class类,所以无论是哪个线程访问它,需要的锁都只有一把
public static synchronized void method()
指定锁对象为Class对象 synchronized(SynchronizedObjectLock.class){
缺陷
效率低
锁的释放情况少,只有代码执行完毕或者异常结束才会释放锁;试图获取锁的时候不能设定超时,不能中断一个正在使用锁的线程,相对而言,Lock可以中断和设置超时
不够灵活
加锁和释放的时机单一,每个锁仅有一个单一的条件(某个对象),相对而言,读写锁更加灵活
无法知道是否成功获得锁
相对而言,Lock可以拿到状态,如果成功获取锁,....,如果获取失败,.....
Lock
容器
Collection<E>
List
ArrayList
底层实现 Object[]
增删改查
初始大小10,扩容机制(3倍)
优点
子主题
子主题
LinkedList
子主题
子主题
Set
HashSet
重写hashCode()方法
重写equals方法
TreeSet
对象必须是Comparable接口的子类型
Queue
离散事件模拟
Map<K,V>
HashMap
键的类必须重写hashCode和equals方法,hashCode方法可能会产生hash冲突,重写equals防止hash冲突
如何扩容,数组长度,初始容量,负载因子(0.75),为什么链表大于8才树化
为什么线程不安全
和HashTable区别
JDK1.7和1.8的HashMap实现区别
TreeMap
键必须是Comparable接口的子类型
HashTable
Java8之前,每个位置对应一个链表
Java8开始,当hash冲突达到一定程度,每一个文字从链表转成红黑树
怎么转成红黑树的?
Java8开始,当hash冲突达到一定程度,每一个文字从链表转成红黑树
怎么转成红黑树的?
修饰静态方法 synchronized用在静态方法上,默认的锁就是当前所在的Class类,所以无论是哪个线程访问它,需要的锁都只有一把
子主题
public static synchronized void method()
hash表,失去了顺序性,均摊复杂度为O(1)
0 条评论
下一页