- 博客(43)
- 收藏
- 关注
原创 Java常用数据结构
万能双向链表// 将指定元素插入双向队列开头 boolean offerFirst(Object e );// 将指定元素插入双向队列结尾 boolean offerLast(Object e );// 获取但不删除双向队列的第一个元素,如果双端队列为空则返回 null Object peekFirst();// 获取但不删除双向队列的最后一个元素,如果此双端队列为空则返回 null Object peekLast();// 获取并删除双向队列的第一个元素,如果此双端队列为空则返回 nul
2021-12-28 18:18:55
216
原创 Linux系统相关
故障排查存储(内存和外存)free -m/-h // 查看内存df -htop + Shift+MCPUtop + Shift+Puptime
2021-11-16 09:47:31
834
原创 常见系统设计
登录注册启用HTTPS密码加密传输过程中加密密码入库过程中加密验证码校验Cookies过期时间设置秒杀系统前端按钮置灰验证码或者几秒后允许点第二次Nginx过滤恶意请求,实现负载均衡Redis集群一个写多个读对于写要保证不能超卖采用lua脚本decrby:如果一次可以买多件,会出现问题,超卖回退困难使用MQ去处理下单成功的请求...
2021-11-03 10:10:34
150
原创 java io
IO的本质IO必须要经过操作系统的参与可以利用内存映射减少系统空间和用户空间的内存拷贝IO和NIO对比IONIO面向流面向缓冲面向流非阻塞IO无选择器1、面向流与面向缓冲Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Ja
2021-10-18 20:39:47
131
原创 实习项目梳理
小黑盒项目节点结构type Node struct { // 是否是根节点 RootNode bool // 是否是单词尾 PathEnd bool // 失败指针 FailNode *Node // 存储的字符 Character rune // 长度 Length int // 下一个字符 Children map[rune]*Node}使用map存储下一个节点的指针构造失败指针func (tree *Trie) BuildAcAutomation() {
2021-09-13 18:35:22
366
原创 Go数据结构
map支持并发读不支持并发读写、并发写sync.map解析1、空间换时间。通过冗余的两个数据结构(read、dirty),实现加锁对性能的影响。2、使用只读数据(read),避免读写冲突。3、动态调整,miss次数多了之后,将dirty数据提升为read。4、double-checking(双重检测)。5、延迟删除。 删除一个键值只是打标记,只有在提升dirty的时候才清理删除的数据。6、优先从read读取、更新、删除,因为对read的读取不需要锁。...
2021-09-13 18:34:32
189
原创 动态规划专题
字符串最长回文子串最长回文子序列最长公共子串最长公共子序列子串和子序列问题的不同在于,子串如果不满足条件则结果为0,必须连续,子序列可以是之前记录的结果32、最长有效括号:1.利用栈、2.利用dp72、编辑距离:多种情况考虑97、交错字符串:dp[i][j]// A的前i个喝B的前j个能否拼接成C的前i+j个115、不同的子序列:dp[i][j],记录位置到末尾的状态股票dp[i][j]//第i天结束时的股票持有状态题解链接背包01for (int i = 0; i
2021-09-12 16:06:13
87
原创 ThreadLocal
原理每个线程私有一个ThreadLocalMap数据结构,每次调用get前,先拿出本线程的ThreadLocalMap,然后Threadlocal是key,取出valueThreadLocalMap的key为弱引用,value每次调用get或set前会清空key为null的value
2021-09-05 16:42:09
108
原创 动态规划专题
背包问题01背包//W[]物品重量int[] dp = new int[w + 1] //重量+1for (int i = 1; i < n; i++) {//遍历物品 for (int j = target; j >= W[i]; j--) { dp[j] = Math.max(dp[j](不选), dp[j - W[i] + 当前物品的价格); }}多重背包//W[]物品重量int[] dp = new int[w + 1] //重量+1for (int i =
2021-09-02 18:28:20
105
原创 Golang基础解析
参考资料https://github.com/talkgo/nighthttps://github.com/talkgo/read并发channel源码解析chan源码解析selectselecat源码解析轮询顺序 pollOrder 和加锁顺序 lockOrder 分别是通过以下的方式确认的:轮询顺序:通过 runtime.fastrandn 函数引入随机性;加锁顺序:按照 Channel 的地址排序后确定加锁顺序,避免死锁;selectgo 构建出来的 sudog 会将
2021-09-01 15:45:31
565
原创 grpc简介
RPC作用可以像调用本地方法一样调用远程方法微服务的基础Protocol Buffers实现序列化基于二进制流,相较于json、xml传输更快
2021-04-20 06:29:50
229
原创 IO机制详解
https://www.jianshu.com/p/486b0965c296 // I/O简介https://www.jianshu.com/p/dfd940e7fca2 // select、poll和epoll概念说明进程切换操作系统内核参与用户空间和内核空间缓存I/O数据先拷贝到操作系统内核的缓冲区,然后从操作系统内核缓冲区拷贝到用户空间I/O模式阻塞I/Orecvfrom:之后线程阻塞非阻塞I/Orecvfrom:返回一个结果轮询,每隔一会看一下拷贝数据整个过程,进程
2021-04-20 06:29:33
560
原创 Redis
为什么快基于内存数据结构简单I/O多路复用+非阻塞单线程执行命令多线程进行网络I/O更好五种数据类型string、hash、list、set、zset数据淘汰策略lru随机淘汰快过期淘汰按访问频率数据持久化RDB持久化(快照持久化)将某个时间点上Redis中的数据保存到一个RDB文件中SAVE命令SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求我们可以通过save选项设置多个保存条件,
2021-04-07 14:50:18
166
1
原创 Kafka
参考文章常见消息传递模式点对点消息传递模式一条消息只能消费一次保证数据处理的顺序性发布订阅消息传递模式消费者可以订阅一个或多个topic消费者可以消费该topic中所有的数据同一条数据可以被多个消费者消费数据被消费后不会立马删除Kafka简介Kafka 只会保证在 Partition 内消息是有序的,而不管全局的情况Kafka 中一个 topic 中的消息是被打散分配在多个 Partition(分区) 中存储的下一个问题是:Partition 中的消息可以被(不同的 Con
2021-02-21 16:43:18
275
原创 常见设计模式
单例模式优点节省内存缺点存在线程安全问题原型模式用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象工厂模式简单工厂模式(静态工厂方法模式)创建一个类就要工厂方法模式一个工厂:生产实现了同一个接口的类的实例调用.getNewObject方法可以获取相应的类抽象工厂模式管理工厂的工厂一个集合类管理水果工厂和蔬菜工厂代理模式给某对象提供一个代理以控制对该对象的访问代理对象可以扩展目标对象的功能静态代理代理对象和目标对
2021-02-21 16:26:27
150
2
原创 分布式技术及海量数据处理
CAP理论一致性(Consistency): 写操作之后的读操作,必须返回该值。强一致性对于关系型数据库,要求更新的数据立即能被后续操作看到,CAP理论的一致性指这个弱一致性如果能容忍后续的部分或者全部访问不到,则是弱一致性。最终一致性如果经过一段时间后要求能访问到更新后的数据,则是最终一致性要么响应最新信息,要么返回错误,不能返回旧数据可用性(Availability): 只要收到用户的请求,服务器就必须给出回应。分区容错性(Partition Tolerance): 分布式系
2021-02-21 16:22:03
922
原创 操作系统基础知识
进程、线程、协程协程,用户空间线程,一个线程去负责调度多个协程进程线程分配资源的基本单位任务调度的基本单位进程切换开销大线程切换开销小进程间地址空间和资源相互独立多个线程共享进程的地址空间和资源一个进程崩溃不会影响其他进程一个线程崩溃整个进程崩溃导致所有线程崩溃比较项线程协程使用场景I/O较多的场景,线程会频频阻塞计算较多的场景资源占用java初始为1M,固定不变一般为2K,可随需要增大调度所属os内核
2021-02-13 18:53:57
366
原创 AQS详解
整体框架实现了Lock和Serializable接口内部Sync类继承自AQS,并重写了tryAcquire和treRelease方法AQS中的volatile变量state用于记录锁的持有状态和重入次数,1代表有有一个线程持有此锁,n代表当前线程冲入了n次维护一个双端队列存储竞争锁的线程,队列的头节点是虚节点AQS中的Node节点,waitStatus1:该节点的线程可能由于超时或被中断而处于被取消(作废)状态0:节点被创建的初始值-1:有后续节点需要被唤醒加锁流程...
2021-02-03 12:07:33
640
原创 第一次面试感受-阿里云(PAAS)
面试前期下午刚打完王者荣耀,大胜一场,内心窃喜,突然一个杭州☎️打进来,内心慌的一批,果然还是来了,约了晚上7点到8点的面试,此时到面试开始前的内心。面试开始此时小哥哥发来了一个不明链接,点进去开始了,一个黢黑的屏幕,加一个摄像头请求框,果断允许,好了正菜开始了:Java、C++、python对比解释语言:翻译一句,执行一句编译语言:全部翻译,一次执行Java:先编译.java文件,再解释.class文件python为什么慢:动态类型、解释语言、虚拟机、GIL(全局解释器锁)当时没想
2021-02-02 21:24:55
913
原创 MySQL和MongoDB
MySQL语句的执行顺序事务ACID特性MyISAM对比InnoDB锁InnoDB存储引擎锁机制粒度锁表级锁行级锁页面锁索引索引优点B+树索引基础知识特点对比B树优点索引解析注意普通索引语法唯一索引语法对比普通索引联合索引语法最左前缀匹配规则-查找排序都适用聚簇索引非聚簇索引(二级索引)Hash索引全文索引语法排序解析order by排序方式数据类型整数类型实..
2021-01-13 15:30:06
1466
1
原创 垃圾收集算法
垃圾收集理论及细节分代收集理论大多数对象都是朝生夕灭熬过越多次垃圾收集过程的对象越难消亡跨代引用相较于同代引用只占少数垃圾收集算法标记-清除 // 既可以标记存活对象,也可以标记消亡对象标记-赋值 // 标记存活对象,复制到另一半区标记-整理 // 标记存活对象,移动到一端HotSpot的垃圾收集算法细节根节点枚举 // 必须在能保障一致性的快照中进行安全点 // OOM内存放着存放对象引用的位置安全区域 // 在整个代码段内,引用关系不变记忆集与卡表 // 解决跨代引用
2020-12-18 16:21:04
89
原创 博弈型动态规划
类型1:一个队列,左右两侧拿数据思路dp[n][n] //代表当前先手能拿到的最优解先手拿完最优解,后手会拿当前情况下的最优解,下边公式有体现dp[i][j]={arr[i](i==j)maxOrmin(arr[i],arr[j])(i==j−1)maxOrmin(arr[i]+maxOrmin(dp[i+1][j−1],dp[i+2][j]),arr[i]+maxOrmin(dp[i+1][j−1],dp[i][j−2])) dp[i][j]=\left\{\begin{aligned}ar
2020-12-16 16:20:17
141
原创 类文件及类加载
类文件结构魔数与文件版本常量池访问标志类索引、父类索引与接口索引集合字段表方法表属性表类加载机制类加载时机类的加载过程加载验证准备解析初始化总体类加载原则使用卸载类加载器双亲委派模型破坏双亲委派机制类加载器类型Class.forName()和ClassLoader.loadClass()区别类文件结构魔数与文件版本常量池字面量符号引用访问标志public等类索引、父类索引与接口索引集合字段表方法表属..
2020-11-30 18:44:13
211
原创 垃圾回收机制
判断对象生存还是死亡引用计数法可达性分析算法固定可作为GC Roots的对象几种常见引用强引用软引用弱引用虚引用finalize方法最后判断对象是否死亡以下情况不会二次判断判断对象生存还是死亡引用计数法无法解决循环引用的问题可达性分析算法GC Roots做起始节点固定可作为GC Roots的对象虚拟机栈中引用的对象方法区中类静态属性引用的对象方法区中常量引用的对象所有被同步锁持有的对象Native方法引用的对象Java虚拟机内部的..
2020-11-30 18:43:22
129
原创 final和static变量
finalfinal变量其中类常量必须在声明时初始化,final成员常量可以在构造函数初始化对于类常量,JVM会缓存在常量池中,在读取该变量时不会加载这个类。final方法不能被子类的方法重写在编译的时候就已经静态绑定了,不需要在运行时动态绑定final类不能被继承类中的方法默认也是final类型的在匿名类中所有变量都必须是final变量内存语义普通变量在构造函数中对final域的对象写入与随后将构造函数的引用(实例)赋值给一个引用变量,操作不能重排序除此读一个包含
2020-11-30 14:19:32
148
原创 面向对象三大特性
什么时lambda表达式λ表达式本质上是一个匿名方法。lambda表达式的类型public int add(int x, int y) { return x + y;}(int x, int y) -> x + y;(x, y) -> x + y;lambda表达式的用处λ表达式主要用于替换以前广泛使用的内部匿名类,各种回调,比如事件响应器、传入Thread类的Runnable等面向对象三大特性封装继承子类不会继承父类的构造方法super代表父类多态
2020-11-30 11:51:17
110
原创 数据类型及拆箱装箱
八个基本数据类型自动向上转型byte,short,char < int < long < float < doouble当char、byte、short类型之间的任意两者的数据在运算时,会直接转化成int型=-*/四则运算时会自动向上(最大)转型Java基础数据类型与其对应的包装类原始类型包装类型byteByteshortShortintIntegerbooleanBooleanfloatFloatdoubl
2020-11-30 11:50:46
141
原创 泛型
类型擦除与c++的重要区别,Java是伪泛型Java中泛型是在编译器层次实现的,均被替换为Object 类型生成的Java字节代码中是不包含泛型中的类型信息无法解决动态运行时出现类型转换异常的情况Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉常用泛型类型变量E:元素(Element),多用于java集合框架K:关键字(Key)N:数字(Number)T:类型(Type)V:值(Value)通配符上界通配符<? extends
2020-11-30 11:50:14
102
原创 反射
获取反射,进而获取类的所有信息Student.classstudent.getClass()Class.forName(“Student”)静态代理公共接口,定义代理内容,代理可以处理这一部分业务请求代理类(被代理类)代理类缺点动态代理基于JDK的动态代理:基于接口的动态代理- 1.实现InvocationHandler接口,创建自己的调用处理器;- 2.为Proxy类newProxyInstance()函数指定ClassLoader对象和一组 interface来..
2020-11-30 11:49:26
91
原创 内存区域
程序计数器(线程私有)记录当前线程正在执行的虚拟机字节码指令的位置Java虚拟机栈、本地方法栈(线程私有)线程的每个方法都有一个对应的栈帧栈帧中的变量局部变量表操作数栈动态连接方法出口信息每个方法被调用到执行完毕的过程等同于一个栈帧在虚拟机栈中入栈和出栈的过程Java堆(线程共享)对象实例数组对象的内存布局对象头mark word类型指针,指向常量池的类信息实例数据代码中定义的字段内容对齐填充占位符对象的访问定位方式区分依
2020-11-29 19:49:46
86
原创 list数据结构
List接口ArrayList常规数组实现扩容,容量变为原来3倍int newCapacity = oldCapacity + (oldCapacity >> 1);线程不安全public boolean add(E e) { /** * 添加一个元素时,做了如下两步操作 * 1.判断列表的capacity容量是否足够,是否需要扩容 * 2.真正将元素放在列表的元素数组里面 */ ensureCapacityInterna
2020-11-29 09:50:25
201
1
原创 Map原理
任何一个类只要没有成员变量,就是线程安全的1. Map接口1.1. HashMap实现类1.1.1. put方法1.1.1.1. 流程1.1.1.2. 先对比hashcode,再用equals()方法1.1.1.3. 拉链法:1.1.2. hash方法resize()方法线程安全相关hashtableConcurrentHashMap结构任何一个类只要没有成员变量,就是线程安全的1. Map接口1.1. HashMap实现类1.1.1. put..
2020-11-29 09:47:29
543
1
原创 线程
六种状态状态名称说明NEW初始状态,被创建,但未调用startRUNABLE就绪状态RUNING运行状态BLOCKED阻塞状态,表示线程阻塞于锁WAITING等待状态,需要等待其他线程做出特定的动作(通知或中断)TIME_WAITING超时等待状态,可以在指定时间内自动返回TERMINATED终止状态线程创建实现Runnable接口Thread thread = new Thread(new Runnable(){
2020-11-29 09:46:37
113
原创 JMM、CAS与volatile
JMMCAS(比较并交换)过程存在的问题volatile关键字happens-before规则volatile作用保证内存的可见性禁止与普通变量重排序volatile内存语义的实现JMMCAS(比较并交换)过程V:要更新的变量(var)E:预期值(expected) //V变量该有的值N:新值(new)比较并交换的过程如下:判断V是否等于E,如果等于,将V的值设置为N;如果不等,说明已经有其它线程更新了V,则当前线程放弃更新,什么都不做存在..
2020-11-29 09:46:10
465
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人