百度2020春招Java开发实习生笔试_基础部分总结

1.磁盘访问-电梯算法SCAN

  • 电梯总是朝向一个方向运行,直到该方向上没有请求为止,然后再改变运行的方向;
  • 电梯算法解决了最短寻道优先SSTF算法中进程“饥饿”的现象,由于若一直有新的进程请求到达,且新进程的磁道请求距离当前进程较近,则导致老进程长期处于等待的“饥饿”状态;

2.SQL语句-limit用法

  • limit用来限制返回的行数,可以有两个参数,第一个参数为起始行,从0开始,第二个参数为返回的总行数;

  • 选取考试中前11~20名的同学;

    SELECT *
    FROM t_class_grade
    GROUP BY grade
    LIMIT 1010;
    

3.JVM-垃圾回收策略中垃圾收集器的作用范围:

上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。

新生代:

  • Serial收集器 :最基本,最悠久,单线程,工作时暂停其他所有的工作进程,Client模式默认GC-Collector;

  • ParNew收集器:Serial收集器的多线程版本,Server模式下的虚拟机中首选,能与CMS收集器配合工作;

  • Parallel Scavenge(并行回收)收集器:控制吞吐量,在ParNew之上实现了自适应调节策略;

老年代:

  • Serial Old 收集器:Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记整理算法。这个收集器的主要意义也是在于给Client模式下的虚拟机使用。
  • Parallel Old 收集器:Parallel Old 是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。
  • CMS(Concurrent Mark Sweep)收集器:收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务器的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。优点:并发收集,低停顿

前沿成果(新生代&&老年代):

  • G1收集器

    优势:(1)并行与并发(2)分代收集(3)空间整理 (标记整理算法,复制算法)(4)可预测的停顿;

    使用G1收集器时,Java堆的内存布局是整个规划为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region的集合。

    G1收集器之所以能建立可预测的停顿时间模型,是因为它可以有计划地避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获取的空间大小以及回收所需要的时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也就是Garbage-First名称的又来)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽量可能高的收集效率;


4.在Java中,线程请求过多时,会触发拒绝策略,各种拒绝策略的定义:

​ 线程池中,有三个重要的参数,决定影响了拒绝策略:corePoolSize - 核心线程数,也即最小的线程数。workQueue - 阻塞队列 。 maximumPoolSize - 最大线程数

当提交任务数大于 corePoolSize 的时候,会优先将任务放到 workQueue 阻塞队列中。当阻塞队列饱和后,会扩充线程池中线程数,直到达到 maximumPoolSize 最大线程数配置。此时,再多余的任务,则会触发线程池的拒绝策略了。

总结,当提交的任务数大于(workQueue.size() + maximumPoolSize ),就会触发线程池的拒绝策略

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
  • ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务
  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

5.分布式锁的实现方式:

  • 数据库悲观锁,数据库乐观锁

在这里插入图片描述

  • redis的setnx()、expire()方法,用于分布式锁

  • 基于zookeeper实现分布式锁


6.AOP的定义:

面向切面编程AOP是通过另一种程序结构的思维方式,对面向对象编程OOP方式进行扩展和补充。在OOP中的核心模块是,而在AOP中的核心模块是切面Aspects。

切面Aspects使得程序的关注点(如事务管理)的模块化跨越多个类型和对象。(这种关注在AOP文献中通常被称为“跨领域”关注。)

  • Pointcut,定义当前的横切逻辑准备织入那些连接点,就是连接点的集合。
  • Advice:通知,就字面意思,但是有2个部分组成,通知内容和通知到哪里去。
  • JoinPoint连接点:程序执行过程中的一个点,是指目标对象上定义的各个方法就是一个连接点,例如:方法执行或异常处理。
  • Aspect方面:涉及多个类别的关注点的模块化,是一个用来封装切点和通知的组件,包括连接点,切点,通知的一个载体。(如果用AspectJ它就是一个类,如果用springXML的时候它就是一个标签)并且交给spring管理。事务管理是企业Java应用程序中横切关注的一个很好的例子。

