做了个笔试题,前面几个选择题,然后填空题,然后4道大题里,一道shell的,一道冒泡排序,一道sql,一道什么查找算法的。
问数组底层是什么机构,然后框架底层原理和其他框架的区别,还问tcp,然后问数据库的随便问了个平时怎么优化,我就说用索引,然后还问redis原理结构,并发处理,数据库大数据量分表,加字段等等。
【选择题】主要对基础知识的考核,部分网上也有,可以自己看看,不算难。
【简答题】主要有:1.对垃圾回收机制的理解(比如简称,实现原理,还有理解)。
Json与XML的异同
用二分查询来写一道程序,如果对基本的算法有所了解,应该不难。还要计算相应的(忘记是时间复杂度还是空间复杂度)。技术面,有两个面试官,面试官在你回答的时候有时候会打断你问下一个问题:
一些基本的快排还有什么二分法查询都忘记了(最基本的。)
怎么实现多线程编程
怎么实现线程同步
select、epoll区别,进程间通信的方法,内核地址空间和用户地址空间,程序分辨大端小端。
设计可供4万人同时在线的棋牌类游戏,有登录、发牌逻辑、好友、任务、邮件功能,从接口层、逻辑层、存储层,说一下设计思路、框架、模块设计。
a.如何自己实现select,select为什么只能监听1024个,不用红黑树如何自己实现map,如何自己实现hiredis库。
线程安全、进程间通信
一面是技术面问了些基本的数据结构,写了个快排。
第一问是设计一个类,如何表示一张牌,其中牌有四个花色,13个面值;第二问是考察c++的多态,要用虚函数;第三问考察的是类的组合问题。
我描述快排,后面就问了一些其他问题,如三次握手、线程进程的区别、线程同步与互斥、事物的特性。
问客户端和服务端同时发出第一次挥手请求结果会怎么样
一面的时候问了最后一个编程题,如何用类表示一张牌,其中牌有四个花色,13个面值,让我再想想如何表示
一开始说用两个枚举类型表示四个花色和13个面值,来标记。面试官说还可以更简单。然后我就说用一个整形来表示,1~13表示红心的1到k,14~26表示梅花的1到k···。面试官说这个要查找的时候涉及到除法,而除法又是非常耗时间的,还提示我能不能用位运算解决。灵光一闪,想起了用位标记,用两位表示四个花色,用四位表示13个面值,一共六位,也就是说不到一个字节就可以表示四个花色和13个面值。
面向对象和面向过程的区别
linux 、redis 基础命令、mysql配置、高并发之类的
保持socket连接
心跳包
例如算法与数据结构方面问了快速排序最好最坏时间复杂度,为什么是这样,怎样优化、单链表如何判断有环、单链表逆序输出等。C++有关的有虚函数的动态绑定问题,虚函数表,以及stl,如vector,迭代器。还会问一些操作系统和计算机网络有关的知识点,比如linux的awk和sed有什么区别,tcp的三次握手,为什么不是四次等等。
一个是关于map源码的,一个是虚析构函数,还有一个是设计模式的东西。
问虚析构函数是用来解决基类的指针指向派生类对象,并用基类指针删除派生类的对象。
问了两个问题,链表有没有环,虚函数。链表怎么找环?环的入口?
自我介绍,问简历上的项目,面向对象三大特征,及在项目中的体现,http和tcp的区别,网络协议,有什么要问他的。
首先自我介绍,谈谈项目,重点是拿着试卷在问,哪些做错了,现在有什么想法?问了虚拟内存,STL,伙伴地址的东西等,树和图的区别,魔方游戏的设计,平衡二叉树的特点,排序算法的时间复杂度。
你期望公司是怎么样的
答有明确的方向,不要随波逐流。
基础知识各类常用函数什么的 mysql怎么设计表 服务器架构cdn之类
写了个冒泡法排序
2.Vector与ArrayList,HashTable与HashMap的区别。
这题应该是java各大面试宝典中的基础题,但我好久没看了,平时也很少用Vector(真的很少用到,可能是因为多线程的代码写少了),所以只答对了后面一对的区别,前面的一对基本属于瞎扯。但仔细想想,多深入猜下,应该知道这考的是一个线程安全与非线程安全的主要区别。
实际上Vector和ArrayList都继承于List接口,实现此接口的还有个LinkList.先不谈LinkList.。
ArrayList实际封装的是数组,是用一段连续的内存来进行存储,当数组空间不够时,将已有数组copy到新的空间中,因此其随机访问比较方便,插入和删除时相对比较耗时。因此这个类我们经常用到的方法是get(i):随机访问,以及add,尾部添加。
Vector是在ArrayList的基础上方法实现同步synchronized(很囧,当时不知道怎么拼写这个单词,写了个草书,哈哈).因此其在单线程中应用性能肯定要比ArrayList差。想想也易懂,每个方法都要排队等待来保持同步,是多么耗时。
说到这里,Collections.synchronizedList(List
Vector会在存储空间不够时,一次性增加一倍的存储空间,增量大。ArrayList在存储空间不够时,一次性增加50%的存储空间,增量小。所以在存储量很大时,使用Vector效率要高些。还有一点需要注意的是synchronizedList在迭代的时候,需要开发者自己加上线程锁控制代码。因为迭代器涉及的代码没有在java api中没有加上线程同步代码。如果图省事,肯定是Vector,但是我们要注意到,若果多线程中都只是对集合进行遍历地取值的话,亦或各个线程中的List中的值有区别处理时,还是用synchronizedList好,毕竟这个方法是后设计出来的,目的就是让并发性能更好。详细分析见:http://www.cnblogs.com/yanghuahui/p/3365976.html
废话一堆,如果是临时抱佛脚的时候,没耐心看这么多。好吧,总结下:
区别是:1.线程同步与异步的区别;2.存储空间满后,一次性增量大小的区别
同理,HashTable与HashMap。我在项目中遇到过这么一个问题:多线程中用了个HashMap,因为我能保证Map的Key能完全不一样,所以我想不同步也罢。但是问题来了。在子线程执行完后进入主线程中时,发现有丢失key值的情况。后面仔细想想,这是个哈希Map,在多线程中对已有hash值的判断未同步,就会导致多个value与同一个key值对应,从而后面的value覆盖了前面的value。用Collections.synchronizedMap成功解决此问题。鉴此教训,多线程一定要考虑好线程安全,对于有同步和异步对应的类,一定要用同步类。
再细说下HashTable与HashMap的区别吧。除了以上List同理下来的区别。还有一个区别是,HashMap容许key为空值,HashTable不容许key为空值。因此HashMap判断某个值是否存在是用containKey
所以后一对的区别是:1.线程同步与异步的区别;2.HashMap容许key为空值,HashTable不容许key为空值
最后还要说到的是jdk1.5中引入了ConcurrentHashMap,注意没有对应的ConcurrentList.这个细节讨论很复杂。没耐心研究下去了,先贴链接如下:
http://www.iteye.com/topic/344876
3.TCP和UDP的区别。
TCP (Transmission control protocol) 传输控制协议,基于连接的,所以一般与ip协议一起用,会有3次握手,才建立通讯。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。smtp协议和ftp都是基于此协议。
UDP(User data protocol)用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。流媒体一般都采用此协议。
4.线程的几种状态
写了休眠 运行 停止 和销毁
正确答案是 1.创建 2.就绪 3.运行 4.阻塞 5.销毁
5.sleep()和wait()的区别
这个基本答对了。
1.sleep()是Thread的方法,wait()是Object的方法。
2.锁资源的释放不同。sleep一般带参数,等待多少秒后自动运行。wait虽然可以带参数,但一般不带参使用。原因在于sleep()线程进入阻塞状态后,不会释放资源锁,只能等其自动醒来,如果需要强制此线程进行下去,需使用interrupt()强行打断。而sleep(0)代表线程再次去cpu抢占资源。wait是会释放掉资源的,因此自动醒来没资源也没用,所以其一般是需要在其他线程中调用notify或者notifyAll来唤醒。
3.使用范围不同,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 。
4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
6.写一个单体实例
快速排序的最坏情况是什么时候发生,怎么优化 AC
单链表怎么判断有环,有的话怎么判断环口 AC
写atoi函数,只有数字,没有字符 AC
一个类要当做map的key需要符合什么条件 AC 重载比较操作符
虚函数和纯虚函数是做什么用的?
我说继承和重写