公司名称:陕西晟茂华科广告文化传播有限公司 公司地址:陕西省西安市高新区丈八街办唐延路1号旺座国际城第1幢3单元C1902号房 公司规模:100-150人面试整体事项 一.基础知识: 1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList;HashSet,TreeSet); 2)HashMap的底层实现,之后会问ConcurrentHashMap的底层实现; 3)如何实现HashMap顺序存储:可以参考LinkedHashMap的底层实现; 4)HashTable和ConcurrentHashMap的区别; 相同点: Hashtable 和 ConcurrentHashMap都是线程安全的,可以在多线程环境中运行; key跟value都不能是null 区别: 两者主要是性能上的差异,Hashtable的所有操作都会锁住整个对象,虽然能够保证线程安全,但是性能较差; ConcurrentHashMap内部使用Segment数组,每个Segment类似于Hashtable,在“写”线程或者部分特殊的“读”线程中锁住的是某个Segment对象,其它的线程能够并发执行其它的Segment对象。 5)String,StringBuffer和StringBuilder的区别; 1、在执行速度上:Stringbuilder->Stringbuffer->String 2、String是字符串常量 Stringbuffer是字符串变量线程安全 Stringbuilder是字符串变量线程不安全 6)Object的方法有哪些:比如有wait方法,为什么会有; 简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。 专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。 7)wait和sleep的区别,必须理解; sleep()方法导致了程序暂停执行指定的时间,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而且sleep()只能自己到点了醒来,不能被唤醒。 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池,准备获取对象锁进入运行状态。 8)JVM的内存结构,JVM的算法; JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配; 方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆);栈又分为java虚拟机栈和本地方法栈主要用于方法的执行。 9)强引用,软引用和弱引用的区别; 10)数组在内存中如何分配; Java中的数组是用来存储同一种数据类型的数据结构,一旦初始化完成,即所占的空间就已固定下来,初始化的过程就是分配对应内存空间的过程。即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。 11)用过哪些设计模式,手写一个(除单例); 12)springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的; 1 首先用户发送请求到前端控制器DispatcherServlet,也是springmvc的核心控制器,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制; 2 DispatcherServlet调用HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象,也就是Controller层,多个 HandlerInterceptor拦截器)返回给DispatcherServlet; 3 DispatcherServlet根据得到的Handler,调用合适的HandlerAdapter,HandlerAdapter将会把处理器 (Handler) 包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处 理器。 4 HandlerAdapter会根据适配的结果调用真正的处理器(Handler)完成请求处理,并向DispatcherServlet返回一个 ModelAndView对象。 5 根据返回的ModelAndView选择一个适合的ViewResolver(视图解析器)返回给DispatcherServlet 6 ViewResolver根据view 和 model 渲染视图 7 将渲染结果返回给客户端。 IOC控制反转的实现是基于spring的bean工厂,当你需要引用一个对象时,将本来应该由你控制的实例化对象的操作 交给配置好的xml来进行,然后再给你注入进去,从而降低代码间的耦合度 13)spring里面的aop的原理是什么; AOP的主要原理:动态代理 1.静态代理: l 针对每个具体类分别编写代理类; l 针对一个接口编写一个代理类; 2.动态代理: 针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类 14)mybatis如何处理结果集:反射,建议看看源码; 到此,Mybatis是怎么利用ResultSet生成对象的过程已经分析完毕。分为简单映射和复杂映射。 简单映射就是不包含内映射的resultMap 复杂映射就是包含内映射的resultMap。 复杂映射的过程比较复杂,源代码也没有一行注释,本人是写了个实例,再通过eclipse中的debuger一步步来分析的。 15)java的多态表现在哪里; 父类引用指向子类对象 16)接口有什么用; 一是实现多重继承,因为java是单根语言。 二是便于实现各种框架,java 的各种框架中,都是拿接口调来调去。一旦你实现了这个接口,你的代码就嵌入了框架。 三是为了实现前面各位说的规范。 17)说说http,https协议; https协议需要到ca申请证书,一般免费证书很少,需要交费。 http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。 http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。 http的连接很简单,是无状态的。 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。 18)tcp/ip协议簇; TCP/IP由四个层次组成:1、网络接口层:这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。 2、网间网层:负责相邻计算机之间的通信。其功能包括三方面。1是处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。2是处理输入数据报:首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。3是处理路径、流控、拥塞等问题。 3、传输层:提供应用程序间的通信。其功能包括:格式化信息流;提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。 4、应用层:向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。 19)osi五层网络协议; 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 数据格式化,代码转换,数据加密 没有协议 会话层 解除或建立与别的接点的联系 没有协议 传输层 提供端对端的接口 TCP,UDP 网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP 数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU 物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2 20)tcp,udp区别; 1、基于连接与无连接。 2、TCP要求系统资源较多,UDP较少。 3、UDP程序结构较简单。 4、流模式(TCP)与数据报模式(UDP)。 5、TCP保证数据正确性,UDP可能丢包。 6、TCP保证数据顺序,UDP不保证。 7、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。 8、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。 21)用过哪些加密算法:对称加密,非对称加密算法; 22)说说tcp三次握手,四次挥手; 23)cookie和session的区别,分布式环境怎么保存用户状态; 1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。 2、session中保存的是对象,cookie中保存的是字符串。 3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。 24)git,svn区别; 1. Git是分布式的,SVN是集中式的,好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交; 25)请写一段栈溢出、堆溢出的代码; public class Test { public void testHeap(){ for(;;){ ArrayList list = new ArrayList (2000); } } int num=1; public void testStack(){ num++; this.testStack(); } public static void main(String[] args){ Test t = new Test (); t.testHeap(); t.testStack(); } } 26)ThreadLocal可以用来共享数据吗; 二.IO: 1)bio,nio,aio的区别; 2)nio框架:dubbo的实现原理; 3)京东内部的jsf是使用的什么协议通讯:可参见dubbo的协议; 三.算法: 1)java中常说的堆和栈,分别是什么数据结构;另外,为什么要分为堆和栈来存储数据。 2)TreeMap如何插入数据:二叉树的左旋,右旋,双旋; 3)一个排序之后的数组,插入数据,可以使用什么方法?答:二分法;问:时间复杂度是多少? 4)平衡二叉树的时间复杂度; 5)Hash算法和二叉树算法分别什么时候用; 6)图的广度优先算法和深度优先算法:详见jvm中垃圾回收实现; 三.多线程相关: 1)说说阻塞队列的实现:可以参考ArrayBlockingQueue的底层实现(锁和同步都行); 2)进程通讯的方式:消息队列,共享内存,信号量,socket通讯等; 3)用过并发包的哪些类; 4)什么地方用了多线程; 5)Excutors可以产生哪些线程池; 6)为什么要用线程池; 7)volatile关键字的用法:使多线程中的变量可见; 四.数据库相关(mysql): 1)msyql优化经验: 2)mysql的语句优化,使用什么工具; 3)mysql的索引分类:B+,hash;什么情况用什么索引; 4)mysql的存储引擎有哪些,区别是什么; 5)说说事务的特性和隔离级别; 6)悲观锁和乐观锁的区别,怎么实现; 五.mq: 1)mq的原理是什么:有点大。。都可以说; 2)mq如何保证实时性; 3)mq的持久化是怎么做的; 六.nosql相关(主要是redis): 1)redis和memcache的区别; 2)用redis做过什么; 3)redis是如何持久化的:rdb和aof; 4)redis集群如何同步; 5)redis的数据添加过程是怎样的:哈希槽; 6)redis的淘汰策略有哪些; 7)redis有哪些数据结构; 七.zookeeper: 1)zookeeper是什么; 2)zookeeper哪里用到; 3)zookeeper的选主过程; 4)zookeeper集群之间如何通讯; 5)你们的zookeeper的节点加密是用的什么方式; 6)分布式锁的实现过程; 八.linux相关: 1)linux常用的命令有哪些; 2)如何获取java进程的pid; 3)如何获取某个进程的网络端口号; 4)如何实时打印日志; 5)如何统计某个字符串行数; 九.设计与思想: 1)重构过代码没有?说说经验; 2)一千万的用户实时排名如何实现; 3)五万人并发抢票怎么实现;
|