头条一面挂经
以下记录的都是没答上来的问题:
1.可以作为GCroots的对象:
虚拟机栈中引用的对象,
方法区中类静态属性引用的对象,
方法区中常量引用的对象
JNI中引用的对象
2.循环引用怎么解决
java中不存在循环引用
c++的循环引用是用weak_ptr来解决的
3.垃圾收集具体是怎么执行的?
可达性分析,oopmap
4.volatile的实现原理:
java的内存模型为volatile提供了特殊的规则.
5.共享内存的实现原理
把一片物理空间映射到两个进程内的虚拟地址空间
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String exp = br.readLine();
if(isValid(str,exp) && isMatch(str,0,exp,0)){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
public static boolean isValid(String s, String e) {
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '.' || s.charAt(i) == '*') {
return false;
}
}
for (int j = 0; j < e.length(); j++) {
if (e.charAt(j) == '*' && (j == 0 || e.charAt(j-1) == '*')) {
return false;
}
}
return true;
}
public static boolean isMatch(String src,int si,String exp,int ei){
if(ei == exp.length()) return si == src.length();
if((ei + 1) == exp.length() || exp.charAt(ei+1) != '*' ){
return si != src.length() && (src.charAt(si) == exp.charAt(ei) || exp.charAt(ei) == '.')
&& isMatch(src,si+1,exp,ei+1);
}
while((si != src.length()) && (src.charAt(si) == exp.charAt(ei)||exp.charAt(ei) == '.')){
if(isMatch(src,si,exp,ei + 2)){
return true;
}
si++;
}
return isMatch(src,si,exp,ei + 2);
}
}