Java 校招面试知识综合准备

自我简介

自我介绍需要精心准备,重点突出的所获得的奖项,经历的项目,与别人不一样的经历,突出自己热爱学习。

网上面经积累

shopee|一面凉经|2021|

hr面准备

Java基础

  • Java 既是解释执行,也是编译执行。

    • .java 文件经过编译后生成 .class 文件,.class 文件是不能直接在计算机上运行的,需要运行在计算机的 JVM 上,可以看作是由 JVM 进行解释执行。
    • 现在的JVM为了效率,都有一些JIT(Just-In-Time 编译器)优化。它又会把 .class 的二进制代码编译为本地的代码,计算机可以直接运行,从这个角度出发 Java 是编译执行。
    • 编译型语言,编译后生成二进制文件,直接在计算机上运行,执行速度快,缺点是不能跨平台,Windows 上编译生成的二进制在 Mac OS 上就不能运行了,因为操作系统不同。解释型语言,编译以后不能直接在计算机上运行,必须依赖一个中间平台,来进行解释执行,相当于是一个翻译官,缺点就是执行速度慢。对于 Java 语言而言,JVM 就是这个中间平台,只要在各个平台上都安装了对应的 JVM,只需要编译生成一份 .class 文件,就可以在各个平台的 JVM s上进行运行,这就能实现在各个平台上跨平台。
  • StringBuilder 不安全,StringBuffer 安全

  • 空构造方法

    方便字类初始化父类。在没有显示使用super关键字指定需要调用父类哪个构造方式,默认调用父类的空构造方法,如果父类没有空构造方法,只有有参构造方法,将导致父类无法初始化,编译时报错。

  • 系统性能分析中,CPU、内存和 IO 是主要关注项

  • 基准测试

    使用 JMH 框架,使用 maven 导入即可。

    在 server 模式下,JIT(Just-In-Time 编译器) 会在一段代码执行 10000 次后,将其编译为本地代码,client 模式则是 1500 次以后。我们需要排除代码执行初期的噪音,保证真正采样到的统计数据符合其稳定运行状态。

    JIT(Just-In-Time)编译器:也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。

  • IO

    BIO(Blocking IO) 和 NIO(No-Blocking IO) 一个是阻塞,一个是非阻塞,阻塞与非阻塞都是针对于线程而言。阻塞是说线程会阻塞到那里,等到数据到来,等到数据到来之前,线程一直阻塞在那里,什么也不能做。非阻塞是说线程不用等着数据到来,会有相应的机制来通知线程,当数据准备好,线程再来进行工作,等到数据到来之前,线程可以去忙自己的事情。

    NIO:由于NIO 实际上是同步非阻塞 IO,是一个线程在同步的进行事件处理,当一组事channel处理完毕以后,去检查有没有可以处理的channel。这也就是同步+非阻塞。同步,指每个准备好的channel处理是依次进行的,非阻塞,是指线程不会傻傻的等待读。只有当channel准备好后,才会进行。那么就会有这样一个问题,当每个channel所进行的都是耗时操作时,由于是同步操作,就会积压很多channel任务。那么就需要对 NIO 进行类似负载均衡的操作,如用线程池去进行管理读写,将channel分给其他的线程去执行,这样既充分利用了每一个线程,又不至于都堆积在一个线程中,等待执行。NiO

  • ConcurrentHashMap

    Java 1.7

    java1.7

    Java 1.8 之后,取消了 Segment,同步粒度更小

    java1.8

