当前位置:   article > 正文

2023美团春招java面试流程,技术面题解析_美团 春招 java 面试

美团 春招 java 面试

第一部分-自我介绍

第二部分-Java的基础知识

1、接口和抽象类的区别

抽象类(abstract)

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

接口(interface)

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

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

2、Java1.8之后的新特性

Lambda表达式

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

  1. package com.kuang.lambda;
  2. //lambda表达式
  3. public class TestLambda1 {
  4. //3、静态内部类
  5. static class Like2 implements ILike{
  6. @Override
  7. public void lambda() {
  8. System.out.println("I like lambda2");
  9. }
  10. }
  11. public static void main(String[] args) {
  12. ILike like = new Like();
  13. like.lambda();
  14. like = new Like2();
  15. like.lambda();
  16. //4、局部内部类
  17. class Like3 implements ILike{
  18. @Override
  19. public void lambda() {
  20. System.out.println("I like lambda3");
  21. }
  22. }
  23. like = new Like3();
  24. like.lambda();
  25. //5.匿名内部类,没有类的名称,必须借助接口或者父类
  26. like = new ILike() {
  27. @Override
  28. public void lambda() {
  29. System.out.println("I like lambda4");
  30. }
  31. };
  32. like.lambda();
  33. //6.用lambda简化,接口和方法都不要了
  34. like = ()->{
  35. System.out.println("I like lambda5");
  36. };
  37. like.lambda();
  38. }
  39. }
  40. //1、定义一个函数式接口
  41. //任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
  42. //接口里默认是抽象方法
  43. interface ILike{
  44. void lambda();
  45. }
  46. //2、实现类
  47. class Like implements ILike{
  48. @Override
  49. public void lambda() {
  50. System.out.println("I like lambda");
  51. }
  52. }

多个参数

  1. package com.kuang.lambda;
  2. public class TestLambda2 {
  3. public static void main(String[] args) {
  4. ILove love = new Love();
  5. love.love("bl");
  6. love = new ILove() {
  7. @Override
  8. public void love(String a) {
  9. System.out.println("I love you-->"+a);
  10. }
  11. };
  12. love.love("bdf");
  13. //lambda表达式
  14. love = (String a)->{
  15. System.out.println("I love you-->"+a);
  16. };
  17. love.love("yiyeri");
  18. //简化1.去掉参数类型
  19. love = (a)->{
  20. System.out.println("I love you-->"+a);
  21. };
  22. love.love("520");
  23. //简化2.简化括号
  24. love = a ->{
  25. System.out.println("I love you-->"+a);
  26. };
  27. love.love("521");
  28. //简化3.简化花括号
  29. love = a ->
  30. System.out.println("I love you-->"+a);
  31. love.love("aaaaaaa");
  32. //总结:
  33. /*
  34. 1.lambda表达式只能有一行代码的情况下才能简化成为一行,如果有多行,那么就用代码块包裹
  35. 2.前提是接口为函数式接口
  36. 3.多个参数也可以去掉参数类型,要去掉就都去掉了,必须加上括号
  37. */
  38. }
  39. }
  40. interface ILove{
  41. void love(String a);
  42. }
  43. class Love implements ILove{
  44. @Override
  45. public void love(String a) {
  46. System.out.println("I love you-->"+a);
  47. }
  48. }

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 - 向指定的资源提交要被处理的数据

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 等,信息的加密和解密用相同的密钥,掌握密钥才能获取信息。在对称加密中,信息安全的基础是保证密钥的安全。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/522949
推荐阅读
相关标签
  

闽ICP备14008679号