为了找到一份好的java工作,网上找来一份java面试题,对自己掌握的知识进行查缺补漏
2015-8-20 begin
1.编写程序,完成文件复制功能
public static void copyFile(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!destFile.exists()){ throw new IllegalArgumentException(destFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); byte[] buf = new byte[8 * 1024]; int bytes = 0; while((bytes = in.read(buf , 0 , buf.length))!= -1){ out.write(buf,0,bytes); out.flush(); } out.close(); in.close(); } /* * 文件 */ public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!destFile.exists()){ throw new IllegalArgumentException(destFile+"不是文件"); } BufferedInputStream bis = new BufferedInputStream( new FileInputStream(srcFile)); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(destFile)); int b; while((b = bis.read())!=-1){ bos.write(b); bos.flush(); } bis.close(); bos.close(); } /* * 单字节,不带缓冲进行文件拷贝 */ public static void copyFileByByte(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!destFile.exists()){ throw new IllegalArgumentException(destFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); int b; while((b = in.read()) != -1){ out.write(b); out.flush(); } in.close(); out.close(); }
2.Servlet创建过程及生命周期Servlet 在容器中运行时,其实例的创建及销毁等是由容器进行控制。
创建方法有两种:
1.客户端请求对应的servlet,创建servlet
2.根据web.xml中设置,创建。
1.创建servlet实例。
2.调用init方法对servlet初始化
3.根据客户端http请求,调用doxxx()方法
4.调用servlet的destory()方法销毁
3用sql语句分页:
select Top 页大小 from 表名 where id NOT IN ( select Top 页大小 *(页数) from 表名 order by id ) order by id
hibernate实现分页更加方便
queryObject.setFirstResult((pageNo - 1) *pageSize); queryObject.setMaxResult(pageSize);
4.list.map.set的存储特点?
list是有特定顺序的排列,可以有重复数值
set是无序的,不可以有重复数值
map储存方式为key-value方式
网上的答案:
List 以特定次序来持有元素,可有重复元素.
Set 无法拥有重复元素,内部排序.
Map 保存key-value值,value可多值
有关于储存结构的另外问题:
1.arraylist和vector的区别?
同步性:arrayList线程是不安全的,不同步的,vector是线程是安全的,但是不同步。
数据增长:当数据增长时,vector按默认增长的一倍,而arrayList是原来的一半。
2.说出ArrayList,Vector, LinkedList的存储性能和特性?
网上答案[暂未不理解]
ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦 LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始
ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢.
Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.
LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快.
知识补充:
(1)什么是同步?
资料:http://blog.csdn.net/treeroot/article/details/254008
(2)为什么arraylist不同步?
ArrayList中:
public boolean add(Object o) {
...
}
vector中:
public synchronized void addElement(Object obj){
...
}
synchronized意思简单说就是
lock();
add();
unlock();
(3)为什么要同步?
为了防止多个线程对同一数据的修改,所以需要同步,否则会造成数据不一致。Java提供了非常方便的多线程支持,所以说同步问题比较普遍,尤其是Servlet和
JSP的线程安全问题特别明显。
(4)arrayList跟linkedList插入删除元素?
ArrayList底层的实现是数组,所以用下标访问的速度比较快,但是插入和删除元素,会有移动元素的开销,所以速度比LinkedList差。LikedList底层是链表实现的,所以插入和删除元素时间复杂度较LinkedList好,但是随即访问需要遍历元素,所以效率比ArrayList差。
5.final,finally,finaliz的区别
网上答案:
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声 明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改 被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常 ,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 ;finalize() 方法以整理系统资源或者执行其他清理工作 finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
----2015-8-20--end
----2015-8-21-begin
1.HASHMAP,HASHTABLE区别
HashMap是Map接口的实现类,在缺省的情况下是非同步的
Hashtable是dictionary的子类,是同步的
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。【这句话理解起来有点怪怪的】
详细说明:第一点:Hashtable是基于陈旧的dictionary类的,而HashMap是java 1.2引进的Map接口的一个实现,
即HashMap去掉了Hashtable的一些方法,如:contains方法,相应的加上了containsValue()和containsKey()方法。
第二点:Mashtable是同步的,而HashMap的方法不是。也就是说你必须腰围HashMap提供一个同步,一个方便的方式就是利用Contional类的静态的synchronizedMap()方法,他创建一个线程安全的Map对象,并把他作为一个封装的对象来返回。
第三点:HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。
具体HashMap的实现原理:http://blog.csdn.net/vking_wang/article/details/14166593
2.描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.当 Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择
Cookie 用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性
session工作原理
(1)当有Session启动时,服务器生成一个唯一值,称为Session ID(好像是通过取进程ID的方式取得的)。
(2)然后,服务器开辟一块内存,对应于该Session ID。
(3)服务器再将该Session ID写入浏览器的cookie。
(4)服务器内有一进程,监视所有Session的活动状况,如果有Session超时或是主动关闭,服务器就释放改内存块。
(5)当浏览器连入IIS时并请求的ASP内用到Session时,IIS就读浏览器Cookie中的Session ID。
(6)然后,服务检查该Session ID所对应的内存是否有效。
(7)如果有效,就读出内存中的值。
(8)如果无效,就建立新的Session。
3.String和stringbuffer进行字符串连接时的区别?
String对项内容是不可改变,StringBuffer是可以改变的,且高效;具体可以查看:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html
4.J2EE J是什么意思? 2是什么意思 EE是什么意思? Struts的拦截器你是怎么做的,是独立开发的,能够独立开发的到。然后问有哪几种拦截? 简单介绍下java?Spring的AOP,IOC的讲述 对struts2的了解,1,2的比较 xml的了解 J2ee的webserviced的协议?
java 2 Platform,Enterprise Edition
继承AbstractInterceptor类,覆盖intercept()方法
有struts自己的拦截器 如timer ,i18n,scop,servletconfig,token
还有自定义拦截器
Spring AOP:代理机制 Spring提供的自动代理机制
Spring的IoC来实组件之间的依赖关系注入, 使控制层与业务实现分离,即客户通过
调用业务委托接口来调用具体的业务组件的实例,避免控制层与业务层的藕合带来的维护
或升级困难。由Spring为DAO生成代理对象来为DAO添加事务服务,由IoC容器DAO的代理实例注入到业务组件中,业务组件
5.Collections,collection的区别
Collection是个java.util下的接口,它是各种集合结构的父接口。Collections是个java.util下的普通类,它包含有各种有关集合操作的静态方法。
----2015-8-21 end