美团:2019秋招 后台开发 现场面试

2019-10-01  本文已影响0人  阿臻同学

具体问题

import java.util.Stack;
import java.util.concurrent.locks.ReentrantLock;
public class StackQueue<T> {
    Stack<T> data = null;
    Stack<T> temp = null;
    ReentrantLock lock = new ReentrantLock();

    public StackQueue() {
        data = new Stack<T>();
        temp = new Stack<T>();
    }

    public T pop() {
        lock.lock();
        if (temp.isEmpty())
            swap(data, temp);
        if (temp.isEmpty()) {
            lock.unlock();
            return null;
        }
        T top = temp.pop();
        lock.unlock();
        return top;

    }

    public T peek() {
        lock.lock();
        if (temp.isEmpty())
            swap(data, temp);
        if (temp.isEmpty()) {
            lock.unlock();
            return null;
        }
        T top = temp.peek();
        lock.unlock();
        return top;
    }

    public void push(T element) {
        lock.lock();
        if (data.isEmpty())
            swap(temp, data);
        data.push(element);
        lock.unlock();
    }
    void swap(Stack<T> src, Stack<T> dest) {
        while (!src.empty()) {
            dest.push(src.pop());
        }
    }
    public boolean isEmpty(){
        return data.isEmpty() && temp.isEmpty();
    }
}

线程调度:

线程状态:

所采用的GC算法是复制算法,具体机制为:在发生垃圾回收时,edens1中存活的对象复制到s2中并对edens1进行清理,然后交换s2s1的角色。

在这样的机制下,虚拟机的空间利用率能达到90\%,只有10\%用于下一轮GC的辅助空间会被“浪费”,且由于会在s1s2交替的使用复制算法,所以不会存在较大的内存碎片,整体的空间利用率较高,。

对比使用edens1s2进行处理的方法,如果去掉其中一个Survivor空间,则每一次GC都只能从eden复制到s中。如果对s本身没有优化处理的话,在s中容易产生内存碎片,导致eden中稍大的存活对象都无法存放于s,最终导致提前触发下一轮GC甚至报错。虽然空间是100\%的用到了,但是整体的效率和可靠性还是较低。

连接建立阶段 内容 发送方 接收方
1 发送方发送SYN 发送方:
接收方:
发送方:发送能力
接收方:接受能力
2 接收方发送ACKSYN 发送方:接受能力、发送能力
接收方:接受能力、发送能力
发送方:发送能力
接收方:接受能力
3 发送方发送ACNSYN 发送方:接受能力、发送能力
接收方:接受能力、发送能力
发送方:接受能力、发送能力
接收方:接受能力、发送能力

维基百科:Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

对于映射到同一个Servlet类的多个请求,通过创建一个Servlet实例,多个线程执行这个Servletservice方法的实现。所以在Servlet中,实例变量都不是线程安全的,只有局部变量(requestsession等)才是线程安全的。

参考:

参考自《高性能MySQL》第三版:
这意味着通过二级索引查找行,存储引擎需要找到二级索引的叶子节点获得对应的主键值,然后更具这个值去聚簇索引中查找到对应的行。

非递归中序遍历二叉树

中序遍历代码:


    public static void iterate(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode node = root;
        while (true){
            // 不断往左下方遍历,中间的节点保存在栈中
            while (node.left != null) {
                stack.push(node);
                node = node.left;
            }
            // 处理最左边的节点
            process(node);

            // 从栈中取出父节点,并处理其右子树
            while (!stack.isEmpty() && node.right == null) {
                node = stack.pop();
                process(node);
            }
            if (node.right != null) {
                // 有右孩子,则处理右孩子
                node = node.right;
            } else {
                // 栈空,所有节点处理完毕
                break;
            }
        }
    }

    public static void process(TreeNode node) {
        System.out.print(node.val+ " ");
    }
上一篇 下一篇

猜你喜欢

热点阅读