• 2022美团秋招java面试流程,技术面题解析 看完吊打面试官


    第一部分-自我介绍

    第二部分-Java的基础知识

    1、接口和抽象类的区别

    抽象类(abstract)

    • abstract修饰的类就是抽象类,修饰的方法就是抽象方法。
    • 抽象类中可以没有抽象方法,但有抽象方法的类一定要声明为抽象类。
    • 抽象类不能使用new来创建对象,它是用来让子类继承的。
    • 抽象方法只有方法的声明,没有实现,让其子类实现。
    • 子类继承抽象类,必须实现抽象类的所有方法,否则该子类也要声明为抽象类。
    //abstract 抽象类:类 extends: 单继承(接口可以多继承)public abstract class Action {    //约束~有人帮我们实现~    //abstract,抽象方法,只有方法名字,没有方法的实现!    public abstract void doSomething();    //1.不能new抽象类,只能靠子类去实现它,仅作为一个约束    //2.抽象方法只能出现在抽象类中,抽象类可以有普通方法    //抽象的抽象:约束    //3.抽象类有构造器,可以派生子类    //4.抽象类的意义:约束,提高开发效率。但是类只能单继承,所以有局限 用的不多    }
    //抽象类的所有方法,继承了它的子类,都必须要实现它的方法public class A extends Action{    @Override    public void doSomething() {    }}

    接口(interface)

    • 普通类:只有具体实现
    • 抽象类:具体实现和规范(抽象方法)都有
    • 接口:只有规范,没有方法实现,专业的约束!约束与实现分离:面向接口编程~
    • 接口就是规范,定义的是一组规则,"你是什么…必须做什么…"的思想。
    • 接口的本质是约束,就像人间法律一样,制定好大家都遵守。
    //interface 定义的关键字,接口都需要有实现类public interface UserService {    //接口中的所有定义其实都是抽象的 public abstract     void add(String name);     void delete(String name);     void update(String name);     void query(String name);}
    //类 可以实现接口 implements 接口//实现接口的类,就需要重写接口中的方法public class UserServiceImpl implements UserService{    @Override    public void add(String name) {    }    @Override    public void delete(String name) {    }    @Override    public void update(String name) {    }    @Override    public void query(String name) {    }}

    作用:
    1、约束
    2、定义一些不同的方法,让不同人的实现
    3、public abstact
    4、public static final
    5、接口没有构造方法,不能被实例化
    6、实现类必须要重写接口中的方法
    7、实现类(implements) 可以实现多个接口

    2、Java1.8之后的新特性

    Lambda表达式

    lambda表达式本质上是一段匿名内部类,也可以是一段可以传递的代码

    package com.kuang.lambda;//lambda表达式public class TestLambda1 {    //3、静态内部类    static class Like2 implements ILike{        @Override        public void lambda() {            System.out.println("I like lambda2");        }    }    public static void main(String[] args) {        ILike like = new Like();        like.lambda();        like = new Like2();        like.lambda();        //4、局部内部类        class Like3 implements ILike{            @Override            public void lambda() {                System.out.println("I like lambda3");            }        }        like = new Like3();        like.lambda();        //5.匿名内部类,没有类的名称,必须借助接口或者父类        like = new ILike() {            @Override            public void lambda() {                System.out.println("I like lambda4");            }        };        like.lambda();        //6.用lambda简化,接口和方法都不要了        like = ()->{            System.out.println("I like lambda5");        };        like.lambda();    }}//1、定义一个函数式接口//任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口//接口里默认是抽象方法interface ILike{    void lambda();}//2、实现类class Like implements ILike{    @Override    public void lambda() {        System.out.println("I like lambda");    }}

    多个参数

    package com.kuang.lambda;public class TestLambda2 {    public static void main(String[] args) {        ILove love = new Love();        love.love("bl");        love = new ILove() {            @Override            public void love(String a) {                System.out.println("I love you-->"+a);            }        };        love.love("bdf");        //lambda表达式        love = (String a)->{            System.out.println("I love you-->"+a);        };        love.love("yiyeri");        //简化1.去掉参数类型        love = (a)->{            System.out.println("I love you-->"+a);        };        love.love("520");        //简化2.简化括号        love = a ->{            System.out.println("I love you-->"+a);        };        love.love("521");        //简化3.简化花括号        love = a ->            System.out.println("I love you-->"+a);        love.love("aaaaaaa");        //总结:        /*        1.lambda表达式只能有一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹        2.前提是接口为函数式接口        3.多个参数也可以去掉参数类型,要去掉就都去掉了,必须加上括号         */    }    }interface ILove{    void love(String a);}class Love implements ILove{    @Override    public void love(String a) {        System.out.println("I love you-->"+a);    }}

    2、Java1.8之后的新特性-hashmap

    在jdk1.8中对hashMap等map集合的数据结构优化。
    hashMap数据结构的优化
    原来的hashMap

    • 采用的数据结构是哈希表(数组+链表),

    hashMap默认大小是16,一个0-15索引的数组,

    3.如何往里面存储元素,

    (1)首先调用元素的hashcode方法,计算出哈希码值,

    (2)经过哈希算法算成数组的索引值,

    • (3)如果对应的索引处没有元素,直接存放,如果有对象在,那么比较它们的equals方法比较内容
    • 如果内容一样,后一个value会将前一个value的值覆盖,如果不一样,
    • 在1.7的时候,后加的放在前面,形成一个链表,形成了碰撞,在某些情况下如果链表无限下去,那么效率极低,碰撞是避免不了的
    • 加载因子:0.75,数组扩容,达到总容量的75%,就进行扩容,但是无法避免碰撞的情况发生
    • 在1.8之后,在数组+链表+红黑树来实现hashmap,当碰撞的元素个数大于8时 & 总容量大于64,会有红黑树的引入
    • 除了添加之后,效率都比链表高,1.8之后链表新进元素加到末尾 ConcurrentHashMap (锁分段机制),concurrentLevel,jdk1.8采用CAS算法(无锁算法,不再使用锁分段),数组+链表中也引入了红黑树的使用

    哈希冲突: 存储地址发生冲突
    当我们对某个元素进行哈希运算,得到一个存储地址,然后进行插入的时发现已经被其他元素占用了

    3、死锁

    指两个或两个以上的线程在执行的过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们都将无法推进下去。此时系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程成为死锁进程。

    举例来说:有两个进程A和B,A持有资源a等待b资源,B持有资源b等待a资源,两个进程都在等待另一个资源的同时不释放资源,就形成死锁。

    产生死锁的原因,主要包括:

    • 系统资源不足;
    • 程序执行的顺序有问题;
    • 资源分配不当等。

    形成死锁的四个必要条件:

    (1) 互斥条件:一个资源每次只能被一个进程使用。

    (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

    (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

    (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    如何处理死锁?

    • 预防死锁:破坏四个必要条件中的一个或多个来预防死锁
    • 避免死锁:在资源动态分配的过程中,用某种方式防止系统进入不安全的状态。
    • 检测死锁:运行时产生死锁,及时发现思索,将程序解脱出来。
    • 解除死锁:发生死锁后,撤销进程,回收资源,分配给正在阻塞状态的进程。

    预防死锁的办法:

    • 破坏请求和保持条件:
    • 1.一次性的申请所有资源。之后不在申请资源,如果不满足资源条件则得不到资源分配。
      2.只获得初期资源运行,之后将运行完的资源释放,请求新的资源。
    • 破坏不可抢占条件:


    当一个进程获得某种不可抢占资源,提出新的资源申请,若不能满足,则释放所有资源,以后需要,再次重新申请。

    • 破坏循环等待条件:

    • 对资源进行排号,按照序号递增的顺序请求资源。
      若进程获得序号高的资源想要获取序号低的资源,就需要先释放序号高的资源。

    死锁的解除办法:

    1、抢占资源。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。

    2、终止(撤销)进程:将一个或多个死锁进程终止(撤销),直至打破循环环路,使系统从死锁状态解脱。

    4、get和post的区别


    两种 HTTP 请求方法:GET 和 POST
    在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

    GET - 从指定的资源请求数据。 POST - 向指定的资源提交要被处理的数据

    更多Java知识私信666获取

    5、HTTPS

     

    • HTTPS:是以安全为目标的 HTTP 通道,是 HTTP 的安全版。
    • HTTPS 的安全基础是 SSL。
    • SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。
    • SSL 协议可分为两层:
    • SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
    • SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,
    • 用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、=交换加密密钥等。
    • 二、HTTP 与 HTTPS 的区别

       

    • 1、HTTPS 协议需要到== CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用==。(以前的网易官网是http,而网易邮箱是 https 。)
    • 2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
    • 3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    • 4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。
    • (无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

     SSL 的功能实现主要依赖于三类基本算法:
    散列函数 Hash、对称加密和非对称加密,
    其利用非对称加密实现身份认证和密钥协商,
    对称加密算法采用协商的密钥对数据加密,
    基于散列函数验证信息的完整性

     

    对称加密

    常见的有 AES-CBC、DES、3DES、AES-GCM 等,信息的加密和解密用相同的密钥,掌握密钥才能获取信息。在对称加密中,信息安全的基础是保证密钥的安全。

  • 相关阅读:
    本地缓存Caffeine的缓存过期淘汰策略
    聚类分析的基本概念和方法
    如何提高表达能力?这五个方法要掌握
    快递100使用
    AndroidStudio运行app需要运行两次生效
    基本正则表达式
    CentOS 7:服务器环境搭建
    Ubuntu20安装docker实践纠正版
    Django ORM:最全面的数据库处理指南
    SpringBoot 整合 Minio 实现 文件上传
  • 原文地址:https://blog.csdn.net/Cr1556648487/article/details/126191196