阿里妈妈电话面试总结

来源:互联网 发布:杭州佳词网络科技集团 编辑:程序博客网 时间:2024/04/30 19:56
2017年3月1日
一、算法题:
1、判断一个数是否为2的N次幂
答:设这个数为n,然后用这个数的二进制和(n-1)的二进制做求与运算,如果所得的结果为0,那么即为二进制数。

2、给定一个数组A(1-100)判断A里面是否有重复元素
答:定义一个hashmap集合,key存放A中的元素值,value存放该元素值出现的次数,假如用count表示,如果count>=2,说明有重复元素。

3、给定一个字符串ab_cd_e,要求字母放前面,下划线放后面。
答:A、把字符串转换为字符数组(toCharArray)
B、定义一个StringBuilder,用来存放排序后字符
C、遍历字符数组,判断如果'a'<Char[i]<'z',就添加到sb中
D、再次遍历字符数组,如果为空,退出,不为空,将元素添加到Sb中
E、将sb转化为字符串(toString())

4、判断一个链表是否是一个环
答:定义两个指针,一个快指针(fast),假如每次移动两步;一个慢指针(slow),假如每次移动一步。判断两个指针能否相遇,如果能,则是一个环。
如果不能,快指针一定先指向NULL,则不成环。
class X{
Boolean isExitsLoop(list head){
list slow=head;
list fast=head;
while((fast&&fast.head)!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast){
break;
}
}
return !(fast==null||fast.next==null);
}
}

二、Java基础题
1、HashMap与TreeMap的区别
答:相同点:两者都是线程不安全的,都继承自AbstractMap

不同点:HashMap基于哈希表实现,使用HashMap要求添加的键明确定义hashcode()和equals()方法,适用于在Map中增删查元素,速度通常
比TreeMAp要快一点,遍历结果是没有排序的。
TreeMap基于红黑树实现,适用于按自然顺序或自定义顺序遍历键(key),实现SortedMap接口,遍历得到的结果(键)是排过序的。

2、static成员是否能访问非静态成员
答:静态成员属于类,不需要生成对象就存在了,而非静态需要生成对象才产生,所以静态成员不能直接访问

3、TCP与UDP的区别
答:A、TCP(传输控制协议),是面向连接的协议,UDP(用户数据报协议),是不面向连接的;
B、对系统资源的要求,TCP较多,UDP较少
C、UDP程序设计结构较为简单,TCP需要经过三次对话建立连接。
D、TCP是流模式,UDP是数据报模式
E、TCP保证数据的正确性和顺序,UDP不能保证,可能丢失包。



2017年3月2日
1、JDBC、Ibatis(MyBatis)、Hibernate对比、以及优点缺点
答:JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成
Hibernate、iBatis、myBatis都是Java的数据库DAO层框架。
与JDBC比较,Ibatis(MyBatis)优点如下:
A、减少了大量的代码量(61%);
B、架构级性能增强
C、sql语句与程序代码分离(便与修改)
D、增强了移植性
三者对比
(1)JDBC:手动
手动写sql语句
delete、insert、update要将对象的值一个一个取出传到sql中,不能直接传入一个对象。
select:返回的是一个resultset,要从ResultSet中一行一行、一个字段一个字段的取出,然后封装到一个对象中,不直接返回一个对象。
(2)ibatis的特点:半自动化
sql要手动写
delete、insert、update:直接传入一个对象
select:直接返回一个对象 
(3)hibernate:全自动
不写sql,自动封装
delete、insert、update:直接传入一个对象
select:直接返回一个对象
总结:JDBC更加灵活,更加有效率,系统运行速度快。但是用起来麻烦,不方便数据库的移植。
 Ibatis(MyBatis)、Hibernate是关系数据库框架,开发速度快,更加面向对象,可以移植更换数据库,但是影响系统性能。
 
2、PrepareStatement相比statement优点。
答:优势:A、相对比较安全,可以防止sql注入
 B、有预编译功能,相同操作批量数据效率较高
PrepareStatement是预编译,使用Statement时sql中要进行很多的单引号拼接字符串,容易出错也比较麻烦。从安全方面来说,就是存在sql注入
PrepareStatement传参数时候使用了占位符"?",解决了此类问题,(效率高)。

