• 面试总结


    1.       链表的逆转

    参考《剑指offer》

    2.      找到链表中倒数第K个元素

    使用两个指针,pstart,pend,先让pend指向第k个元素,然后pstart和pend都向后移动。当pend的下一个为空。pstart的下一个就是需要查找的元素

    3.       session 和cookie的区别

    存储位置session是存储在服务端的,在关闭浏览器后丢失、cookie 是存在客户端的,在过期后消失。

    安全性 cookie是不安全的可以进行欺骗,session是无法伪造的

    单个cookie保存的数据不能查过4k,同一个网站最大有20个。session会在一定时间内保存在服务器上,当访问大的时候,会比较占用你的内存的。

    4.   extern、static、const 、volatile的意思

    extern:

    以表示变量或函数的定义在别的文件中,提示编译器在遇到此类变量和函数时在其他模块中寻其定义。

    const:  

    1,定义const常量 ,让编译器对处理的内容有更多的了解,消除一些隐患 

    3,预先定义一些常用的参数,做到一变全变。

    4,可以保护被修饰的东西,防止意外的修改 

    5,节约内存空间和提高编译效率(定义变量时,与宏定义比较,宏定义每次都一个新分配的内存,const是一个引用)

    static: 

    1, 限制函数的作用域在同一个文件中。

    2,保持变量的内容 

    3, 定义时初始化变量为0

    volatile:

    变量可能会被意想不到的改变。编译器在用到这个变量的时候,每次要从新读取这个变量的值。而不是寄存器中备份的。下面是几个用到的例子 1, 并行设备的硬件寄存器 2,中断服务子程序中访问到的非自动变量 3,多线程中被共享的变量

    5.       堆和栈的区别

    栈区(stack)―   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

    堆区(heap) ―   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

    6.  杀死某一类的进程

    例如杀死所有的vim:pe  -ef|grep vim|awk {‘print $2’}|xargs kill -9

    7.   句子反转  I am student 反转为  student am I

    1.      先对单词反转

    2.      对整体反转

    8.  字符串前面n个字符放到后面

    1.      先对前n个字符翻转

    2.      对n后边的字符翻转

    3.      对整体进行反转

    9.  进程之间通信的方法

    1.      管道(Pipe)及有名管道

    2.      信号(Signal)

    3.      报文(Message)

    4.      共享内存

    5.      信号量

    6.      套接字

    10.   数组与链表的区别

    数组:定义固定长度的连续内存空间,已经分配无法改变存储的位置和元素个数,不使用动态的增长、删除和插入。数据类型是统一的,数据访问0(1)。

    链表:在内存中是分散,元素的个数可以改变。数据类型可以不统一。适用动态的增长和删除、插入。

    11.  指针和数组的区别

    数组是存储数据的。数组的名字是一段内存开始的标志。无法对自身做加减运算。

    指针是存储地址的。可以指向任意位置。

    12.   抽象类和接口的区别

    一.抽象类定义关系,接口定义的是规范

    二.抽象类可以对定义的方法可以给出现实代码,也可以不给出实现代码。接口不能写方法的具体实现。

    三.对于继承类,抽象类的子类可以重写抽象类,也可以不重写抽象类,使用抽象类的代码。继承接口的子类,必须实现接口中的所有方法。

    四.对于抽象类和接口的修改。抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法的实现。

    13.   ACID

       原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability

    14.   进程和线程的区别

    线程被称为轻量级别的进程(LWP)是CPU调度和分配的基本单元。

    进程被称为重量级别进程(HWP)。进程也可看做一个线程的集合。

    区别可以从调度、并发性、系统开销、拥有资源等发面作比较。

    可以参考下面地址回答。

    http://software.intel.com/sites/default/files/m/5/7/f/a/b/12568-2.1.1_e7_ba_bf_e7_a8_8b_e4_b8_8e_e8_bf_9b_e7_a8_8b_e7_9a_84_e5_8c_ba_e5_88_ab.pdf

    15.   select、poll、epoll的区别

    elect目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。

    从上面看,selectpoll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降

    epoll的优点主要是一下几方面:

    1.   监视的描述符不受数量限制,它所支持的FD上线是最大的可以打开文件的数目。具体数值可以cat /proc/sys/fs/file-max查看,一般来说这个数目和系统内存关系很大。select的最大缺点就是进程打开的fd是有数量限制的。着对于访问量较大的服务满足不了需求。虽然也可以选择多进程的解决方案( Apache就是这样实现的),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也不是一种完美的方案。

    2. IO的效率不会随着监视fd的数量的增长而下降。epoll不同于selectpoll轮询的方式,而是通过每个fd定义的回调函数来实现的。只有就绪的fd才会执行回调函数。

    3.   支持电平触发和边沿触发(只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发)两种方式,理论上边缘触发的性能要更高一些,但是代码实现相当复杂。

    4.   mmap加速内核与用户空间的信息传递。epoll是通过内核于用户空间mmap同一块内存,避免了无畏的内存拷贝。

     


     博客地址:http://www.rhttp.cn

  • 相关阅读:
    ASM ClassReader failed to parse class file解决方法
    Android Studio3.1.2升级问题:Configuration 'compile' is obsolete and has been replaced with 'implementation'.
    解决Android Studio出现Failed to open zip file. Gradle's dependency cache may be corrupt的问题
    AS使用lombok注解报错:Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.
    IDEA调试SpringMvc项目时,出错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener,解决办法
    解决Android Studio出现GC overhead limit exceeded
    android ScrollView 控制行数
    [android警告]AndroidManifest.xml警告 Not targeting the latest versions of Android
    Android中的windowSoftInputMode属性详解
    MySQL中的isnull、ifnull和nullif函数用法
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3400455.html
Copyright © 2020-2023  润新知