java面试(十一)--(1)cookie 和 session 的区别(2)redis为什么是单线程(3)栈的模拟过程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/JAVA_I_want/article/details/102616348

1.请你说说,cookie 和 session 的区别?

1.Cookie:
通俗讲,是访问某些网站后在本地存储的一些网站相关信息,下次访问时减少一些步骤。更准确的说法是:Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器,是在客户端保持状态的方案。Cookies过期时间可设置的,如不设,则浏览器关掉就消失了,存储在内存当中,否则就按设置的时间来存储在硬盘上的,过期后自动清除,比方说开关机关闭再打开浏览器后他都会还存在.
2.Session
存在服务器的一种用来存放用户数据的类HashTable结构。
浏览器第一次发送请求时,服务器自动生成了一HashTable和一Session ID来唯一标识这个HashTable,并将其通过响应发送到浏览器。
浏览器第二次发送请求会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。
一般这个值会有个时间限制,超时后毁掉这个值,默认30分钟。
当用户在应用程序的 Web页间跳转时,存储在 Session 对象中的变量不会丢失而是在整个用户会话中一直存在下去。
Session的实现方式和Cookie有一定关系。建立一个连接就生成一个session id,打开几个页面就好几个了,这里就用到了Cookie,把session id存在Cookie中,每次访问的时候将Session id带过去就可以识别了.

区别:

  1. Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
  2. Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
  3. Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
  4. Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力.

2.redis为什么是单线程?

redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案.

3.栈的模拟过程。

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
示例代码:

public class TestStack {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
       
    }
}

实现代码:

import java.util.Stack;
public class TestStack {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        //如果都为空,则直接返回false
        if(pushA.length==0&&popA.length==0) return false;
        //设置一个栈来模拟判断
        Stack<Integer> stack=new Stack<>();

        for(int i=0,j=0;i<pushA.length;i++){
            //模拟PushA入栈顺序
            stack.push(pushA[i]);
            //popA从小标为0开始为出栈顺序
            //如果栈顶元素与出栈顺序元素相等表示可能为出栈顺序
            while(!stack.empty()&&stack.peek()==popA[j]){
                stack.pop();
                j++;
            }
            //如果不是,则继续入栈检查
        }
        //stack为空表示popA的顺序就是出栈顺序,否则返回false
        return stack.empty();
    }
    public static void main(String[] args) {
        int[] pushA=new int[]{1,2,3,4,5};
        int[] popA=new int[]{4,5,3,2,1};
        TestStack test=new TestStack();
        boolean flag = test.IsPopOrder(pushA, popA);
        System.out.println(flag);
    }
}

猜你喜欢

转载自blog.csdn.net/JAVA_I_want/article/details/102616348