力扣双周赛-174
题一和题二都很简单直接秒了,可惜我昨天在看斯诺克,边看边做,就没打算做最后一道困难题了,其实挺简单的。以后尽量双周赛都参加一下,锻炼一下我的辣鸡算法能力。
题三:100918. 交替按位异或分割的数目题意:给一个数列数组,把他划分为若干个子数列,每个数列的异或和在target1和target2之间轮转。
之前对异或不够熟悉。异或是位运算,相同为0,不同为1,从而有:
自己异或自己为零,即:a ^ a = 0
异或的逆运算是自己,因此:若a ^ b = c则a = c ^ b,即abc任意两个进行异或都等于第三个。
这个题用前缀异或和(类似前缀和)的特性,设置2个dp数组分别是dp1和dp2,表示:dp1[sum](或dp2[sum])表示分割前缀异或和为sum的序列,分割成满足target1和target2交错,且最后一组的异或值为target1(或target2)的序列组的方法数;
这样之后,当遍历到输入参数nums的下标i时,此时dp1[sum]和dp2[sum]便表示:在下标i之前,分割前缀异或和为sum、且以target1或target2结尾的方法数。因此状态转移方程,就是 ...
Java垃圾回收
复习:垃圾回收的主要区域就是 JVM 堆,也称堆内存。堆内存和方法区共同组成线程的共享区域。方法区存放类,堆存放对象。方法区在 JDK 1.8时被移动到本地内存中,不会收到 JVM 内存的限制。
类和对象的创建过程?线程私有区域有哪些?分别有什么用?
JVM 堆主要存放的是对象,它主要分为新生代和老年代(JDK1.8之前还有永久代暂时不做考虑),新生代又分为Eden和2个Suivivor区域。
分代回收机制_3代
Minor GC / Young GC:Eden放不下新创建的对象时触发,负责对新生代回收。Minor GC一般是用标记-复制算法,因为对象存活时间比较短。该算法首先回收Eden和Survivor中的垃圾对象,并将存活对象的年龄+1复制到空闲的S区;这些存活对象也可能被放到老年代去,具体得看对象的年龄阈值和S区剩余空间,即动态年龄计算。动态年龄计算:将S区的对象大小,从小到大依次累加,直到S区空间的一半,此时取min{该对象的年龄,年龄阈值}作为进入老年代的年龄基准;如果Eden区的对象太大,则直接放到老年代。
Major GC / ...
Java多线程
乐观锁和悲观锁悲观锁悲观锁在写操作频繁的场景下表现较好:共享资源被多个线程频繁地修改,悲观锁可以避免大量的重试和回滚操作。
synchronized
同步实例方法
修饰实例方法,是对象级别的锁,同一时间1个对象只能有1个同步实例方法在执行;但是非同步方法无所谓。
1public synchronized void decrement() {}
修饰类的静态方法
修饰静态方法,是类级别的锁,会锁定当前类的Class对象。同一时间只有一个线程可以执行该类的任何1个synchronized静态方法。
1public static synchronized void incrementStatic() {}
同步代码块:同步代码块提供了更细粒度的控制,允许你指定一个对象作为锁,只对代码块内的特定代码进行同步。
12345678910111213141516class BlockCounter { private int count = 0; private final Object lock = new Object( ...
Spring相关
什么是 Spring 和 SpringBootSpring 是什么Spring Framework 是很多模块的集合,使用这些模块可以很方便地协助我们进行开发;核心功能是 IoC 和 AOP。下图是 Spring 中各个模块之间的依赖关系。需要大概知道一些模块是干嘛的。
Core Container:基础模块,包含spring-core、spring-beans等
Data Access/Integration:数据访问模块,包含spring-jdbc、spring-orm等
Spring Web:网络部分,包含spring-webmvc、spring-websocket等等
Spring BootSpringBoot是用来快速开发Spring应用的一个脚手架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程;
SpringBoot提供了很多内置的Starter(⼀系列依赖关系的集合)结合自动配置,对主流框架如 Redis MySQL无需配置或开箱即用;
SpringBoot简化了开发,采用JavaConfig的方式可以使用零xml的方式进行开发,配置即 ...
JVM内存区域
总述主要分为运行时数据区域(JVM内存)和本地内存。
运行时数据区域(即**JVM内存**):JVM 规范中定义的所有内存区域的统称,是个逻辑区域。包含:
线程共享区域,包含“堆内存”、方法区(JDK1.7在共享区域,称为永久代;1.8之后被放到本地内存之中,称为元空间,但逻辑上仍属于JVM定义的规范之中)
线程私有区域,包含虚拟机栈、本地方法栈、程序计数器
本地内存:除去“运行时数据区域”后其余的物理内存
直接内存:特殊的一种内存缓冲区
元空间:是JVM规范中的“方法区”的一种实现,方法区是认为在JVM内存中的。JVM 的运行时数据区域 有固定大小上限,会受到JVM内存的限制;而放到本地内存后,只限制于系统可用的内存
JVM内存_线程私有区_3个程序计数器每个线程都有一个程序计数器,是当前线程所执行的字节码的行号指示器。字节码是JVM能识别的代码,是Java编译后形成的,并由在JVM上解释执行,它的代码是有行号的。可以通过如下命令查看:
12javac ClassName.javajavap -c -v ClassName
和 Reduce(规约)两个阶段。
MapReduce程序的代码比较复杂,需要自行编写,非常麻烦。因此出现了Hive和Pig等工具,而后续Hadoop的MapReduce部分就基本不用了,更多用的是它的HDFS文件系统。
1.3. YARN即ResourceManager,资源管理器。负责集群资源的调度和管理,包括 CPU、内存等。它使得不同的应用程序(如 MapReduce、Spark、Hive 等)可以共享同一个 Hadoop 集群的资源。
这个感觉不一定要划分为Ha ...
K8S部署主从复制MySQL和哨兵Redis
前置准备首先配置好K8S,并能保证节点之间的通信,可能需要配置网络插件,例如flannel,确保单机跑多副本的nginx是没问题的。
总共大约4步:
配置NFS
helm更换镜像
配置NFS123456> sudo apt update && sudo apt install nfs-kernel-server -y> sudo mkdir -p /mnt/nfs_share # 自定义你要共享的目录> sudo chown nobody:nogroup /mnt/nfs_share && sudo chmod 777 /mnt/nfs_share # 设置权限> vim /etc/exports # 编辑配置,添加在文件最后添加 /mnt/nfs_share *(rw,sync,no_subtree_check)> sudo exportfs -a # 导出配置> sudo systemctl restart nfs-kernel-server # 重启NFS服务
可以在另一台服务器上测试一下
1234567 ...
计算机网络学习笔记
本文是在阅读JavaGuide关于计算机网络相关内容时的个人整理;
请移步:https://javaguide.cn
OSI七层模型很清晰、理论完整,但是太复杂且不适用,所以更多使用tcp/ip协议
应用层:为用户提供了与网络进行交互的接口;
表示层:进行一些数据处理,例如加密解密、编码解码、压缩和解压缩
会话层:管理应用程序之间的会话
传输层:为会话之间的通信提供可靠的数据传输
网络层:IP数据包在传输时的路由和寻址
链路层:对数据帧进行编码、对传输的误差进行纠正
物理层:传输比特流数据
TCP/IP四层模型应用层应用层:以报文为数据单元,使得应用程序之间进行信息交换
常见协议:
基于TCP
HTTP协议(HTTPs):基于 TCP 协议,是一种用于传输超文本和多媒体内容的协议,为 Web 浏览器与 Web 服务器之间的通信而设计的
Websocket协议:客户端和服务端可以同时发送或接收,基于 TCP 连接的全双工通信,通过心跳机制来保持 WebSocket 连接的稳定性和活跃性
SMTP协议(简单邮件传输(发送)协议)、IMAP/POP3协议 ...
MySQL学习笔记
本文是在阅读JavaGuide关于MySQL相关内容时的个人整理;
请移步:https://javaguide.cn
三大日志重做日志(redo-log)
(用来干嘛的) InnoDB 存储引擎独有,MySQL崩溃时用来恢复数据:重新执行 Redo Log 中尚未持久化到数据文件的修改操作;
(前置知识)MySQL的查询会把数据页读到缓冲池Buffer Pool中,更新数据会直接在Buffer Pool操作;
(如何做的)把“在某个数据页上做了什么操作”记录到重做日志缓存redo log buffer中,再刷盘;
(事务的特殊)事务执行过程的 redo log 会写入 redo log buffer 中,因为可能会被后台线程刷盘,所以没有提交事务的 redo log 记录也可能被写入磁盘;
(存储形式)硬盘上存储的 redo log 是以一个日志文件组的形式出现的,每个的 redo 日志文件大小都是一样的,会进行循环写入;
二进制日志(bin-log)
(做啥的)逻辑日志,顺序记录所有涉及更新数据的逻辑操作;主从|主备依靠它同步;
(记录格式)statement记录SQL原文;r ...
Redis学习笔记
本文是在阅读JavaGuide关于Redis相关内容时的个人整理;
请移步:https://javaguide.cn
核心知识点基本数据类型基本的5种
String(字符串),使用SDS,即Redis自己构建的简单动态字符串来实现;
List(列表),用的是双向链表,支持反向查找;
Hash(散列),键的值是键值对,可以用于存储对象,实现类似Java的HashMap;
Set(集合),无序结构且无重复,支持交并差集的运算,可用于共同关注、粉丝等功能
Zset(有序集合),跳表实现,针对Set中每个元素增加一个权重参数score,根据这个参数有序排列;可以根据score范围获取元素列表,可以用于实现排行榜
特殊的3种
HyperLogLog(基数统计)
Bitmap (位图)⚠️
Geospatial (地理位置)
底层8种类型
简单动态字符串(SDS)
LinkedList(双向链表)
Dict(哈希表/字典)
SkipList(跳跃表):用于Sorted Set
Intset(整数集合):紧凑地存储多个整数⚠️
ZipList(压缩列表)⚠️
QuickList(快 ...