并发编程

  • 线程究竟是什么

    从操作系统的角度,可以简单认为,线程是系统调度的最小单元,一个进程可以包含多个线程,作为任务的真正运作者,有自己的栈(Stack)、寄存器(Register)、本地存储(Thread Local)等,但是会和进程内其他线程共享文件描述符、虚拟地址空间等。在具体实现中,线程还分为内核线程、用户线程,Java 的线程实现其实是与虚拟机相关的。对于我们最熟悉的 Sun/Oracle JDK,其线程也经历了一个演进过程,基本上在 Java 1.2 之后,JDK 已经抛弃了所谓的Green Thread,也就是用户调度的线程,现在的模型是一对一映射到操作系统内核线程。

    守护线程(Daemon Thread),有的时候应用中需要一个长期驻留的服务程序,但是不希望其影响应用退出,就可以将其设置为守护线程,如果 JVM 发现只有守护线程存在时,将结束进程。

    Thread daemonThread = new Thread();
    daemonThread.setDaemon(true);
    daemonThread.start();
    
  • 一个线程两次调用 start() 方法会出现什么情况?

    答:会出现 IllegalThreadStateException,这是一种运行时异常。

    Java 5 以后,线程的状态被定义在 java.lang.Thread.State 。分别是:新建(NEW)、就绪(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、计时等待(TIMED_WAIT)。

  • ThreadLocal 内存泄漏。

    每个线程中都有一个ThreadLocalMap map 的key为一个ThreadLocal的引用,该引用为WeakReference。Value为需要往该map中存的值。

    A a = new A(); // 当 a = null 的时候 ,a 对象会被GC回收

    B b = new B(); // 当 b = null 的时候 ,b 对象会被GC回收

    考虑这样的情况:

    C c = new C(b); // 当c = null 的时候

    b = null; //当b = null 的时候,由于 c 对象还持有 b 对象的引用,而且 c 是强引用,所以b对象不会被 gc 回收。这种情况下只有当c=null的时候才会确保b对象被回收。如果b对象是WeakReference,那么b=null的时候就会被回收 WeakReference w = new WeakReference(b);

JVM

  • 监控 GC

    使用 jstat 查看 GC 的情况。

  • 监控 堆(heap)

    jmap 命令生成的是堆转储文件,是某个时间点、Java 进程的内存快照

    使用 jmap -heap pid 查看相关进程的堆的使用情况

    使用 jmap -histo pid 查看对应Java进程的类的的实例的信息

  • 监控线程栈,死锁

    使用 jstack

  • 使用 JMC ,JConsole 等监控工具

    不建议在生产环境下使用 JMC,使用 JFR(Java Flight Recorder)生成 .jfr 文件,然后在开发环境使用 jmc 来进行分析。

Spring

  • AOP

    • Aspect 切面,逻辑性概念

    • Join Point, Aspect 可以切入的点,以方法为单位

    • Advice,定义了切面中能够采取的动作。如果你去看 Spring 源码,就会发现

    • Pointcut,它负责具体定义 Aspect 被应用在哪些 Join Point,可以通过指定具体的类名和方法名来实现,或者也可以使用正则表达式来定义条件。指定在在哪些类下的哪些方法下执行 aop 操作

       <aop:pointcut id="p1" expression="execution(* io.simon.aop.InterfaceSchool.*(..))"/>
      

    定义了切面(Pointcut),标识这里是一个切面,然后需要指定这个切面往哪里切,要切入哪个方法(Join Point)。切面定义好以后,需要指定具体该怎么切(advice),切在某个方法的前面(before),后面(after),还是把这个方法包(around)起来,然后还要说明,切入时需要执行什么动作,即执行什么方法。

    为什么需要AOP?

    答:切面编程落实到软件工程其实是为了更好地模块化,而不仅仅是为了减少重复代码。通过 AOP 等机制,我们可以把横跨多个不同模块的代码抽离出来,让模块本身变得更加内聚,进而业务开发者可以更加专注于业务逻辑本身。【高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合); 低耦合:减少类内部,一个成员方法调用另一个成员方法。】

  • Bean 的生命周期

    • 单例的bean始终 存在与application context中, 只有当 application 终结的时候,才会销毁
    • 和其他scope相比,Spring并没有管理prototype实例完整的生命周期,在实例化,配置,组装对象交给应用后,spring不再管理.只要bean本身不持有对另一个资源(如数据库连接或会话对象)的引用,只要删除了对该对象的所有引用或对象超出范围,就会立即收集垃圾
    • Request: 每次客户端请求都会创建一个新的bean实例,一旦这个请求结束,实例就会离开scope,被垃圾回收
    • Session: 如果用户结束了他的会话,那么这个bean实例会被GC

    Bean 的生命周期是完全被容器所管理的,从属性设置到各种依赖关系,都是容器负责注入,并进行各个阶段其他事宜的处理,Spring 容器为应用开发者定义了清晰的生命周期沟通界面。

