9.27面经

注:以下”答“均为本人在面试期间的完整回答,可能并不是标准答案,仅供参考,望周知!

  • 1、自我介绍,在校经历,成绩排名

  • 2、问项目(此处省略一万字)

  • 3、Java基础

    • 问:final关键字的作用?

    • 答:作用于类上代表可不继承、作用于方法上代表不可重写、作用于字段代表其值(引用类型为地址)不可改变

    • 问:final对于引用类型字段与值类型字段有什么不同?

    • 答:对于值类型字段,其对应值不能改变(如int);对于引用类型字段,其指向地址不能改变,但是地址中的值还是可以改变

    • 问:引用类型是什么?

    • 答:Java中基本都是对象来进行操作,其对应顶级父类都是Object的类型为引用类型

    • 问:如果一个Map使用final修饰,它会怎么样呢?

    • 答:(因为没使用过,因此思考了一会)Map中的存放的是一个个Entry对象...(深思中)...我感觉应该是阻止扩容吧,因为Map的扩容操作是新建一个哈希桶,然后将原引用指向新的哈希桶,加上final关键字代表引用类型地址不能发生改变,因此是防止Map进行扩容

    • 问:你在项目中有使用过嘛?这样有什么好处?

    • 答:我没有使用过,但是我一般都会为它指定初始容量,(幸好看过阿里开发手册,才能吹下半段)因为阿里开发手册上有谈到过,java.util包下容器(如ArrayList、HashMap)都应该尽量指定初始容量,防止其扩容所带来的性能损耗,因此加上final也是为了防止扩容造成性能损耗

    • 问:确实这样的!

    • 问:你能告诉我抽象类与接口的区别嘛?

    • 答:抽象类是使用abstract关键字进行修饰的类,可以被继承;定义为抽象类其中可以没有抽象方法,但是含有抽象方法的类一定要定义为抽象类;抽象类可以有构造方法,其目的是子类进行初始化时完成某些特定的操作;要继承抽象类,要么实现其中所有抽象方法,要么自身定义为抽象类;abstract关键字不能和static共用,因为static代表静态,其代表在编译期间已经确定,而abstract代表动态,其代表在运行期间才能确定,因此二者不能一起使用;接口是interface,使用implements关机找你实现接口,不能有构造方法(还没说完被打断,是我太啰嗦了???)

    • 问:接口可以定义不用重写的方法嘛?

    • 答:接口中成员的修饰符默认为public static final,成员方法的修饰符默认为public abstract,在JDK8中引入了默认方法和静态方法,即分别使用default关键字和static关键字进行标识,由于引入了这两种方法,导致可能造成很多公共代码无法重用,因此JDK9引入私有方法是必然的结果

    • 问:JDK现在最新版本?

    • 答:前不久发行了JDK17

    • 问:JDK17是LTS(Long Term Support)嘛?

    • 答:JDK8和11是LTS的,按照Oracle官方曾发布的新闻“从JDK11之后,每半年将会更新一个新版本,每三年才会发布一个长期支持版本”,因此推算得相差6个版本,半年一个版本的话正好是三年,因此JDK17是LTS的

    • 问:你自定义过注解嘛?如何实现的?

    • 答:自己手动写一个Annotation,然后绑定一个校验器类,校验器类实现指定的Validator接口;比如我在项目中定义了一个@LongNotNull,我也只是测试一下,其中校验方法中使用Objects.isNull(value)进行非空校验

    • 问:你项目中自己定义接口的作用?

    • 答:(懵)接口的作用不是用于扩展嘛

    • 问:你可能对我的问题有误解哈,没关系,我的意思是比如你自定义接口是为了实现什么样的功能?

    • 答:(超级加倍:懵 * double)项目中一般就Service定义为接口,然后Impl实现,,,呵呵,一般不就这样嘛。。。

    • 问:你可能还没理解我的意思哈,我举个例子,比如Serializable接口的作用?

    • 答:Serializable是一个标记接口,里面什么都没有,但是需要序列化的类必须实现它才能被Java从内存中进行序列化

    • 问:对,为什么需要序列化呢?

    • 答:一般就是为了返回给前端Json数据,然后的话还可以转换为流进行传输,或者保存到磁盘

    • 问:我的意思就是这样,Serializable接口的作用就是为了序列化

    • 答:好的,大概明白了。。。

  • 4、联系项目和SpringCloud

    • 问:看你项目中用到了SpringCloud是吧,你能介绍一下SpringCloud有哪些组件嘛?

    • 答:服务注册中心之前有Eureka、Zookeeper、Consul,现在国内用的比较多就是Nacos,Nacos还可以作为配置中心,只是我的项目中暂时还没有将它作为配置中心,后续将会引入;网关服务Gateway,远程调用OpenFeign;谈到Nacos,就想起SpringCloud Alibaba使用最多的三大组件:Nacos、Sentinel服务限流熔断、Seata分布式事务,大概就这样了

    • 问:哎,你的项目中为什么有Gateway,还引入了Nginx,两者的功能不是差不多嘛?为何多此一举?

    • 答:我曾经也思考过这个问题,单独使用Nginx或Gateway都能实现负载均衡效果,但是我后来曾经看到过,一般使用Nginx+Gateway才能实现高可用集群,我的理解是请求静态资源文件可以直接从Nginx中获取,因为Nginx特点之一就是动静分离,然后Gateway结合Sentinel可以实现服务限流

    • (自我感觉唯一不完美回答就是这里Gateway的相关作用)

    • 问:原来这样,那你的Gateway在里面实现什么效果呢?

    • 答:我目前使用它进行路径转发和路径重写

    • 问:路径重写?你如何做到的呢?

    • 答:我目前只是暂时在配置文件中进行编写,参考SpringCloud Gateway官方文档中提到的predicate、url、filter等

    • 问:只是在配置文件啊,为什么不写配置类呢?其中不是提供了很多现成的类和接口供使用嘛?

    • 答:因为初步使用,目前项目只是做到将框架搭起来,能够正常运行,后期将会进行一定的整合优化

    • 问:那你路径重写有什么作用呢?

    • 答:这样可以保证内部接口的安全,比如登录请求,外界只发送一个http://xxx.myapp.com/login,而我项目中实际接口为http://localhost:8080/backstage/user/login,我通过路径改写将外界请求进行路径重写再发送给项目中对应服务,外界将不会知道实际接口url,可以有效保证接口安全性。

    • 问:了解过Filter嘛?

    • 答:SpringSecurity是由一系列的Filter链组成的,项目中实现过认证过滤器、授权过滤器、无效访问过滤器、以及登录用户名和密码校验过滤器等

  • 5、我这边差不多,你还有什么要问我的?

    • 对我的表现或者评价——感觉掌握的挺到位的,但是加强学习还是必须要的。。

    • 后续流程——你可以去问问HR具体流程

  • 6、结束——面试官再见,好的再见!!!

#Java开发##面经#
全部评论

相关推荐

3 16 评论
分享
牛客网
牛客企业服务