Algorithm
解题思路一:
暴力循环:回文字串的特征就是前后对称,直接暴力循环,利用一个stack的特性(先进后出),之后在遍历这个栈和原字符串对比,就可以了
时间复杂度:O(n)
源码:
import java.util.Locale;
import java.util.Stack;
class Solution {
public boolean isPalindrome(String s) {
if ("".equals(s) || s.length() == 1) {
return true;
}
s = s.replaceAll(" ", "");
s = s.toLowerCase(Locale.ROOT);
Stack<Character> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if ((s.charAt(i)>='0' && s.charAt(i) <='9') || (s.charAt(i) >= 'a' && s.charAt(i) <= 'z')){
stack.add(s.charAt(i));
sb.append(s.charAt(i));
}
}
int i = 0;
while (!stack.isEmpty()) {
Character pop = stack.pop();
char c = sb.charAt(i);
if(c != pop) {
return false;
}
i++;
}
return true;
}
}
解题思路二:
双指针:利用两个指针分别指向初始位置和末尾位置,然后想中间遍历,如果遇见特殊符号,直接跳过。
时间复杂度:O(n)
源码:
import java.util.Locale;
import java.util.Stack;
import java.util.regex.Pattern;
class Solution {
public boolean isPalindrome(String s) {
if ("".equals(s) || s.length() == 1) {
return true;
}
s = s.toLowerCase(Locale.ROOT);
int left = 0;
int right = s.length()-1;
while (left < right) {
char a = s.charAt(left);
char b = s.charAt(right);
boolean c = (a >='0' && a <='9') || (a >='a' && a <='z');
boolean d = (b >='0' && b <='9') || (b >='a' && b <='z');
if (c && d) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
continue;
}
if (!c) {
left++;
}
if (!d) {
right--;
}
}
return true;
}
}
Review
Project Loom: Understand the new Java concurrency model
https://www.infoworld.com/article/3652596/project-loom-understand-the-new-java-concurrency-model.html
学习单词:
address n:地址,演讲
v: 演讲,提出,处理
alternative n:代替物
adj:可代替的;另类的;互不相让的
downside n:缺点
breathtaking adj:惊人的
fiber n:纤维
capture n:捕获
continuation n. 连续,持续;延续物,附加物;(停顿后的)继续,再开始
学习句子:
This model is fairly easy to understand in simple cases
在简单的情况下,这个模型相当容易理解
Listing 1. Launching a thread with traditional Java
运行在传统的java线程上
Listing 2. Creating a virtual thread
Thread.startVirtualThread(
() -> {
System.out.println("Hello World");
}
);
Lower-level async with continuations
可延续的低水平调用
Tail-call elimination
尾部消除调用
3. Tip
分享几个spring中的接口
ImportBeanDefinitionRegistrar
里面只有一个方法
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
此方法中的一般registry.registerBeanDefinition来注册beandefinition。
beanDefinition实际上是 private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);
它可以搭配
EnvironmentAware
BeanFactoryAware
BeanClassLoaderAware
ResourceLoaderAware
这四个Aware接口使用,保证Aware接口在之前调用
用于注册beanDefinition的,但是要Along with @Configuration and ImportSelector, classes of this type may be provided to the @Import annotation (or may also be returned from an ImportSelector)
注册bean Definition的源码
...上面一些简单的代码
if (hasBeanCreationStarted()) {// 此时说明已经有bean开始创建了,所以需要给beanDefinitionMap加上锁
// Cannot modify startup-time collection elements anymore (for stable iteration)
synchronized (this.beanDefinitionMap) {
this.beanDefinitionMap.put(beanName, beanDefinition);
List<String> updatedDefinitions = new ArrayList<String>(this.beanDefinitionNames.size() + 1);
// 同时维护了一个beanDefinitionNames,里面记录了bean注册的顺序
updatedDefinitions.addAll(this.beanDefinitionNames);
updatedDefinitions.add(beanName);
this.beanDefinitionNames = updatedDefinitions;
if (this.manualSingletonNames.contains(beanName)) {
// 这里怕有重复的
Set<String> updatedSingletons = new LinkedHashSet<String>(this.manualSingletonNames);
updatedSingletons.remove(beanName);
this.manualSingletonNames = updatedSingletons;
}
}
}
else {// 这里因为bean还未开始创建所以一点也不担心
// Still in startup registration phase
this.beanDefinitionMap.put(beanName, beanDefinition);
this.beanDefinitionNames.add(beanName);
this.manualSingletonNames.remove(beanName);
}
this.frozenBeanDefinitionNames = null;
protected boolean hasBeanCreationStarted() {
// 看bean创建工作是否已经开始了
return !this.alreadyCreated.isEmpty();
}
EnvironmentAware
里面有
void setEnvironment(Environment environment);
Interface to be implemented by any bean that wishes to be notified of the Environment that it runs in.
任何的bean想要知道environment可以实现这个接口
4. Share
https://mp.weixin.qq.com/s/H2toewJKEwq1mXme_iMWkA美团技术-设计模式