计算机基础
计算机网络协议
物理层
数据链路层:IEEE 802.x
网络层:IP ARP
传输层:TCP/UDP
应用层:HTTP FTP SMTP
IP协议
特点:面向无连接、无状态,没有额外机制保证发送的包是否有序到达。是唯一的。
主要功能:在WLAN中进行寻址,选择最佳路由。
生存时间TTL:表示IP报文被丢弃之前可以经过的最大路由数量。初始值由源主机设定,每经过一个路由减一,直到为零时丢弃,并发送ICMP报文通知主机。
最大传输单元:MTU
ICMP
网络层协议,用于验证网络是否通畅、主机是否可达、路由是否可用。
TCP
传输控制协议:面向连接的,可靠的,端对端的传输协议。
三次握手&四次挥手
为什么要三次握手:1)信息对等 2)确保连接建立成功 3)防止已经失效的连接重新传到服务器出现脏连接。
为什么要四次挥手:确保信息已经传输完毕
HTTPS
1.客户端请求HTTPS网址建立连接,将支持的算法列表发送给服务端;
2.服务端选择其中一种加密方式,将自己的身份信息以证书的形式发送给客户端:证书包含网站地址、加密公钥以及证书颁发机构等信息。
3.客户端验证证书合法性,如果合法,客户端生成一串用于对称加密的随机数密钥,用证书中的公钥进行加密。并传送给服务端。
4. 服务端接收后用私钥进行解密,得到随机数密钥。客户端与服务器双方利用这个会话密钥加密要传输的数据进行通信。
信息安全
CIA原则:保密性、完整性、可用性。
SQL注入
1)过滤用户输入参数中的特殊字符
2)禁止通过字符串拼接的SQL语句,严格使用参数绑定传入的SQL参数。
3)合理使用数据库访问框架提供的防注入机制
XSS
跨站脚本攻击:向正常用户请求的HTML页面中插入恶意脚本。
防范:对用户输入数据做过滤或者转义
CSRF
跨站请求伪造:直接盗用用户身份执行黑客指定操作。
防范:1. CSRF Token验证。 2)增加人机交互
面向对象
面向对象 vs 面向过程
面向过程:有顺序的完成一件事。不利于软件维护和复用。
面向对象:以对象为中心,万物皆可对象。
面向对象三大特性:继承、封装、多态。
继承:关键字:extends。 子类继承父类的全部方法和属性
封装:public > protected > 无 > private
多态:根据实际的运行对象类型,同一个方法会产生不同的结果,使得同一个行为具有不同的表现形式。
类
抽象类 vs 接口
抽象类 | 接口 | |
---|---|---|
关键字 | abstract | interface |
继承或实现 | extends | implements |
方法实现 | 可以有 | 不能有,JDK8后运行有default |
方法访问控制符 | 无限制 | 默认public abstract |
属性访问控制符 | 无限制 | 默认public abstract |
静态方法 | 可以有 | JDK8后可以有 |
静态代码块 | 可以有 | 不能有 |
内部类
四种:
- 静态内部类:static class StaticInnerClass{};
好处:作用域不会扩展到包外;可以通过外部类.内部类的方法访问;内部类可以访问外部类中的所有静态属性和方法。 - 成员内部类:private class InstanceInnerClass{};
- 局部内部类:定义在方法或者表达式内部。
- 匿名内部类:(new Thread(){}).start()
序列化
- java原生序列化:Serializable: 要显示定义serialVersionUID.
- Hessian序列化:支持跨语言
- Json序列化:在序列化过程中抛弃了类型信息。
泛型
E(element) 、T(type of Object)、K(key)、V(value)
优势:在编译期对类型进行检查,使得类型安全;提升可读性、代码复用
JVM
字节码
机器码:机器码就是cpu能够直接读取并运行的代码,用二进制编码表示,也叫做机器指令码。
字节码:字节码是一种中间状态的二进制代码,是由源码编译过来的,可读性没有源码高。而且cpu也不能够直接读取字节码,在java中,字节码需要经过JVM虚拟机转译成机器码之后,cpu才能够读取并运行。
java源文件变成字节码过程:.java -> .class
字节码执行方式
- 解释执行
- JIT编译执行
- JIT编译与解释混合执行(默认模式)
类加载过程
加载:通过全限定类名获取编译后的二进制字节流,将这个二进制字节流的静态存储结构转化为运行时数据;生成java.lang.Class对象作为方法区中这个类各种数据的入口。
验证:验证Class文件中包含的信息是否符合《java虚拟机规范》,是否会对自身安全产生威胁
准备:为静态变量分配内存并设置初始值
解析:将常量池中的符号引用替换为直接引用
初始化:执行类构造器<clinit>
方法
加载器:
启动类加载器:lib目录下等
扩展类加载器/平台类加载器:lib/ext目录下
应用类加载器:用户类路径上所有的类库
双亲委派机制
内存
内存布局:
—线程私有----------------------------------
本地方法栈:为Native方法服务,因为java的作用范围达不到,需要调佣本地C语言库,进入本地方法栈,调用本地方法接口——JNI
java虚拟机栈:每个方法的从开始到执行结束,就是一个入栈到出站的过程。栈包括:局部变量表、操作栈、动态链接、方法返回等。
程序计数器:用来存放执行指令的偏移量和行号指示器,线程的执行和恢复依赖于程序计数器。
—线程共享----------------------------------
方法区(元空间):用于存储被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
堆:堆是在java内存中占用最大的一块,用来存放java实例。同时是垃圾收集器管理的内存区域,所以又被称为“GC堆”。
垃圾回收
标记-清除:将需要回收的对象进行标记,然后统一回收。
标记-整理:标记整理的标记过程与标记清除算法一样,但在进行对象回收清理时,会让所有存活的对象统一像内存空间的异端移动,然后直接清理掉边界以外的内存。
标记-复制:将堆内存按照8:1:1的方式划分成一个Eden和两个Survivor空间,每次只使用Eden和其中一个Survivor。发生内存回收后,将存活下来的对象一次性复制到的Survivor空间,清空这两个Eden和Survivor。