个人总结的面试题Seven.docx
- 文档编号:4723922
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:17
- 大小:67.47KB
个人总结的面试题Seven.docx
《个人总结的面试题Seven.docx》由会员分享,可在线阅读,更多相关《个人总结的面试题Seven.docx(17页珍藏版)》请在冰点文库上搜索。
个人总结的面试题Seven
JavaSE
1.介绍SSH,谈谈自己的观点。
SSH(Struts,Spring,Hibernate) Struts进行流程控制,Spring进行业务流转,Hibernate进行数据库操作的封装!
Struts是一个在JSP Model2基础上实现的MVC框架,主要分为模型(Model)、视图(Viewer)和控制器(Controller)三部分,其主要的设计理念是通过控制器将表现逻辑和业务逻辑解耦,以提高系统的可维护性、可扩展性和可重用性
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库
系统的基本业务流程是:
在表示层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。
在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。
而在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。
自己的观点:
采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。
这样无论前端如何变化,模型层只需很少的改动,并且数据库的变化也不会对前端有所影响,大大提高了系统的可复用性。
而且由于不同层之间耦合度小,有利于团队成员并行工作,大大提高了开发效率。
2.什么是jQuery?
(答案来自XX百科)
Jquery是一个优秀的Javascript库。
它是轻量级的js库,它兼容CSS3,还兼容各种浏览器。
jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用)、events、实现动画效果,并且方便地为网站提供AJAX交互。
jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。
jQuery能够使用户的html页面保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需要定义id即可。
jQuery的语法设计可以使开发者更加便捷,例如操作文档对象、选择DOM元素、制作动画效果、事件处理、使用Ajax以及其他功能。
除此以外,jQuery提供API让开发者编写插件。
其模块化的使用方式使开发者可以很轻松的开发出功能强大的静态或动态网页。
3.存储过程的缺点?
✓存储过程优点:
1)在生产环境下,可以通过直接修改存储过程的方式修改业务逻辑(或bug),而不用重启服务器。
但这一点便利被许多人滥用了。
有人直接就在正式服务器上修改存储过程,而没有经过完整的测试,后果非常严重。
2)执行速度快。
存储过程经过编译之后会比单独一条一条执行要快。
但这个效率真是没太大影响。
如果是要做大数据量的导入、同步,我们可以用其它手段。
3)减少网络传输。
存储过程直接就在数据库服务器上跑,所有的数据访问都在服务器内部进行,不需要传输数据到其它终端。
但我们的应付服务器通常与数据库是在同一内网,大数据的访问的瓶颈会是硬盘的速度,而不是网速。
4)能够解决presentation与数据之间的差异,说得文艺青年点就是解决OO模型与二维数据持久化之间的阻抗。
领域模型和数据模型的设计可能不是同一个人(一个是SA,另一个是DBA),两者的分歧可能会很大——这不奇怪,一个是以OO的思想来设计,一个是结构化的数据来设计,大家互不妥协——你说为了软件的弹性必须这么设计,他说为了效率必须那样设计,为了抹平鸿沟,就用存储过程来做数据存储的逻辑映射(把属性映射到字段)。
好吧,台下已经有同学在叨咕ORM了。
5)方便DBA优化。
所有的SQL集中在一个地方,DBA会很高兴。
这一点算是ORM的软肋。
不过按照CQRS框架的思想,查询是用存储过程还是ORM,还真不是问题——DBA对数据库的优化,ORM一样会受益。
况且放在ORM中还能用二级缓存,有些时候效率还会更高。
✓存储过程缺点:
1)SQL本身是一种结构化查询语言,加上了一些控制(赋值、循环和异常处理等),但不是OO的,本质上还是过程化的,面对复杂的业务逻辑,过程化的处理会很吃力。
这一点算致命伤。
2)不便于调试。
基本上没有较好的调试器,很多时候是用print来调试,但用这种方法调试长达数百行的存储过程简直是噩梦。
好吧,这一点不算啥,C#/java一样能写出噩梦般的代码。
3)没办法应用缓存。
虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。
如果缓存并发严重,经常要加锁,那效率实在堪忧。
4)无法适应数据库的切割(水平或垂直切割)。
数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。
5)精通SQL的新手越来越少——不要笑,这是真的,我面试过N多新人,都不知道如何创建全局临时表、不知道having、不知道聚集索引和非聚集索引,更别提游标和提交叉表查询了。
好吧,这个缺点算是凑数用的,作为屌丝程序员,我们的口号是:
没有不会的,只有不用的。
除了少数有语言洁癖的人,我相信精通SQL只是时间问题。
✓总结
存储过程最大的优点是部署的方便性——可以在生产环境下直接修改——虽然滥用的后果很严重。
存储过程最大的缺点是SQL语言本身的局限性——我们不应该用存储过程处理复杂的业务逻辑——让SQL回归它“结构化查询语言”的功用吧。
4.索引的缺点?
✓优点
1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
✓缺点
1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
5.现在又6个孩子,平分5个苹果,要求每个苹果都不能切3分,问应该怎样切,把苹果平分给6个孩子。
先三个各切成两半,得到六分,分给他们,剩下两个苹果每一个切成三分,就得到六分,再分给他们
6.有一个人的夜明珠丢了,他在一个有1,2,3号房的地方找,从1号房出来的人说1号房没有夜明珠,2号房出来的人说1号房有夜明珠,3号房出来的人说3号房没有夜明珠,问谁说的对,夜明珠在哪个房。
7.谈谈Hibernate和ibates(mybates)优缺点和区别?
(ORM
:
对象关系映射)(POJO(PlainOrdinaryJavaObject)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称):
Hibernate"O/R"而言,iBATIS是一种"SqlMapping"的ORM实现。
介绍网址:
✓对于实际的开发进行的比较:
1) iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。
同样的需求,iBATIS的工作量比Hibernate要大很多。
类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sqlmapping的地方一一修改。
2)iBatis可以进行细粒度的优化
比如说我有一个表,这个表有几个或者几十个字段,我需要更新其中的一个字段,iBatis很简单,执行一个sqlUPDATETABLE_ASETcolumn_1=#column_1#WHEREid=#id#但是用Hibernate的话就比较麻烦了,缺省的情况下hibernate会更新所有字段。
当然我记得hibernate有一个选项可以控制只保存修改过的字段,但是我不太确定这个功能的负面效果。
例如:
我需要列出一个表的部分内容,用iBatis的时候,这里面的好处是可以少从数据库读很多数据,节省流量SELECTID,NAMEFROMTABLE_WITH_A_LOT_OF_COLUMNWHERE...一般情况下Hibernate会把所有的字段都选出来。
例如:
说有一个上面表有8个字段,其中有一两个比较大的字段,varchar(255)/text。
上面的场景中我为什么要把他们也选出来呢?
用hibernate的话,你又不能把这两个不需要的字段设置为lazyload,因为还有很多地方需要一次把整个domainobject加载出来。
这个时候就能显现出ibatis的好处了。
如果我需要更新一条记录(一个对象),如果使用hibernate,需要现把对象select出来,然后再做update。
这对数据库来说就是两条sql。
而iBatis只需要一条update的sql就可以了。
减少一次与数据库的交互,对于性能的提升是非常重要。
✓开发方面:
开发效率上,我觉得两者应该差不多。
可维护性方面,我觉得iBatis更好一些。
因为iBatis的sql都保存到单独的文件中。
而Hibernate在有些情况下可能会在java代码中保sql/hql。
相对Hibernate“O/R”而言,iBATIS是一种“SqlMapping”的ORM实现。
(iBatis是将sql写在配置文件中的,而hibernate是自己生成的) 而iBATIS的着力点,则在于POJO与SQL之间的映射关系。
也就是说,iBATIS并不会为程序员在运行期自动生成SQL执行。
具体的SQL需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。
使用iBATIS提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与通过Hibernate实现ORM而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL语句,而iBATIS则要求开发者编写具体的SQL语句。
相对Hibernate而言,iBATIS以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。
8.怎样用css定位组件(比如
9.用css确定字体是‘宋体’,字体大小等。
10.如何创建全局临时表、不知道having、不知道聚集索引和非聚集索引,更别提游标和提交叉表查询了
11.什么是Spring(面试题)(惠普的两个哥们做的spring)
Spring是一个容器,可以接管各个层次的Bean(action/domain/pojo/javabean),并且可以配置bean与bean之间的关系
在java代码里使用bean只需要用ApplicationContext的getBean(配置文件里bean的id)方法就可以了。
Spring是依赖反射机制的,那到底什么是反射机制呢:
反射机制就是利用(dom4j=java反射机制)
userBeanub=Class.forName(com.bean.***)这里是com全路径
所以在Spring配置文件中bean的id属性和class属性中要写全路径。
12.IOC是什么?
(面试题)
ioc(inverseofcontrol)控制反转:
所谓控制反转就是把对象(bean)对象和维护对象(bean)之间的关系的权利转移到Sqring容器中去了(ApplicationContext.xml)而程序本身不在维护了
13.列出IOC注入的三种方式
利用setter方法注入
利用构造函数注入
利用接口注入
14.DI是什么?
(面试题)
di(dependencyinjection)依赖注入:
实际上DI和IOC是同一个概念,因为在ApplicationContext.xml配置文件中bean和bean之间通过ref来维护的时候是相互依赖的,所以又叫做依赖注入。
也就是控制反转。
因为ApplicationContext是非常消耗内存的,所以必须保证一个项目里只有一个ApplicationContext实例:
那么如何保证这有一个实例呢,就需要把ApplicationContext对象做成单例形式,如何提取单例:
?
?
?
packagecom.util;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
finalpublicclassApplicationContextUtil{
privatestaticApplicationContextac=null;
//提供一个构造方法
privateApplicationContextUtil(){
}
static{
ac=newClassPathXmlApplicationContext("applicationContext.xml");
}
//提供一个方法供外面使用
publicstaticApplicationContextgetApplicationContext(){
returnac;
}
}
14.列出hibernate当中实体类对象的3中状态?
Hibernate的对象有3种状态,分别为:
瞬时态(Transient)、持久态(Persistent)、脱管态(Detached).处于持久态的对象也称为PO(PersistenceObject),瞬时对象和脱管对象也称为VO(ValueObject).
15.简述spring中常用的几种Advice?
--前置通知在目标方法执行之前-->
beforemethod="beginTransaction"pointcut-ref="perform"/> --后置通知 *在目标方法之后执行 *可以根据returning获取目标方法的返回值 *如果目标方法遇到异常,该通知不执行 --> after-returningmethod="commit"pointcut-ref="perform"returning="val"/> --前置通知和后置通知执行在目标方法中添加内容,但不能控制目标方法的执行--> --最终通知 *在目标方法执行最后执行 *无论目标方法是否遇到异常都会执行 *经常处理一些资源的关闭工作 --> aftermethod="finallyMethod"pointcut-ref="perform"/> --异常通知目的就是获取目标方法抛出的异常--> after-throwingmethod="exceptionMethod"throwing="exception"pointcut-ref="perform"/> --环绕通知能控制目标方法的执行--> aroundmethod="aroundMethod"pointcut-ref="perform"/> 16.字符串连接时为什么推荐使用Stringbuffer,而不是使用String+String,请简述原因? StringBuffer是可以改变的字符串,而String是不可改变的。 每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,就要为该对象分配新的空间。 当要对字符串重复修改时,创建新的String对象相关的系统开销很大,就是要修改字符串而不创建新的对象,则用StringBuffer。 17.为什么在所有操作都是read的情况下,推荐用ArrayList代替Vector? 18.讲一个ASC字符串,转换为一个逆序的字符串,就是原来字符串的最后一个字符存到目标字符串的第一字符位置,以此类推。 StringBufferstr=newStringBuffer("abc"); StringBuffera=null; for(ints=str.length()-1;s>=0;s--){ a=newStringBuffer(); a.append(str.charAt(s)); System.out.print(a.toString()); } 19.注意HttpSession.getMaxInactiveInterval()方法返回的是与秒为单位的;session.setMaxInactiveInterval(intseconds)方法参数的单位也是秒 在web.xml中,配置session-timeout时其单位中有两种情况: 为单个Web应用配置超时时间可以在web.xml中使用 这个时候的“15”单位是分钟! 如果在配置Servlet是指定初始化参数决定超时时间,例如下: 这时候的“600”单位是秒钟! 20.编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。 publicstaticStringidgui(Strings,intnum)throwsException{ intchangdu=s.getBytes("UTF-8").length; if(changdu>num){ s=s.substring(0,s.length()-1); s=idgui(s,num); } returns; } 21.xml文档解析技术有哪些? SAX生成和解析XML文档,SAX是基于事件流的解析。 DOM生成和解析XML文档。 DOM是基于XML文档树结构的解析。 22.Ajax框架有哪些? 23.java页面传递对象的方法有哪些? 可以使用request session application 内置作用域对象传递 使用json数据格式传递 24.HTML中window.onload和document.ready的区别? 在Jquery里面,我们可以看到两种写法: $(function(){})和$(document).ready(function(){}) 这两个方法的效果都是一样的,都是在dom文档树加载完之后执行一个函数(注意,这里面的文档树加载完不代表全部文件加载完)。 而window.onload是在dom文档树加载完和所有文件加载完之后执行一个函数。 也就是说$(document).ready要比window.onload先执行。 25.指出运行结果 publicclassA{ static{ System.out.println("1"); } publicA(){ System.out.println("2"); } } publicclassBextendsA{ static{ System.out.println("a"); } publicB(){ System.out.println("b"); } } publicclassTestAB{ publicstaticvoidmain(String[]args){ Aab=newB();输出什么: 1a2b ab=newB();输出什么: 2b } } 26.某人去买了29瓶饮料,其中3个瓶盖有可以换一瓶饮料,请用一段程序用于计算出总共可以喝多少瓶饮料。 27.描述tcp/ip原理? 28.JavaSocket通信中TCP和UDP的区别,并写出Java的实现方式? TCP(TranferControlProtocol)的缩写,是一种面向连接的保证传输的协议,在传输数据流前,双方会先建立一条虚拟的通信道。 可以很少差错传输数据。 UDP(UserDataGramProtocol)的缩写,是一种无连接的协议,使用UDP传输数据时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,在网络上以任何可能的路径传到目的地,因此,能否到达目的地,以及到达目的地的时间和内容的完整性都不能保证。 所以TCP必UDP多了建立连接的时间。 相对UDP而言,TCP具有更高的安全性和可靠性。 TCP协议传输的大小不限制,一旦连接被建立,双方可以按照一定的格式传输大量的数据,而UDP是一个不可靠的协议,大小有限制,每次不能超过64K 29.Java装箱和拆箱的理解? 装箱: 把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。 int包装成Integer、float包装成Float 拆箱: 和装箱相反,将引用类型的对象简化成值类型的数据 数据库 1.现有两张表:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 个人 总结 试题 Seven