Java,八股,cv,算法——双非研0四修之路day19
目录
昨日总结
- 分布式锁,JVM,完成点评分布式锁
- cv(停滞中)
- 背诵小林coding--Java并发面试篇(1/2)
- 代码随想录——反转字符串里的单词,反转字符串||
今日计划
- JVM课程学习,跟进点评
- cv(停滞中)
- 背诵小林coding--Java并发面试篇(2/3)
- 代码随想录——KMP算法,重复的子字符串
算法——反转字符串里的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue" 输出:"blue is sky the"
示例 2:
输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。
class Solution {
public String reverseWords(String s) {
StringBuilder res = new StringBuilder();
int start = 0 ;
// 去除前面的空格
while(s.charAt(start)==' ') start++;
int len = s.length();
// 从后往前遍历字符串 定义i,j j记录单词末尾 i为单词起始
for(int i=len-1 ; i>=start ; i--){
// 当遍历字符是空格时i,j 同步向前移动,j保存第一个不为空格的字符
int j = i;
// 当i位置不为空格时,i继续向前移动知道遇到空格
while(i>=0 && s.charAt(i)!=' '){
i--;
}
// 若i!=j 此时i代表单词首个字母前一个空格 j为单词末尾
if(i!=j){
res.append(s.substring(i+1,j+1)); // substring endindex 不包括j+1;
// 第一个单词前都加空格
if(i>start){
res.append(' ');
}
}
}
return res.toString();
}
}
算法—— 反转字符串||
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
class Solution {
public String reverseStr(String s, int k) {
char[] c = s.toCharArray();
int len = c.length;
for(int i = 0;i < len;i += k*2 ) {
for(int j = i, m = Math.min(i + k - 1, len - 1);j < m; j++, m--){
char temp = c[j];
c[j] = c[m];
c[m] = temp;
}
}
return new String(c);
}
}
JVM学习笔记
JVM
定义:Java程序的运行环境(java二进制字节码的运行环境)
优点:
一次编写,到处运行;
自动内存管理,垃圾回收功能;
即时编译,对热点代码进行优化,提高执行效率。(对于字节码文件中的热点代码字节码指令,JVM会通过JIT编译器进行解释和优化,将它们翻译成汇编和机器码,将他们存储在内存中,方便再次执行时直接从内存调用)
JVM与字节码文件的关系
JVM不关心字节码文件的来源,可接受来自其他语言的字节码文件,而非受限制于java语言,只关注于字节码文件的规范。

JVM、JRE、JDK三者关系图

JVM整体结构
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易
实现,缺点是性能下降,实现同样的功能需要更多的指令。
概览图
方法区和堆是线程共享的,Java栈和本地方法栈和程序计数器是 各个线程独一份的

详细图

分布式锁
满足分布式系统或集群模式下多进程可见并且互斥的锁。
在集群模式下,synchronized的锁失效了。在集群模式中,每个集群都有他自己的JVM,都会有自己对应的锁监视器。synchronized锁通过锁监视器在JVM内部可以实现并发安全,当有多个节点时,线程就会同时进行,进而引发线程安全问题。
为此分布式锁来解决次问题。
分布式锁的实现


基于Redis的分布式锁实现思路:
利用setnxex获取锁,并设置过期时间,保存线程标示
释放锁时先判断线程标示是否与自己一致,一致则删除锁
特性:
利用set nx满足互斥性
利用setex保证故障时锁依然能释放,避免死锁,提高安全性
利用Redis集群保证高可用和高并发特性
Redisson
Redisson是一个在Redis的基础上实现的Java驻内存数据网格。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。

更多推荐
所有评论(0)