11/4
今天做了两道算法题和进入JVM的浅层学习
首先先总结JVM的知识内容
JVM一开始就是讲述类加载器(ClassLoader)
类加载器分为三种:BootStrapClassLoader、ExtClassLoader、AppClassLoader
在JAVA中,类加载的机制是双亲委派机制
原理就是从下而上寻找可以加载的加载器,如果这个加载器没有的话,就寻找父类的加载器,顺序是(App->Ext->BootStrap),然后自上而下地进行加载,如果没有可以加载的加载器,就会有异常,一图流解释如下:
(转载自https://blog.csdn.net/codeyanbao/article/details/82875064)
然后是三类加载器的区别
1.BootStrapClassLoader,启动类加载器,在C++已经定义编写,它加载java的核心库java.*,构造了ExtClassLoader和AppClassLoader,由于引导类的加载器涉及到虚拟器的具体实现细节,所以一般不允许开发者直接通过引用来进行这个加载器的操作,
2.ExtClassLoader,主要是加载java中的扩展库,由java编写,也叫标准扩展类加载器,主要加载如jre,javax.*等的扩展库或者java.ext.dir指定位置的类,开发者可以直接引用这个类加载器。
3.AppClassLoader,也叫系统类加载器
由java编写,加载程序所在的目录,例如’user.dir’所在位置的class
4.CustomClassLoader
用户自定义编写的类加载器,加载用户自定义的class
Java的安全核心是沙箱
**沙箱就是让java代码限定在jvm的指定范围内运行,并且严格限制代码对本地系统资源的访问,**通过这样的操作可以对代码进行有效隔离,对系统资源进行了保护。
当前最新的安全机制实现,则引入了域(Domain)的概念。虚拟机会把所有代码加载到不同的系统域和应用域,系统域部分专门负责与关键资源进行交互,而各个应用域部分则通过系统域的部分代理来对各种需要的资源进行访问。虚拟机中不同的受保护域(Protected Domain),对应不一样的权限(Permission)。存在于不同域中的类文件就具有了当前域的全部权限,如下图所示最新的安全模型(jdk 1.6)
图 JDK1.6安全模型
今天的jvm总结暂告一段落,还有一个!
jvm中的调优,99%都在堆和方法区中调优!!!
然后是今天的算法环节,今天只做了两道题,做到第三道回溯的时候,脑袋瓜就变大了,头疼,所以摸鱼了
今天的第一道题是
20. 有效的括号
题目如下:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码思路:首先弄了一个哈希表来存放括号的组合,各种左括号对应了右括号,然后实现是用了栈的方法来实现的,先让输入的左括号字符串入栈,然后到右括号字符串时,如果栈顶不是对应的左括号,就返回false,如果是,就把栈顶的左括号弹出来。
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i);
if (pairs.containsKey(ch)) {
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop();
} else {
stack.push(ch);
}
}
return stack.isEmpty();
}
}
21.21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码思路:这道题是一道简单的链表题,首先创造新链表的头,然后比较l1和l2,决定谁在头的后面,再比较l2和l1.next,决定谁在l1的后面,如图所示实现:然后最后再加上null
具体代码实现如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
今天怎么说呢,回溯真的是让人头大的东西,突然有点迷茫了,难过,还是继续吧,今天就先这样了。