今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

Java面试问题2021

  1.谈谈你对Cookie和Session的理解

答:Cookies和会话都用于存储信息。 Cookie仅存储在客户端计算机上,而会话则存储在客户端和服务器上。Session在服务器上的临时目录中创建一个文件,该目录中存储了已注册的会话变量及其值。 在访问期间,该数据将可用于网站上的所有页面。当用户关闭浏览器或离开网站后,会话结束,服务器将在预定时间段(通常为30分钟)后终止会话。

Cookies是存储在客户端计算机上的文本文件,并且保留使用跟踪目的。 服务器脚本将一组cookie发送到浏览器。 例如名称,存活时间或标识等。浏览器将此信息存储在本地计算机上,以备将来使用。当下一次浏览器向Web服务器发送任何请求时,它会将那些cookie信息发送到服务器,并且服务器使用该信息来识别用户。

Session与Cookie获取与设置

    @RequestMapping("/getCookie")
    public Object getCookie(HttpServletRequest request) {
        return getCookie(request,"sessionId");
    }

    @RequestMapping("/setSessionAndCookie")
    public Object setSession(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        session.setAttribute("person",new Person(18,"zhang"));
        Cookie uiColorCookie = new Cookie("color", "red");
        Cookie sessionId = new Cookie("sessionId", session.getId());
        response.addCookie(uiColorCookie);
        response.addCookie(sessionId);
        return session.getId();
    }


    public Object getCookie(HttpServletRequest request,String key) {
        return Arrays.stream(request.getCookies())
                .filter(c -> key.equals(c.getName()))
                .map(Cookie::getValue)
                .findAny();
    }

2.ArrayList中怎么根据属性排序,根据属性去重

    @Test
    public void  test(){
        List<Person> persons = new ArrayList<>();
        persons.add(new Person(33,"张飞"));
        persons.add(new Person(16,"曹操"));
        persons.add(new Person(20,"孙权"));
        persons.add(new Person(11,"诸葛亮"));
        persons.add(new Person(14,"张飞"));

        List<Person> distinct = persons.stream().collect(
                collectingAndThen(
                        toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getName))), ArrayList::new)
        );
        System.out.println(distinct);

        List<Person> sort1= persons.stream()
                .sorted(Comparator.comparing(Person::getAge).reversed())
                .collect(Collectors.toList());
        System.out.println(sort1);

    }

3.Spring如何处理线程安全的

spring bean 安全取决于bean本身是否安全。无状态的单例bean是线程安全的,

4.redis 查询多个key  keys* scan 模式匹配
5.趴楼梯问题
6.两个栈实现一个队列
7.list 按属性分组排序
8.关于String的几个问题

public class StringProblem {

    public static void main(String[] args) {
        StringProblem sp = new StringProblem();
        System.out.println("-----demo1-----");
        sp.demo1();
        System.out.println("-----demo2-----");
        sp.demo2();
    }

    public void demo1(){
        String str1="hello";
        String str2=new String("hello");
        System.out.println(str1.equals(str2));
        System.out.println(str1==str2);
    }

    public void demo2(){
        String str1="hello";
        String str2= "he"+"llo";
        String str3= "he"+new String("llo");
        System.out.println(str1==str2);
        System.out.println(str1==str3);

    }
}

//输出结果
-----demo1-----
true
false
-----demo2-----
true
false

我们来分析一下这两个方法,在demo2中st1申明的"hello "会放入常量池中,str2 通过new 的方式创建,会开辟新的堆空间,但是构造器内的对象相当于一个string的匿名对象,因为常量池已经有,所以指向的是常量池中的"hello"

这一点也可以通过 javap -c  编译后的class来验证

方法二中为什么str1==str2为ture呢。虽然string是不可变的,"he"和"llo" 会开辟新空间 但是这两者拼接的结构 hello已在常量池中,所以和str还是统一对象。那为什么str1==str3为false 我们再使用javap 观察一下

哎,我们StringBuilder,这里拼接的时候使用了StringBuilder的append方法,最后使用toString方法重新new 一个String对象,所以str1!=str3


public class Example {
    String str = new String("good");
    char[] ch = {'a', 'b', 'c'};

    public static void main(String args[]) {
        Example ex = new Example();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }

    public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'g';
    }
}

9.Java并发ABA问题

 首先什么是ABA问题呢。

加入两个线程修改同一个变量的值,T1线程执行的快,中途执行了多次操作,最后将变量的值重新改回最初的值,此时线程T2修改呢变量值,但是认为值和最开始拿的值相同,就直接更新了,但不知道中间过程 ,肯能造成数据不一致性。

解决:通过引入版本号解决ABA问题

public class ABAIssue {

    private AtomicStampedReference asr;

    public static void main(String[] args) {
        AtomicReference atomicReference = new AtomicReference("A");
        AtomicStampedReference asr = new AtomicStampedReference("A", 1);
/*        new Thread(() -> {
            atomicReference.compareAndSet("A", "B");
            atomicReference.compareAndSet("B", "A");

        }).start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            atomicReference.compareAndSet("A", "AAA");
            System.out.println(atomicReference.get());
        }).start();*/


        new Thread(() -> {
            int stamp=    asr.getStamp();
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ABA:T1==>version:"+stamp);
            asr.compareAndSet("A","B",stamp,stamp+1);
            System.out.println("ABA:T1==>version:"+asr.getStamp());
            asr.compareAndSet("B","A",asr.getStamp(),asr.getStamp()+1);
            System.out.println("ABA:T1==>version:"+asr.getStamp());
        }, "T1").start();


        new Thread(() -> {
            int stamp=    asr.getStamp();
            System.out.println("ABA:T2==>version"+asr.getStamp());
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            asr.compareAndSet("A","AAA",stamp,stamp+1);
            System.out.println("ABA:T2==>version"+asr.getStamp()+"\tresult==>"+asr.getReference());
        }, "T2").start();
    }
}

10.什么是锁升级


9.spring cloud ,dubbo

分享到:

专栏

类型标签

网站访问总量