安全

  • 注入攻击

    SQL 注入,操作系统命令注入,xml 注入(xml 中可以包含动态内容)

  • 程序瑕疵造成的威胁

  • 利用 Hash 碰撞发起拒绝服务攻击。攻击者可以事先构造大量相同哈希值的数据,然后以 JSON 数据的形式发送给服务器端,服务器端在将其构建成为 Java 对象过程中,通常以 Hastable 或 HashMap 等形式存储,哈希碰撞将导致哈希表发生严重退化。

  • DoS(Denial of Service)拒绝服务攻击(消耗服务器资源,使其无法为正常用户提供服务)

    DoS 是一种常见的网络攻击,有人也称其为 洪水攻击。最常见的表现是,利用大量机器发送请求,将目标网站的带宽或者其他资源耗尽,导致其无法响应正常用户的请求。与哈希碰撞攻击类似,对方可以轻易消耗系统有限的 CPU 和线程资源。从这个角度思考,类似加密、解密、图形处理等计算密集型任务,都要防范被恶意滥用,以免攻击者通过直接调用或者间接触发方式,消耗系统资源。

    DDoS(Distributed Denial of Service)分布式拒绝服务攻击,DoS 攻击的一种。将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。

  • HTTPS协议

    HTTPS = HTTP + SSL(Secure Sockets Layer)) / TLS(Transport Layer Security,TLS实际就是SSL, TLS1.0 实际上就是 SSLv3.1,目前应用的最广泛的 TLS 是 1.2)

    在 OSI 模型中处于第 5 层(会话层)

    image1

HTTPS完整流程

完整的HTTPS协议请求流程

Linux

  • namespace

  • Cgroup

    Cgroups全称Control Groups,是Linux内核提供的物理资源隔离机制,通过这种机制,可以实现对Linux进程或者进程组的资源限制、隔离和统计功能。比如可以通过cgroup限制特定进程的资源使用,比如使用特定数目的cpu核数和特定大小的内存,如果资源超限的情况下,会被暂停或者杀掉。

    Cgroup是于2.6内核由Google公司主导引入的,它是Linux内核实现资源虚拟化的技术基石,LXC(Linux Containers)和docker容器所用到的资源隔离技术,正是Cgroup。

算法

  • 10亿int(约4G空间)整型数,以及一台可用内存为 1GB 的机器,时间复杂度要求O(n),统计只出现一次的数?

    答:1、使用位图,一个 bit 标识一个整数。2、hash桶,3、分治,然后排序。使用桶排序,10亿 int 整形约为 4G,将其分为 m 个 桶,每个桶存储 K = 10 亿 / m < 的数据。每个桶内用快排,复杂度为:O(K*logK)。m 个桶的时间复杂度为O(m * 10亿 / m * log 10 亿 / m)。当桶的数量比较大时,log n / m 越小,整体的时间复杂度越接近于 O (n)

