前言
日期:2020-04-21
- 初始内容:大多内容摘自GitHub上开源项目《JavaGuide》,原文链接:https://github.com/Snailclimb/JavaGuide 。图片来源博客等,如侵删。
日期:2020-05-17
- 补充及完善部分内容
Java网络
1. 协议
- OSI七层模型图解
- TCP/IP
五层网络体系结构
1.1 应用层
任务:应用进程间的通信和交互的规则。
报文:应用层交互的数据单元
协议
- 域名系统DNS:域名与IP地址映射
- HTTP协议:支持万维网应用
- SMTP协议:支持邮件
1.2 运输层
- 任务:向两台主机进程间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文
- 协议
- 传输控制协议TCP:提供面向连接的,可靠的数据传输服务【打电话】
- 用户数据协议UDP:提供无连接的,尽力但不保证可靠性的数据传输服务【寄信】
1.3 网络层
- 任务:选择合适的网间路由和交换节点,确保数据及时传送
- 协议
- IP协议
1.4 数据链路层
- 任务:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据组装成帧,在两个相邻节点间的链路上传送帧。
1.5 物理层
- 任务:实现相邻计算机节点之间比特流的透明传送,传送的数据单位是比特。
2. 三次握手和四次挥手
2.1 三次握手
- 目的:建立连接,确认客户端和服务端正常收发数据
- 过程
- 客户端:喂喂喂?听得到我的声音吗?
- 服务端:在在在,听得到你的声音。你听得到我的声音吗?
- 客户端:听得到,听得到。
2.2 四次挥手
- 目的:断开两个方向的连接。
- 过程
- 客户端:诶,我宣布要与你绝交!我已经不想跟你说话了,你还有什么话说吗?
- 服务端:好啊,我同意了,你和我绝交了!不过我还有几句话要说,你稍等。
- 服务端:(好气啊),那谁,我要说的是,我也要与你绝交了!我的话说完了。
- 客户端:哼,我也同意了,我们绝交了!再见!
3. TCP、UDP协议的区别
- 连接方式
- UDP 无连接
- TCP是面向连接
- 应用
- UDP:QQ语音、QQ视频(大量数据)
- TCP:文件传输、远程登录(少量数据)
4. TCP协议如何保证可靠传输
- 应用数据分割
- 发送包编号
- 接收端丢弃重复数据
- 流量控制
- 拥塞控制
- ARQ协议
- 超时重传
5. Cookie和Session
- 相同:跟踪浏览器用户身份的会话方式
- 差异
- Cookie一般用来保存用户信息:用户信息;Session服务端记录用户的状态:购物车
- Cookis保存在客户端(浏览器);Session保存在服务端
6. SSL和TLS
6.1 概念
- SSL:Secure Socket Layer 安全套接层
- TLS:Transport Layer Security 传输层安全协议,
位于HTTP和HTTPS之间的协议。SSL升级 - HTTP:Hyper Text Transport Protocol 超文本传输协议
- HTTPS: xx Secure 超文本安全传输协议。利用HTTP通信,用TLS保证安全。 = HTTP + TLS
更多可参考:点击传送
Java并发
- 含义:同一时间段,多个任务都在进行
- 状态:指定时刻只可能处于其中一个状态
- NEW
- RUNNABLE
- BLOCKED
- WAITING
- TIME_WAITING
- TERMINATED
- 进程:系统运行程序的基本单位,系统进行资源分配和调度的一个独立单位。
- 线程:进程的一个实体,比进程更小的执行单位,CPU调度和分派的基本单位。
关系
- 一个线程可以创建和撤销另一个线程
- 同一个进程中的多个线程之间可以并发执行
- 同一进程中的多个线程可以共享数据,但拥有自己的栈空间,拥有独立的执行序列
区别
- 进程有独立的地址空间,线程之间没有单独的地址空间
优缺点
- 线程执行开销小,但不利于资源的管理和保护;而进程正相反
- 线程适合于在 SMP(Symmetrical Multi-Processing)机器上运行,而进程则可以跨机器迁移。
同步
- 两个同步任务相互依赖,并且一个任务必须以依赖于另一任务的某种方式执行
- 多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 。(车票 的购买)
异步
- 两个异步的任务完全独立的,一方的执行不需要等待另外一方的执行
- 访问资源时在空闲等待时同时访问其他资源,实现多线程机制。(多个文件的下载)
线程
线程安全:点击传送
- 原因:在多个线程并发环境下,多个线程共同访问同一共享内存资源时,其中一个线程对资源进行写操作的中途(写⼊入已经开始,但还没结束),其他线程对这个写了一半的资源进⾏了读操作,或者对这个写了一半的资源进⾏了写操作,导致此资源出现数据错误
- 方法
- 保证共享资源在同一时间只能由一个线程进行操作(原子性,有序性
- 将线程操作的结果及时刷新,保证其他线程可以立即获取到修改后的最新数据(可见性)
线程死锁:多个线程同时被阻塞
具备条件:互斥、请求与保持条件、不剥夺条件、循环等待条件
互斥:一个资源每次只能被一个进程使用
请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放
不剥夺:进程已获得的资源,在末使用完之前,不能强行剥夺
循环等待:若干进程之间形成一种头尾相接的循环等待资源关系例子
两个人A、B各持有一个密码箱a、b,箱子里保存了对方的身份证,现在A、B两个人要拿回自己的身份证,A向B请求拿钥匙开b;B向A请求拿钥匙开a,但双方都怕对方先拿钥匙后反悔,不给自己钥匙,于是便僵持着。
解决线程安全
- synchronized:被修饰的方法或代码块,在任意时刻只能有一个线程执行(原子性、可见性、有序性)
- volatile:到主内存中读取变量值(保证变量可见性)、防止指令重排序(可见性、有序性)
- final:常量,不可变,因而是可见的(可见性)
- 更多内容可参考该博客:点击传送
读写锁思想:读读共享、写写互斥、读写互斥、写读互斥
进一步优化:CopyOnWriteArrayList
Runnable 接口:不会返回结果或抛出异常
Callable接口:无法计算结果时,抛出异常
线程池:线程集合的集中管理容器。池化技术的运用
目的:减少资源消耗,提高资源利用率
使用:推荐使用ThreadPoolExecutor方式
调用流程:
Executor框架:包括了线程池的管理、线程工厂、队列、拒绝策略
- 使用:
乐观锁和悲观锁
锁
- 概念:线程同步机制
- 作用:保证线程安全,解决并发操作产生的数据问题
乐观锁与悲观锁并不是特指某个锁,而是在并发情况下保证数据完整性的不同策略。悲观锁指的就是我们平常使用的加锁机制,它假设我们总是处于最坏的情况下,如果不加锁数据完整性就会被破坏。而乐观锁指是一种基于冲突检测的方法,检测到冲突时操作就会失败。
悲观锁:总是假设最坏的情况,拿数据都上锁。synchronized
- 实现:行、表、读、写锁(传统数据库)
- 场景:多写
乐观锁:最好的情况,只在更新的时候判断。
场景:多读
实现方式:
- 版本号机制:数据库version标识,提交版本必须大于记录版本
- CAS算法:无锁,非阻塞
缺点:
- ABA问题
- 循环时间长、开销大
- 只能保证一个共享变量的原子操作
AQS(AbstractQueuedSynchronizer):抽象队列同步器
- 作用:构建锁和同步器
- 原理:被请求的共享资源空闲,则将当前请求资源的线程设为有效的工作线程,并且将共享资源设置为锁定状态;共享资源被占用,则将线程加入队列,阻塞等待被唤醒。
- 资源的共享资源方式
- Exclusive(独占)
- 公平锁
- 非公平锁:两次CAS抢锁
- Share(共享)
- Semaphore(信号量):允许多个线程同时访问
- 公平模式
- 非公平模式:抢占式
- CountDownLatch(倒计时器)
- CycliBarrier(循环栅栏)
- ReentrantLock
- Exclusive(独占)
JVM
基础
运行时内存数据区域:
线程私有的:
- 程序计数器
- 虚拟机栈
- 本地方法栈
线程共享的:
- 堆
- 元空间(1.8)
- 方法区(1.7)
- 运行时常量池
1
2String str = "abc"; // 常量池
String str = new String("abc"); // 堆中新建对象- 尽量避免多个字符串拼接,否则使用StringBuilder
- 八种基本类型的包装类和常量池
- 常量池:Byte,Short,Integer,Long,Character,Boolean
- 非..:Float、Double
垃圾回收
待补充
I/O(数据通信的输入输出)
- 基础
同步:发起一个调用后,被调用者未处理完前,调用不返回
异步:发起请求后,立刻得到被调用者的回应,但被调者并没有返回结果,此时我们可以处理其他的请求。被调用者通常通过事件、回调等机制通知调用者其返回结果。
阻塞:发起一个请求,调用者一直等待请求结果返回。当前线程被挂起。
非阻塞:发起请求,不用等待结果返回。可以先做其他操作。
同步/异步是从行为角度描述事物的,而阻塞和非阻塞描述的当前事物的状态(等待调用结果时的状态)。
> 例子:一条水流,在某个地方被一块挡板拦截起来。此时如果是同步,则水流卡住,无法前进;若是异步,则水流一部分卡住,一部分继续绕过挡板前进;若是阻塞,则表示当前水流一直卡着;若是非阻塞,则表示水流继续前进
- BIO(Blocking):同步阻塞
- NIO(New):同步非阻塞
SocketChannel、ServerSocketChannel 套接字通道,支持阻塞、非阻塞
低负载、低并发:使用同步阻塞
高负载、高并发:使用同步非阻塞
核心组件
Channel(通道)
Buffer(缓冲区)
Selector(选择器)
- AIO(Asynchronous I/O):异步非阻塞
I/O
i/o流分类:
按流向:输入流、输出流
按操作单元:字节流、字符流
按流的角色:节点流、处理流
4个抽象类
- InputStream:字节输入流—输入流的基类
Reader:字符输入流—输入流的基类
OutputStream:字节输出流—输出流的基类
Writer:字符输出流—输出流的基类
Java8
1. 特性
- 接口默认方法(虚拟扩展方法):可以使用default关键字添加非抽象方法
1 | interface Formula{ |
1.1 Lambda表达式
- 作用:避免使用庞大的匿名类实现
1 | // java7匿名内部类写法 |
- FunctionalInterface(函数式接口)
- 含义:仅仅只包含一个抽象方法,但可以有多个非抽象方法的接口。加注解编译器会自动识别
- Method and Constructor References(方法和构造函数引用)
- 关键字:::
- 含义:仅仅只包含一个抽象方法,但可以有多个非抽象方法的接口。加注解编译器会自动识别
1 | // Person |
- Lambda Scopes(表达式作用域)
- 访问局部变量:只读
- 访问字段(类属性)和静态变量:读写
- 访问默认接口方法:不可
Built-in Function Interface(内置函数式接口)
Predicates
- Functions
Suppliers
- Consumers
- Comparators
- Date API(日期相关)
2. forEach
1 | // forEach |
数据结构
一、布隆过滤器
1.基础信息
概念:二进制向量(位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。
原理:
二、Queue队列
1.基础信息
- 概念:FIFO
- 种类:单队列、循环队列
- 集合:集合中的Queue继承自Collection接口
三、Set
1. 基础信息
概念:不允许出现重复元素,并且无序的集合
集合
- HashSet:哈希表
- TreeSet:红黑树
四、List
1. 基础信息
- 集合
- ArrayList:数组
- LinkedList:双向链表
- Vector:矢量队列
- Stack:栈
五、Map
待补充
六、Tree
待补充
七、图
待补充
算法
Spring
一、常见问题
1. 基础信息
描述:轻量级开发框架,旨在提高开发效率及系统的可维护性。
模块:核心容器、数据访问/集成、Web、AOP、工具、消息、测试模块
特征
- 核心技术:DI、AOP、events、资源…
- 数据访问
2. RestController vs Controller
返回
Controller 返回一个页面(不加@ResponseBody)
RestController 返回对象:JSON或XML数据,对象数据直接写入HTTP响应,属于RESTful Web服务(前后端分离)
3. Spring IoC & AOP
IoC:Inverse of Control ,控制反转。依赖倒置原则
- 一种设计思想,将原本在程序中手动创建对象的控制权交由Spring框架来管理。IoC容器是Spring用来实现IOC的载体,Map结构。
- 类似工厂,当需要创建一个对象时,只需配置好配置文件/注解即可
- 实现方式:依赖注入
AOP:Aspect Oriented Programming,面向切面编程。
- 将与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低耦合度,提高可拓展性和可维护性。
- 基于动态代理
DI:Dependency Injection,依赖注入
- 依赖注入就是将实例变量传入到一个对象中去
JNDI:Java Naming and Directory Interface,Java命名和目录接口)
- SUN公司提供的一种标准的Java命名系统接口
- JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。
4. Spring事务管理
5. Spring单例与线程安全
- @Component和@Bean
- @Component 作用于类,@Bean作用于方法
- 将一个类声明为Spring的bean的注解
- @Component:通用
- @Repository:持久层,DAO
- @Service:服务层
- @Controller:Spring MVC控制层
6. Spring MVC
- Model1时代:JSP为主体
- Model2时代:Java Bean(Model)+JSP(View)+Servlet(Controller)–JavaWeb MVC
- Spring MVC:对客户端的请求通过后端分层调用方式,将视图数据返回客户端
- 浏览器发送请求到后端DispatcherServlet,由Servlet找到对应的Handler类(控制层)
- Handler类调用处理器处理相应逻辑,返回ModelAndView(模型视图对象)
- ViewResolver(视图解析器)找到View,DisapterServlet将Model传给View,并返回给浏览器进行渲染
MySQL
一、基础
1. 存储引擎
常用命令
1
2
3
4
5
6
7
8-- 显示所有存储引擎
mysql> show engines;
-- 查看默认的存储引擎
mysql> show variables like '%stroage_engine%';
-- 查看表的存储引擎
mysql> show table status like 'table_name';MyISAM
- 说明:5.5版本前默认引擎
- 利弊:性能好、提供大量特性(全文索引….);不支持事务和行级锁、崩溃后无法恢复
InnoDB
说明:.5后默认引擎
利弊:支持行级锁(默认)和表级锁、支持事务和崩溃后的安全恢复、支持外键和MVVC
2. 字符集和校对规则
3. 索引
4. 事务
- 含义:逻辑上的一组操作
- 特性
- 原子性
- 含义:最小的执行单位,不允许分割
- 作用:确保动作要么都完成,要么都失败
- 一致性
- 含义:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的
- 隔离性
- 持久性
- 原子性
Linux&Shell
一、Linux
1. 操作系统
- 概念:管理计算机硬件与软件资源的程序,是计算机系统的内核与基石
- 分类
- Window
- Unix
- Linux:类Unix,有许多版本
2. Linux文件系统
- 简介:所有被操作系统管理的资源,都是文件。如:网路接口卡、磁盘驱动器、打印机、目录。
- 文件类型与目录结构
- 文件类型
- 常用目录
- /bin
- /home
- /opt
- …
2.1 基本命令
mkdir 目录名称:创建目录
find 目录 参数:寻找目录
- find . :列出当前目录及子目录下所有文件及文件夹
mv 目录名称 新目录名称:重命名
rm [-rf] 目录:删除目录
touch 文件名称:文件的创建
cat/more/less/tail 文件名称:文件的查看
- cat :查看显示文件的内容
- more :可以显示百分比
- tail -10:查看文件的后10行
- tail –f filename:命令从指定点开始将文件写到标准输出
vim 文件:修改文件的内容
- :w :保存
- :wq :保存并退出
- :q :在文件未作任何修改的情况下退出
- :q! : 强制退出,不保存
tar/gz :打包和压缩
tar -zcvf 打包压缩后的文件名 要打包压缩的文件 :例如test目录下有三个文件 a.txt、b.txt、c.txt ,要打包test目录并指定压缩后的压缩包名称为test.tar.gz ,可以使用命令 tar -zcvf test.tar.gz a.txt b.txt c.txt
tar -xvf 压缩文件:解压缩
sudo 其他命令:以系统管理者的身份执行命令
grep 要搜索的字符串 要搜索的文件 –color:搜索命令,–color高亮
ps -ef / ps -aux :查看系统正在运行的进程
- ps aux|grep redis:查看包括redis字符串的进程
- pgrep redis -a : 同上
ifconfig :查看当前系统的网卡信息
netstat -an :查看当前系统的端口使用
shutdown :关闭
- shutdown -h now:关机
reboot:重开机
2.2 常用命令
1 | 拷贝目录下的文件,不拷贝文件夹 |
二、Shell
1. 基础
概念:命令解释器,解释和执行用户输入的命令和程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Hello World
1.新建文件
touch test.sh
2.赋予执行权限
chmod +x test.sh
3.修改文件
vim test.sh
!/bin/bash --执行shell类型
第一个shell小程序,echo是输出
echo "hello world!"
4.运行脚本
./test.sh
2. 变量
自定义变量(局部):$variable_name
环境变量:PATH、
Shell变量
2.1使用自定义变量
#!/bin/bash
hello = “hello world”
echo $hello
echo “hello world”
2.2使用字符串 ,单引号、双引号皆可
name = ‘Mango’
hello = ‘Hello,I am ‘$name’’
echo $hello
1字符串拼接:并排即可连接
#!/bin/bash shell脚本标记
name="Shell"
url="http://c.biancheng.net/shell/"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
2获取字符串长度:length/#
name = 'Snall'
echo ${#name}
expr length '$name';
2.3使用数组
#!/bin/bash
array=(1 2 3 4 5);
# 获取数组长度
length=${#array[@]}
# 或者
length2=${#array[*]}
#输出数组长度
echo $length #输出:5
echo $length2 #输出:5
# 输出数组第三个元素
echo ${array[2]} #输出:3
unset array[1]# 删除下标为1的元素也就是删除第二个元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5
unset arr_number; # 删除数组中的所有元素
for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容
- 基本运算符
算数运算符
1
2
3
4
5
61.加法
!/bin/bash
a=3;b=3;
val=`expr $a + $b`
输出:Total value : 6
echo "Total value : $val"关系运算符
1
2
3
4
5
6
7
8
9#!/bin/bash
score=90;
maxscore=100;
if [ $score -eq $maxscore ]
then
echo "A"
else
echo "B"
fi布尔运算符
1
2
3
4
a=$(( 1 && 0))
# 输出:0;逻辑与运算只有相与的两边都是1,与的结果才是1;否则与的结果是0
echo $a;字符串运算符
1
2
3
4
5
6
7
8
9!/bin/bash
a="abc";
b="efg";
if [ $a = $b ]
then
echo "a 等于 b"
else
echo "a 不等于 b"
fi文件测试运算符
定义好了一个文件路径file=”/usr/learnshell/test.sh” 如果我们想判断这个文件是否可读,可以这样if [ -r $file ] 如果想判断这个文件是否可写,可以这样-w $file
3.流程控制
if条件语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22if [ 表达式 ]; then
指令
else
指令二
fi
####示例#####
!/bin/bash
a=3;
b=9;
if [ $a -eq $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
else
echo "a 小于 b"
fi
for循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16输出列表数据
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
产生10个随机数
for i in {0..9};
do
echo $RANDOM;
done
输出1-5
for((i=1;i<=5;i++));do
echo $i;
done;
while
1
2
3
4
5
6
7!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
4.函数
无参、无返回值
1
2
3
4
5
6
7!/bin/bash
hello(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
hello
echo "-----函数执行完毕-----"
有返回值
1
2
3
4
5
6
7
8
9
10
11
funWithReturn(){
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $?"
有参
1
2
3
4
5
6
7
8
9
10
11!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
5.ssh
- 概念:加密的网络传输协议。一般用来连接远程服务器。
- 命令:(如果操作到是文件夹 则需要 加上 -r 参数, 使用递归上传或者下载。)
- 本地文件上传至服务器
- scp path/filename userName@sseverName:path
- 服务器下载
- scp userName@sseverName:path path/filename
- 本地文件上传至服务器