3、TCP为什么3次握手,四次挥手
答:TCP三次握手的目的是为了解决网络中存在延迟而重复分组的问题,防止server端一直等待,浪费资源。保证数据的可靠传输。
举个栗子(已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致


延误到连接释放以后的某个时间
才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就
向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连
接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,
server的很多资源就白白浪费掉了),三次握手能解决此问题。client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建
立连接。

四次挥手目的:
试想一下,假如现在你是客户端你想断开跟Server的所有连接该怎么做?第一步,你自己先停止向Server端发送数据,并等待Server的回复。但事情还没
有完,虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,所以此时他也有主动权向你发送数据;故Server端还得终止主动
向你发送数据,并等待你的确认。其实,说白了就是保证双方的一个合约的完整执行!

名词解释:seq:序列号 ACK:确认标志 SYN:请求同步标志 FIN:结束标志
三次握手:(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1
 (2)当服务器接收到客户端发来的SYN时,会向客户端发送一个SYN+ACK数据包,这是三次握手中的第2个报文,这个报文同时带ACK标志和
 SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
 (3)客户端接收到,再次回应服务段一个ACK报文,确认发送。这是报文段3。

四次挥手:(1)先由客户端向服务器端发送一个FIN,请求关闭数据传输
 (2)当服务器接收到客户端的FIN时,向客户端发送一个ACK,其中ack的值等于FIN+SEQ
 (3)服务器向客户端发送一个FIN,告诉客户端应用程序关闭
 (4)客户端收到服务器端的FIN时,回复一个ACK给服务器端。其中ack的值等于FIN+SEQ
 
4、进程和线程含义及区别
答:(1)含义:
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
线程:是进程的一个实体,是CPU调度和分配的基本单位
(2)区别:A、主要区别就是他们是不同操作系统的资源管理方式。
B、一个程序至少有一个进程,一个进程至少有一个线程
C、线程的划分尺度小于进程,使得多线程程序的并发性高
C、进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响。但是线程没有独立的地址空间,一个线程死掉
等于整个线程就死掉,因此多进程比多线程健壮。
D、线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够
独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5、多线程什么情况下执行wait和notify
答:调用wait和notify方法前,必须获得锁对象,也就是必须用在synchronized机制中的while循环中。
比如说两个线程A和B,当线程A获取到锁对象后,判断while循环条件是否满足,如果不满足,无法继续下一处理的时候,调用wait()方法。
在B线程中,B线程更改了某些条件,使得线程A的条件满足了,就调用notify()唤醒A

6、tomcat负载均衡
http://www.cnblogs.com/rocomp/p/4802396.html

7、Spring容器如何加载
https://my.oschina.net/chape/blog/136453
8、Servlet生命周期(什么时候destory)
答:servlet生命周期由javax.servlet.Servlet接口的init(),service()和destory()方法表达。Servlet被实例化之后,运行其init()方法,
请求到达时运行其service()方法,service()方法会自动派遣运行与请求对应的doXXX(doGet与doPost)等,当服务器决定将实例销毁的时候,
调用其destory()方法。

9、Mysql底层实现,B+树原理
答:(1)http://blog.csdn.net/u012978884/article/details/52416997
(2)B+树是为文件系统需要而设计的一种平衡查找树;http://blog.csdn.net/sykpour/article/details/25142759
10、10G数据,每一条是一个qq号,统计出现频率最多的qq号
答:用hash的方法,把QQ分配到10(假设值,可变)个文件中,这样,每个文件的内存就是一个G,相同的QQ肯定存在相同的文件中,然后对每一个文件
用HashMap(qq,qq.count)统计每个qq出现的次数。然后,记录每个文件的最大访问次数的QQ,最后,从10个文件中找出来一个最大的即可。

11、JVM新生代和老年代如何区分,新生代垃圾回收用什么算法,copy算法内存是怎么分的
答:(1)JAVA堆中是JVM管理的最大的一块内存空间,主要存放对象实例。JAVA中堆被分为两个两块区域,即新生代(young,1/3)和老年代(old,2/3)
所谓的新生代和老年代是针对于分代收集算法来定义的。区别:存放对象生命周期不同,垃圾回收机制不同。
新生代GC(minor gc)主要是用来存放新生的对象,分为Eden和Survivor(from,to)两个区,这样划分是为了更好的管理堆内存中的对象,
方便GC算法---复制算法来进行垃圾回收。
老年代GC(major gc)主要存放应用程序中生命周期长的内存对象,指发生在老年代的垃圾回收动作,所采用是的标记--整理算法。
(2)新生代采用复制算法回收垃圾。
(3)copy算法基本思想:将内存分为两块,每次只用其中的一块,当这一块内存用完,就将还活着的对象复制到另一块上面。
具体地说,在GC开始的时候,对象只会存在到Eden区和From Survivor区中,而To Survivor区的内容是空的,紧接着进行GC,然后Eden区存活的
对象都会被复制到“To”,而“From”区里面的对象年龄会加1,当年龄达到一定数值(年龄阈值),对象会被移动到老年代里,没有达到的被复制到“To”里面
因此经过GC后,Eden和“from”中的对象会被清空,这个时候,“From”和“To”交换角色,然后重复这样的过程,直到“To”区域被填满,“To”被填满后,



将所有的对象都移动到老年代中。


12、HashMap的实现原理(http://zhangshixi.iteye.com/blog/672697)
答:(1)HashMap的概述
HashMap是基于哈希表的Map接口的非同步实现,允许使用null值和null键,此类不保证映射的顺序。
(2)HashMap的数据结构
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的底层就是一个数组结构,数组中的每一项又是一个链表
(3)HashMap的存取实现
存储(put):当往HashMap中put元素的时候,先根据key的HashCode重新计算hash值,根据这个hash值得到这个元素在数组中的下标,如果该位置
已经有其他元素,那么该位置的元素将已链表的形式存放,新加的放在链头。如果没有元素,就直接将该元素放在此位置。
获取(get)HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找
到需要的元素。
总结:HashMap在底层将Key-value当成一个整体进行处理,这个整体就是一个Entry对象。HashMap底层采用一个Entry[]数组来保存所有的Key-value
对,当需要存储一个Entry对象时,会根据hash算法来决定其在数组中的存储位置,再根据equals方法决定其在数组位置上链表中的存储位置,当需要
取出一个Entry对象时,先根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该对象。

13、数组和链表的比较
数组:数组是将元素在内存中连续存放,由于每个元素占用的内存相同,可以通过下标迅速访问数组中的任何元素,但是增加或者删除一个元素,就需要
移动大量的元素,比较缓慢。
链表:链表中的元素在内存中不是顺序存储的,而是通过指针存在一起,每个节点包括两个部分,存储元素的数据域与存储下一结点地址的指针域
如果访问链表中元素,需要从第一个元素开始,一直找到需要的元素的位置,所以缓慢。但是增加删除元素,只需要修改指针就可以,速度较快。
区别:(1)存储位置:
数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定;
 (2)存储空间:
链表存放的内存空间可以是连续的,也可以不连续,但是数组则是连续的一段存储空间;
 (3)长度的可变性:
链表的长度可变,数组不可变
 (4)访问方式:
数组可以随机访问其中元素,链表必须顺序访问。
优缺点:
——数组:优点:使用方便,查询效率高,内存为一连续区域
缺点:大小固定,不适合动态存储,不方便动态添加。
——链表:优点:可动态添加删除,大小可变
缺点:查询效率低。

14、ArrayList和Linkedlist以及Vector对比
答:ArrayList与Vector都是使用数组的方式进行存储,此数组元素数大于实际存储数据以便增加和插入元素,他们都允许按序直接索引元素,因此
查询较快,但是插入数组元素涉及到数组元素移动等内存操作,因此增删比较慢。Vector由于使用了synchronized方法,所以线程安全,但性能较差。
LinkedList使用双向链表的方式进行存储,按序索引数据需要向前或者向后遍历,因此查询比较慢;但是插入数据只需要记录本项的前后两项
即可,因此增删快,LinkedList也是线程不安全的。

15、准备一个了解或者感兴趣的新技术










0 0
原创粉丝点击