MySQL数据库

  • 索引

    • Hash 索引,不适合范围查询

    • B + 索引

      在 字段k 上建立索引

    mysql> create table T(
    id int primary key, 
    k int not null, 
    name varchar(16),
    index (k))engine=InnoDB;
    
  • 一致性hash。数据库水平迁移,使用一致性hash,hash空间为一个环形,这样每次增加或者减少一台机器时,都只有两台机器的数据受影响。

  • 读写分离与高可用

    读写分离是为了加快访问速度,实现更高的并发访问效率,同时还能实现负载均衡,使得不同的读请求能按照策略均匀地发到不同的服务器上。MySQL主从同步的内容就是二进制日志(Binlog),它虽然叫二进制日志,实际上存储的是一个又一个事件(Event),这些事件分别对应着数据库的更新操作,比如 INSERT、UPDATE、DELETE。

    主从结构就是为了高可用,高可用是为了减少数据库宕机时间,当 master 节点不可用了,系统选举出可用的节点作为master节点。

    主从同步,如果目标仅仅是数据库的高并发,那么可以先从 SQL 优化,索引以及 Redis 缓存数据库这些方面来考虑优化,然后再考虑是否采用主从架构的方式。

  • 组复制技术,简称 MGR(MySQL Group Replication),采用Paxo分布式共识算法(分布式一致算法,目的是使得分布式场景下多个节点达成一致)来进行同步。

  • 水平分库分表和垂直分库分表

    • 垂直拆分(拆库,拆表),将一个库中的数据拆分为两个或者多个库,表的结构会发生变化,对业务影响大,类似于业务拆分做微服务。原来一个复杂的SQL也变为几个简单的SQL。

    • 水平拆分,同样的一句查询,可能会路由到不同的数据库上。将数据分片,进行分库分表操作,不改变表的结构,仅改变数据库的容量,降低单个节点的数据量。比如:10 亿条记录的订单单库单表(orderDB 库 t_order 表)。我们按照用户 id 除以32 取模,把单库拆分成 32 个库orderDB_00…31;再按订单 id 除以 32 取模,每个库里再拆分成 32 个表t_order_00…31。这样一共是 1024 个子表,单个表的数据量就只是 10 万条了。

      水平拆分时,分库还是分表,如何选择?【一个数据库实例可以看作一个文件。】一般情况下,如果数据本身的读写压力较大,磁盘 IO 已经成为瓶颈,那么分库比分表要好。分库将数据分散到不同的数据库实例,使用不同的磁盘,从而可以并行提升整个集群的并行数据处理能力。相反的情况下,可以尽量多考虑分表,降低单表的数据量,从而减少单表操作的时间,同时也能在单个数据库上使用并行操作多个表来增加处理能力。

  • 索引

    在建表的时候创建索引

    create table T(
    	id int primary key, 
    	k int not null, 
    	name varchar(16),
    	index index_k(k) --在k字段上建立索引,索引名为k。
    )engine=InnoDB;
    

    主键索引,叶子节点存储的是整行数据,尽量用自增主键作

    非主键索引,叶子节点存储主键ID

    重建索引可以达到省空间的目的,因为索引也是需要占用空间的

    • 对于非主键,可以这么写:

      alter table T drop index k;
      alter table T add index(k);
      
    • 对于主键,可以这么写,需要注意的是,重建主键索引并不合理,不论是删除主键还是创建主键,都会将整个表重建。

      alter table T drop primary key;
      alter table T add primary key(id);
      

    索引的使用:1、覆盖索引,需要在哪个字段上进行查询就在哪个字段上进行查询。2、最左匹配原则,建立联合索引 KEY name_age (name,age),那么在a这个列上进行查询则能用到索引,在b这个列上进行查询无法使用索引。对于MySQL而言,比如a,b建立索引时候,是先以a建立的索引,此时b是无序的,在以a建立之后的a的子树上再建立b的索引,所以对于整颗b+树来说,a是一定有序的,b是不一定有序的。3、索引下推, MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

    创建唯一性索引

    CREATE TABLE `t1` ( 
        `id` int(11) NOT NULL, 
        `a` int(11) DEFAULT NULL, 
        `b` int(11) DEFAULT NULL, 
        PRIMARY KEY (`id`), 
        UNIQUE KEY `a` (`a`)
    ) ENGINE=InnoDB;
    
  • 分布式事务

    强一致 使用XA(分布式事务协议),有RA(Transaction Manager)、RM(Resource Manger)主流开源XA分布式事务解决方案:Atomikos、narayana、seata(阿里巴巴)

    BASE柔性事务(感觉和UDP很像,可靠性交给应用层来进行处理),1、基本可用(分布式事务参与方不一定同时在线),2、软状态(系统状态更新有一定的延迟),3、最终一致性。BASE柔性事务TCC(try- confirm -cancel)。【TCC 模式即将每个服务业务操作分为两个阶段,第一个阶段检查并预留相关资源,第二阶段根据所有服务业务的 Try 状态来操作,如果都成功,则进行 Confirm 操作,如果任意一个 Try 发生错误,则全部 Cancel】BASE柔性事务,对于ACID,执行过程中A原子性正常情况下可以保证,一致性和隔离性在某个时间点不能保证,持久性和本地事务一样,只要commit就能保证。

    seata中有RA,RM,和TC (事务协调器)。TC 是一个独立部署的服务,TM 和 RM 以 jar 包的方式同业务应用一同部署,它们同 TC 建立长连接,在整个事务生命周期内,保持远程通信。 TM 是全局事务的发起方,负责全局事务的开启,提交和回滚。 RM 是全局事务的参与者,负责分支事务的执行结果上报,并且通过 TC 的协调进行分支事务的提交和回滚。

