面试问题汇总

2017-03-22  本文已影响126人  金戈大王

2017-3-22 腾讯

1、如何运行时修改Java字节码?
参考Java动态编程初探——Javassist

2、如何实现进程间通信?
参考几种进程间的通信方式

3、如何不加锁实现线程间同步?
这个,难道是指原子操作?还有什么特殊情况?

4、struct数据对齐!
我竟然把数据对齐的事情完全忘了,亏我还写过一篇讲数据对齐的文章。Linux要求2字节数据类型2字节对齐,大于2字节的数据类型4字节对齐。

5、链表反转
有很简单的方法,可是面试的时候一紧张没想起来。只要从左到右把元素依次取出来再插入到头结点就行了。

void reverseLinkedList(Node* head)
{
    Node* firstLeft = head->next;
    head->next = nullptr;
    Node* temp;

    while (firstLeft != nullptr)
    {
        temp = firstLeft;
        firstLeft = firstLeft->next;
        temp->next = head->next;
        head->next = temp;
    }
}

6、比进程、线程更细粒度的执行单元
参考协程,又称微线程

7、寄存器的用途
这道题没答出来又是一大败笔,明明自己写过一篇文章详细解析函数调用栈,结果面试的时候还是记不得了。

esp 栈指针
ebp 帧指针,或称栈顶指针
eax 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
ebx 是"基地址"(base)寄存器, 在内存寻址时存放基地址。
ecx 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
edx 则总是被用来放整数除法产生的余数。
esi/edi 分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.

8、class对象能否使用memset函数?
不能。class对象中除了数据成员,可能包含成员函数指针、虚函数表等附加的数据结构,使用memset函数会破坏这些结构,导致程序崩溃。

2017-3-29 今日头条

1、Linux中,列出当前及子目录下所有扩展名为“.txt”的文件。

ls *.txt

2、Struts2中,如何输出这个变量的值?
<bean:define id="stringBean" value="helloworld" />

<bean:define />的几种用法:

<!-- 一是定义新字符串常量:-->
<bean:define id="foo" value="This is a new String"/>
<bean:define id="bar" value='<%= "Hello, " + user.getName() %>'/>
<!-- 二是复制一个现有的bean给新的bean:-->
<bean:define id="foo" name="bar"/><!-- 将名字为bar的JavaBean赋值给foo-->

<bean:write name="stringBean" scope="request"/>
相当于
<%= request.getAttribute("stringBean") %>

<%= stringBean %>

3、JSP四大作用域

4、PHP中include和require的区别

唯一区别:include可容忍错误,require不容忍错误。建议在大规模框架中使用require,以确保不出错。

2017-4-7 京东

1、如何解决散列冲突?
两种方法:链表法开放地址法
HashMap用的就是链表法,把冲突的所有元素串成一个链表,头指针放在桶里。
开放地址法分为线性探测再散列和二次探测再散列。如果发生冲突,则向后找到一个空的桶放进去。

2、final关键字修饰的成员能否Override?
不能,只有非final的成员方法可以被覆写。另外,成员变量可以子类同名变量隐藏,而不是覆写,因此final修饰的成员变量仍可被子类隐藏。

3、volatile关键字的用途。
多个线程读取volatile变量时可以保证结果总是最新值。由于每个线程都拷贝了一份变量的副本,如果不用volatile修饰,变量更改的值就不会写入主内存。但是volatile并不保证原子操作,因此用这种变量做计数器还是会出错。

2017-4-8 商汤

1、left join、right join、inner join的区别。
left join返回左表中的所有记录和右表中联结字段相等的记录。
right join返回右表中的所有记录和左表中联结字段相等的记录。
inner join只返回左右表中联结字段相等的记录。

2、缓存淘汰算法LRU和LFU
LRU(Least Recently Used)是最近最少使用页面置换算法,间隔时间最长没被使用的页面最先淘汰。
LFU(Least Frequently Used)是最近最不常用页面置换算法,出现次数最少的页面最先淘汰。

2017-4-9 百度

1、查看CPU和内存使用情况
使用top命令。

2、TCP流量控制和拥塞控制
流量控制是说发送方的发送速率不能超出接收方的接收速率,调整滑动窗口。
拥塞控制是说发送方的发送速率不能导致网络出现拥堵,有四种算法:慢开始、拥塞避免、快重传、快恢复。

2017-4-9 阿里

1、Servlet是单例的吗?
是的。为了减少创建Servlet的开销,Servlet容器只为每个Servlet创建一个实例。多个请求到达时,Servlet容器的调度器从线程池中为每个请求分配一个线程。因此,Servlet对象的成员变量存在线程安全问题,建议不使用Servlet成员变量。

如果让Servlet实现SingleThreadModel接口,Servlet容器就会为每个请求单独创建一个对象,这样也可以避免线程安全问题,但开销太大,不建议使用。

2、Java垃圾回收机制
堆内存被分为三部分:年轻代、年老代、永久代。

Java堆内存分布
年轻代又分为Eden、From和To三个部分。
新创建的对象存放在Eden中,第一次GC后,存活的对象进入To,然后把To中的对象转移到From中。之后每次GC,都把Eden中存活的对象放入To,把From中存活且达到一定年龄的对象放入年老代,其它存活的对象放入To,然后把To中的对象转移到From中。
GC(或Minor GC)只清理年轻代中的对象,Full GC清理年轻代和年老代的对象,而永久代中的对象永远不被清除,因为永久代保存的是各个类的Class对象,直到JVM退出时才清除。

3、数据库事务ACID
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需具有这四种特性,否则在事务过程中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

4、MySQL锁机制
数据库锁机制可以提高数据库的并发处理能力。
MySQL有三级锁定:行级锁定页级锁定表级锁定。从左到右粒度逐渐增大,并行性降低。
MySQL有多种存储引擎,不同存储引擎,或同一存储引擎的不同事务隔离级别都有可能采用不同的锁定级别。

MySQL的四种事务隔离级别:

上一篇下一篇

猜你喜欢

热点阅读