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中,如何输出这个变量的值?
相当于
<%= request.getAttribute("stringBean") %>
或
<%= stringBean %>
3、JSP四大作用域
- pageContext:当前JSP页面有效
- request:当前请求周期有效,forward后可跨页面
- session:当前浏览器会话有效
- application:整个web应用有效
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垃圾回收机制
堆内存被分为三部分:年轻代、年老代、永久代。
年轻代又分为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的四种事务隔离级别:
- Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
- Repeatable read (可重复读):可避免脏读、不可重复读的发生。
- Read committed (读已提交):可避免脏读的发生。
- Read uncommitted (读未提交):最低级别,任何情况都无法保证。