7.对字符串"Hello world"进行哈弗曼编码后,最少占多少bit空间?

  • 1.对"Hello world"按字符出现的频率进行排序:
字符lo" "hewrd
频率32111111
  • 每次从中选取出现频率最少的两个字符合并:

在这里插入图片描述

  • 对其进行哈弗曼编码:
字符lo" "hewrd
频率32111111
编码01111011000010001100000001
  • 计算使用哈弗曼编码上述字符串占用Bit总数=3x2 + 2x2 +(1 + 1)x3 + (1+1+1+1) x4 = 32bit

8.网络数据传输中的粘包问题:

TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片的,其间是没有分界线的。TCP保证的是数据流正确传输的机制,不管应用端怎么去用这个数据。

这里的“粘包”其实是应用程序中没有处理好数据包分割,两个应用层的数据包粘在一块了。但一般通讯程序开发是需要定义一个个相互独立的数据包的,比如用于登陆的数据包,用于注销的数据包。由于TCP"流"的特性以及网络状况,在进行数据传输时会出现以下几种情况。
假设我们连续调用两次send分别发送两段数据data1和data2,在接收端有以下几种接收情况(当然不止这几种情况,这里只列出了有代表性的情况)。

  • A.先接收到data1,然后接收到data2.
  • B.先接收到data1的部分数据,然后接收到data1余下的部分以及data2的全部.
  • C.先接收到了data1的全部数据和data2的部分数据,然后接收到了data2的余下的数据.
  • D.一次性接收到了data1和data2的全部数据.

对于A这种情况正是我们需要的,不再做讨论;

对于B,C,D的情况就是大家经常说的"粘包",就需要我们把接收到的数据进行拆包,拆成一个个独立的数据包。为了拆包就必须在发送端进行封包。

另:对于UDP来说就不存在拆包的问题,因为UDP是个"数据包"协议,也就是两段数据间是有界限的,在接收端要么接收不到数据要么就是接收一个完整的一段数据,不会少接收也不会多接收。

BCD这几种情况出现的原因:发送端发送不及时,或者接收端接受不及时;

解决方法:

​ 1.减缓发送的速率;

​ 2.进行合理的封包和拆包(将消息头分成消息头和消息体,头上包含消息的长度;发送固定长度的消息;增加结尾的定界符);


9.进程中线程所拥有资源的区别:

线程共享的资源包括:

​ 1.进程代码段;

​ 2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯,包括进程堆、全局变量等) ;

​ 3.进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。

线程独占的资源包括:

​ 1.线程ID:每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程。

​ 2.寄存器组的值:由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程 上时,必须将原有的线程的寄存器集合的状态保存,以便将来该线程在被重新切换到时能得以恢复。

​ 3.线程的堆栈:堆栈是保证线程独立运行所必须的。线程函数可以调用函数,而被调用函数中又是可以层层嵌套 的,所以线程必须拥有自己的函数堆栈, 使得函数调用可以正常执行,不受其他线程的影响。

​ 4.错误返回码:由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用后设置了errno值,而 在该线程还没有处理这个错误,另外一个线程就在此时被调度器投入运行,这样错误值就有可能被修改。所以, 不同的线程应该拥有自己的错误返回码变量。

​ 5.线程的信号屏蔽码:由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自己管理。但所有 的线程都 共享同样的信号处理器。

​ 6.线程的优先级:由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参数,这个参数就是线 程的优先级。

​ 7.程序计数器:表示线程程序当前执行程序执行的位置。


10.下列选项中,不可能是快速排序第2趟排序结果的是 ()

​ A. 2,3,5,4,6,7,9;

​ B. 2,7,5,6,4,3,9;

​ C. 3,2,5,4,7,6,9;

​ D. 4,2,3,5,7,6,9;

四个选项都是同样的数组元素,若完全有序,应为2345679
每经过一趟快排,轴点元素都必然就位,也就是说,一趟下来至少有1个元素在其最终位置
所以考察各个选项,看有几个元素就位即可。
A:2、3、6、7、9
B:2、9
C:9
D:5、9
第二趟至少应有2个元素就位,所以C不对。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值