美文网首页
面试问题汇总

面试问题汇总

作者: 金戈大王 | 来源:发表于2017-03-22 22:51 被阅读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四大作用域

    • 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垃圾回收机制
    堆内存被分为三部分:年轻代、年老代、永久代。

    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 (读未提交):最低级别,任何情况都无法保证。

    相关文章

      网友评论

          本文标题:面试问题汇总

          本文链接:https://www.haomeiwen.com/subject/xfdanttx.html