计算机网络

  • 握手报文中的ISN的作用,确认起始序号,序号不可以猜出来,抵御重放攻击
  • 常见的端口及对应的协议。端口有65536个(0~65535)。
    HTTP 协议对应80端口。FTP协议对应21端口。HTTPS/SSL 对应443端口。SSH远程连接对应22端口。110和125端口用于发邮件

计算机组成原理

  • 文件系统:文件系统将硬盘空间以块为单位进行划分,每个文件占据若干个块,然后再通过一个文件控制块 FCB 记录每个文件占据的硬盘数据块。RAID,磁盘冗余阵列,利用文件系统将数据写入硬盘中不同数据块的特性,将多块硬盘上的空闲空间看做一个整体,提升磁盘访问速度。Hadoop 分布式文件系统 HDFS,单服务器我们可以通过 RAID 来实现,多服务器则可以将这些服务器组成一个文件系统集群,共同对外提供文件服务

微服务

  • Paxos 算法。分布式共识算法。共识就是 各个分布式节点针对于某个取值达成一致

    一旦系统中超过半数的节点完成了状态的转换,就可以认为数据的变化已经被正确地存储在了系统当中。这样就可以容忍少数(通常是不超过半数)的节点失联,使得增加机器数量可以用来提升系统整体的可用性。在分布式中,这种思想被叫做 Quorum 机制。

    Paxos 算法将分布式系统中的节点分为提案节点决策节点记录节点三类

  • 在分布式场景下,我们要让节点的数量为奇数个,这样在进行决策的时候,才能尽量保证做出决策。

  • RPC,远程过程调用(Remote Procedure Call)

Redis

  • Redis的应用场景

  • 缓存雪崩问题

Nginx

  • Nginx的作用以及应用场景
    在这里插入图片描述

  • Nginx的优点
    Apache 服务器是一个连接一个进程,对多核CPU的支持并不友好,在单个CPU的摩尔定律已经失效的情况下,目前都是朝着多核CPU的方向发展,但是Apache天生就不是为多核CPU的场景诞生的,在多核CPU的服务器上,Apache服务器的性能远不如Nginx服务器
    在这里插入图片描述

综合问题

  • 给定含有40亿个不重复的位于[0, 2^32 - 1]区间内的整数的集合,如何快速判定某个数是否在该集合内?

    答:数据量大,用位图bitmap,一位代表一个数,节省空间。具体内容参考该链接,https://www.jianshu.com/p/b09bb3e7652e

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值