网络
TCP
是一个基于字节流的一个传输层的通信协议,在发送数据之前双方是需要建立一个连接的,这个所谓的连接就是双方都保存一个对方的ip地址还有端口等信息,然后TCP其实是一个字节流,头部就保存了这些信息,进行连接的时候有三个阶段:建立连接、传输数据、关闭连接,三次握手来建立,四次挥手来关闭,其中交换的报文都是tcp的头部。
三次握手
三次握手是一个在内核发生的一个行为,基于TCP协议,,首先呢,客户端应用启动以后,服务端进入listen状态,为了未来收到数据包做准备,然后在这个状态下内核进行了三次握手,
首先第一次是客户端向服务端发送带有SYN,代表发送连接的标识,的一个报文,自己进入一个SYN-SENT状态,然后服务器接收进入SYN-RECV状态
第二次是服务器发送带有SYN+ACK的报文,ACK是确认序号有效的标识,客户端接收进入established状态;
然后就是最后一次握手 因为服务端还需要知道自己发送和对方接收是否成功,所以客户端发送带有ACK标识的报文,服务端接收到才进入establised状态,以上三次握手就进行完毕
然后在这里以后应用要进行接收,就得将连接 ...
高频题
三数之和
两数之和为基础
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
// 1 先将数组排序
// 2 从后往前遍历最后一个数 找对应的二元组:二元组 + arr[i] = 0
// 2.1 保证不重复
// 2.2 找出前面部分满足条件的二元组
// 2.3 遍历将arr[i]添加在后面
public static List<List<Integer>> threeSum(int[] nums) {
// 1
Arrays.sort(nums);
int N = nums.length;
List<List<Integer>> ans = new ArrayList<>();
// 2
for (int i = N - 1; i > 1; i--) { // 三元组最后一 ...
Redis是一个使用c语言编写的,开源的高性能非关系型数据库(NoSQL)
数据类型
回答:一共五种
(一)String
这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。
(二)hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。
(三)list
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。本人还用一个场景,很合适—取行情信息。就也是个生产者和消费者的场景。LIST可以很好的完成排队,先进先出的原则。
(四)set
因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦 ...
并发编程三大特性
可见性
MESI 多线程的底层并不是通过mesi
多线程提高效率,本地缓存数据,造成数据修改不可见,
要想保证可见,要么触发同步指令,要么加上volatile,被修饰的内存,只要有修改,马上同步涉及到的每个线程。
==volatile==
==介绍一下volatile的功能?==
volatile关键字保证了可见性和禁止指令重排
提供了happen-before的保证,确保一个线程的修改可以对其他线程是可见的。当一个共享变量被修饰的时候,就会保证修改的值立即被更新到内存,当其他线程需要读取的时候,就会去内存中读取新值。从实际角度来说,其中的一个重要作用就是与CAS结合,保证了原子性。volatile经常用在多线程环境下的单次操作。
通俗来讲就是 ab线程要用一个变量,然后java默认是a线程中保留一份copy,这样如果b线程来修改,则a线程未必知道,如果使用这个关键字,线程之间数据修改都能可见。
==volatile的可见性和禁止指令重排序怎么实现的?==
volatile本质上是通过内存屏障来实现可见性的,被修饰的变量在被修改之后可以立即同步到主内存,该变量每次使 ...
m1 2020配置java后端环境
1 安装JDK
OracleJDK暂时并不支持arm架构的芯片,我们需要使用openjdk:zulu版本 地址
安装完成 终端输入java --version
配置问题!!!
😭m1 默认是zsh 不是bash 一开始不知道的我 把所有配置全部输入到 bash_profile 然后看maven版本却显示
想要更换bash 和 zsh模式可以参考这个: mac中bash和zsh终端切换方法和zsh配置
./zshrc ```添加配置(可以**修改版本**)
export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home
#export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home
## 2 安装homebrew
homebrew 是macos的包管理工具
在终端输入 ```/bin/zsh -c "$(c ...
概念
Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的项目。
版本控制:版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统 。
代码托管中心
我们已经有了本地库,本地库可以帮我们进行版本控制,为什么还需要代码托管中心呢?
它的任务是帮我们维护远程库,下面说一下本地库和远程库的交互方式,也分为两种:
团队内部协作
跨团队协作
https://github.com/SoniaChan33/SoniaChan33.github.io
初始化本地仓库
创建一个文件夹
打开Git终端:Git Bash Here
查看Git安装版本
git --version
清屏
clear
设置签名
git config --global user.name "TeaSea33"
git config --global user.email "[email protected]"
本地仓库的初始化操作(目录在本地仓库里)
git init
查看.git下的内容
注意事项: .git目录下的本地库相关 ...
引入
Tomcat
HTTP协议
协议:Protocol
定义
HTTP协议是**Hyper Text Transfer Protocol(超文本传输协议)**的缩写, HTTP是万维网(WWW:World Wide Web)的数据通信的基础。
HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
特点
1支持客户/服务器模式
HTTP协议支持客户端服务端模式,需要使用浏览器作为客户端来访问服务端。
2简单快速
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST等。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3灵活
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
4无连接
每次请求一次,释放一次连接。所以无 ...
引入
为什么使用jQuery?
使用原生JavaScript编码存在问题
1选择器功能弱
2 DOM操作繁琐之极
3浏览器兼容性不好
4动画功能弱
优点
1强大的选择器
2出色的DOM封装
3出色的浏览器兼容性
4强大的动画功能
5体积小,压缩后只有100KB左右
6可靠的事件处理机制
7使用隐式迭代简化编程
8丰富的插件支持
定义
目前最流行的JavaScript函数库之一,对JavaScript进行了封装。并不是一门新语言。将常用的、复杂的操作进行函数化封装,直接调用,大大降低了使用JavaScript的难度,改变了使用JavaScript的习惯。jQuery能做的JavaScript也能做,但使用jQuery能大幅提高开发效率,由美国人John Resig在2006年推出,目前最新版本是v3.5.1。宗旨:Write less,do more(写更少代码,做更多事情)。官方网址http://jquery.com/
==$()==
作用一:页面加载函数
/*jQuery(document).ready(function (){
...
概念
JS是运行在浏览器上的一种脚本语言
特点
1.脚本语言
脚本语言是一种简单的程序,规模小,不需要编译,运行快,是由一些ASCII字符构成,可以使用任何一种文本编辑器编写。脚本语言是指在web浏览器内有解释器解释执行的编程语言,每次运行程序的时候,解释器会把程序代码翻译成可执行的格式。一些程序语言(如C、C++、Java等)都必须经过编译,将源代码编译成二进制的可执行文件之后才能运行,而脚本语言不需要事先编译,只要有一个与其相适应的解释器就可以执行。
2.基于对象的语言
面向对象有三大特点(封装,继承,多态)缺一不可。通常"基于对象"是使用对象,但是无法利用现有的对象模板产生新的对象类型,也就是说"基于对象"没有继承的特点。没有了继承的概念也就无从谈论"多态"
3.事件驱动
在网页中执行了某种操作的动作,被称为"事件"(Event),比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。
4.简单性
变量类型是采用弱类型,并未使用严格的数据类型。var a,b,c; ...