面试总结(一)——哈啰出行

面试总结(一)——哈啰出行

  • 1、synchronized和volatile是干啥的
  • 2、用数组实现队列
  • 3、多边形的最小外接矩形
  • 4、memcached和redis的区别
  • 5、redis的通信协议、规范
  • 6、Java实例化一个对象所分配内存的过程

今天是找实习以来的第一次面试,第一次就这样献给了哈啰,现在才知道自己是有多菜,看来得加紧学习啊。

面试题及答案如下(乱序):

1、synchronized和volatile是干啥的

答案:synchronized
它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

五、以上规则对其它对象锁同样适用.

voliate
用在多线程,同步变量。 线程为了提高效率,将成员变量(如A)某拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) ,但是不能用其来进行多线程同步控制

2、用数组实现队列

答案:太简单,不解释了

3、多边形的最小外接矩形

刚开始一点思路都没有,下午吃饭时候突然顿悟,写下思路:
先建立坐标系,一般用直角坐标就好,先接收各个顶点的坐标,由于多边形不一定是凸多边形,所以先要预处理将多边形转化成一个凸包,求得凸包的中心(也就是重心啦,凸包各个顶点的均值就是中心坐标),再假定外接矩形必须是和坐标轴平行的,然后通过循环旋转多边形(for循环,0~360度,步长适当),不断计算外接矩形的面积,找到其中面积最小的情况,然后缩小范围,缩小步长再次求解即可。

4、memcached和redis的区别

  • 性能上:性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。
    内存空间和数据量大小:MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。
  • 操作便利上:MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,(Redis不仅仅支持简单的k/v类型的数据,同时还提供string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)等数据结构的存储。memcache支持简单的数据类型,String。)也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。
  • 可靠性上:MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。
  • 应用场景:Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
    具体上:
  1. Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB
  2. Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高
  3. 从本质上讲,Memcached只是一个单一key-value内存Cache;而Redis则是一个数据结构内存数据库,支持五种数据类型,因此Redis除单纯缓存作用外,还可以处理一些简单的逻辑运算,Redis不仅可以缓存,而且还可以作为数据库用
  4. 新版本(3.0)的Redis是指集群分布式,也就是说集群本身均衡客户端请求,各个节点可以交流,可拓展行、可维护性更强大。
    Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的IO复用模型。
  • 小结:有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其他简单的key/value存储,选择memcached。对于两者的选择需要要看具体的应用场景,如果需要缓存的数据只是key-value这样简单的结构时,则还是采用memcache,它也足够的稳定可靠。如果涉及到存储,排序等一系列复杂的操作时,毫无疑问选择redis。

5、redis的通信协议、规范

找了一篇博客,须得好好看看。

6、Java实例化一个对象所分配内存的过程

创建一个对象都在内存中做了什么事情?Person p = new Person();

  1. 先将硬盘上指定位置的Person.class文件加载进内存。

  2. 执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。

  3. 在堆内存中开辟一个实体空间,分配了一个内存首地址值。new

  4. 在该实体空间中进行属性的空间分配,并进行了默认初始化。

  5. 对空间中的属性进行显示初始化。

  6. 进行实体的构造代码块初始化。

  7. 调用该实体对应的构造函数,进行构造 函数初始化。

  8. 将首地址赋值给p,p变量就引用了该实体。(指向了该对象)

你可能感兴趣的:(面试总结)