里面的题目全是我亲身经历的,希望能给大家带来一点点方便,还有些还没有找到理想的答案,如果你知道,请你写出你的答案,给出了答案的如果你有更好的答案,欢迎一起交流:
1. ArrlyList、LinkedList的内在是如何实现的。
2. Servlet中有哪些类型。
3. filter是类还是接口。
4. 如果项目中只用到Spring框架,如何使用?
使用Spring中的mvc进行分层跟struts的mvc一样
5. 如何手工发布项目(没有MyEclispe等工具)。
先使用ant工具把java源文件编译成.class文件()然后使用.jar工具打成jar包放到web-inf目录下
6. Jsp标签有哪些?
jsp标签库是一套产生基于XML脚本的方法,由javaBeans来支持,
常用的标签库有:include、forword、page、
7. 数据源有哪些?
数据源是一个存储定义,记录:(比如数据库、文档、表格等等)
8. 如何理解数据库表设计的时候字段冗余。
冗余的字段是在数据库中没有实际意义的字段,只是为了方便查询而添加的一个字段,一般出现 在多表联合查询中:例如article表有以下冗余字段
fromUserName,toUserName
如何管理这两个字段呢?通过建立一个表,表结构如下id,objTable,objName,sourceTable, sourceId,level,isUpdate其中objTable=目标表 ,objName= 目标字段,sourceTable=源表,sourceId=源表ID,level=是否需要立即更新,isUpdate=是否已更新其中,level字段很有必要,有些 冗余字段并不需要在源表修改后立即更新,那么可以通过一个定期更新策略来更新。通过库表的管理,配合一个合理的存储过程,冗余字段的 使用将不再是难题。举例,如果上面两个字段发生变化,则使用触发器或者调用这个存储过程来检查是否有需要立即更新的冗余字段,需要则 立即更新,不需要则isUpdate置0,等到周期性的策略来更新同时isUpdate=1。
9. Struts和Struts2的区别?
1.Action 类:
? Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。
? Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用 的接口。Action接口不是必须的,任何 有execute标识的POJO对象都可以用作Struts2的Action对象。
2.线程模式:
? Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且 要在开发时特别小心。Action资源必须是线程安全的或同步的。
? Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上, servlet容器给每个请求产生许多可丢弃的对象,并且不会导 致性能和垃圾回收问题)
3.Servlet 依赖:
? Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和HttpServletResponse 被传递给execute方法。
? Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他 的元素减少或者消除了直接访问 HttpServetRequest 和 HttpServletResponse的必要性。
4.可测性:
? 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)
? Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
5.捕获输入:
? Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕 获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余 的javabean)。
? Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通 过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了 taglib对POJO输入对象的引用。
6.表达式语言:
? Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
? Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--”Object Graph Notation Language” (OGNL).
7.绑定值到页面(view):
? Struts 1使用标准JSP机制把对象绑定到页面中来访问。
? Struts 2 使用 “ValueStack”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但 类型不同的属性重用页面(view)。
8.类型转换:
? Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置 的。
? Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。
9.校验:
? Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子 对象。
? Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
10.Action执行的控制:
? Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
? Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
10. MVC是如何体现在Struts里面的?
1.Model:通常Action类中主要处理控制功能尽量不包括业务逻辑、而是把业务逻辑的处理委托给其他组件处理javabean
2.view:Struts的视图组件可以包括:html页面,数据传输对象,ActionFrom,Jsp页面,自定义标记,Struts提供的标记库可以快速建立jsp页面、 ActionFrom可以收集表单数据、并将此数据传递给Action然后传递给业务层
3.在Struts中各种不同的组件完成控制器的功能ActionServlet,Action
11. 数据结构里面有哪些算法?
冒泡排序
选择排序
插入排序
快速排序
合并排序
Shell排序
堆排序
12. JVM有哪些参数,分别如何设置?
1、-Xmixed mixed mode execution (default)
混合模式执行
2、-Xint interpreted mode execution only
解释模式执行
3、-Xbootclasspath:<directories and zip/jar files separated by ;>
set search path for bootstrap classes and resources
设置zip/jar资源或者类(.class文件)存放目录路径
3、-Xbootclasspath/a:<directories and zip/jar files separated by ;>
append to end of bootstrap class path
追加zip/jar资源或者类(.class文件)存放目录路径
4、-Xbootclasspath/p:<directories and zip/jar files separated by ;>
prepend in front of bootstrap class path
预先加载zip/jar资源或者类(.class文件)存放目录路径
5、-Xnoclassgc disable class garbage collection
关闭类垃圾回收功能
6、-Xincgc enable incremental garbage collection
开启类的垃圾回收功能
7、-Xloggc:<file> log GC status to a file with time stamps
记录垃圾回日志到一个文件。
8、-Xbatch disable background compilation
关闭后台编译
9、-Xms<size> set initial Java heap size
设置JVM初始化堆内存大小
10、-Xmx<size> set maximum Java heap size
设置JVM最大的堆内存大小
11、-Xss<size> set java thread stack size
设置JVM栈内存大小
12、-Xprof output cpu profiling data
输入CPU概要表数据
13、-Xfuture enable strictest checks, anticipating future default
执行严格的代码检查,预测可能出现的情况
14、-Xrs reduce use of OS signals by Java/VM (see documentation)
通过JVM还原操作系统信号
15、-Xcheck:jni perform additional checks for JNI functions
对JNI函数执行检查
16、-Xshare:off do not attempt to use shared class data
尽可能不去使用共享类的数据
17、-Xshare:auto use shared class data if possible (default)
尽可能的使用共享类的数据
18、-Xshare:on require using shared class data, otherwise fail.
尽可能的使用共享类的数据,否则运行失败
13. static修饰的对象放在哪里?
static修饰的对象放在堆内存里
java把内存分为栈内存和堆内存,栈内存用来存放一些基本类型的变量和数组及对象的引用变量,而堆内存主要是来放置对象的。
用static的修饰的变量和方法,实际上是指定了这些变量和方法在内存中的“固定位置”-staticstorage。既然要有“固定位置”那么他们的“大小” 似乎就是固定的了,有了固定位置和固定大小的特征了,在栈中或堆中开辟空间那就是非常的方便了。如果静态的变量或方法在不出其作用域的情况下 ,其引用句柄是不会发生改变的。
14. 谈谈堆和栈
栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码 来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存 放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着 处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a 值的改变不会影响到b的值。
要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利 于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
String是一个特殊的包装类数据。可以用:
String str = new String(“abc”);
String str = “abc”;
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放”abc”,如果没有,则将”abc”存放进栈,并令str指向”abc”, 如果已经有”abc” 则直接令str指向“abc”。
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
String str1 = “abc”;
String str2 = “abc”;
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。
String str1 =new String (“abc”);
String str2 =new String (“abc”);
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运 行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String(“abc”);的代码,则一概在堆中创建 新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另一方面, 要注意: 我们在使用诸如String str = “abc”;的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没 有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。
由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
15. 你了解的集合类有哪些?分别有哪些实现类?
集合类有:list map set等
它们的实现类分别有:
list: LinkedList、vector、ArrayList
map: Hashmap、Hashtable、LinkedHashMap
Set: Hashset、LinkedHashSet、TreeSet
16. 谈谈你了解的Web开发框架,它们有何区别?
Struts Spring Hibernate ibatis
Struts
Struts只是一个MVC框架(Framework),用于快速开发Java Web应用。Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我 们定制的Action,也为V(View)提供了一系列定制标签(Custom Tag)。但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业 逻辑。
Spring
Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供 了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展 ApplicationContext更加方便我们实现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与 其他流行的Web框架进行集成。
就是说可将两者一起使用,达到将两者自身的特点进行互补。
Hibernate
Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑如 何把它们从神秘的数据库表中取出(或放回到数据库表中)。它解放了您,使您可以专注于应用程序的对象和功能,而不必担心如何保存它们或稍后如何 找到它们。
hibernate 它是全封闭式的,对数据库的操作提供了完整封装,所有的SQL都是自动生成和执行,开发人员不需要再关注底层的建设,甚至不需要开发人员对 SQL的熟练掌握,所有操作都是java对象,而更注重业务逻辑,开发人员只需定义好POJO与数据库的映射(*.hbm.xml),在对数据操作时只需调用hibernate 提供的方法完成数据层的操作,hibernate/OJB 会根据制定的存储逻辑,自动生成相应的SQL并调用JDBC接口完成执行
ibatis 它是半封闭式的,何为半封闭式,这相对hibernate 对比,ibatis的着力点则在于POJO与SQL之间的映射关系,所有的SQL都需要开发人员在映射文件 编写,通过这个映射文件的配置,将SQL所需要的参数传入进去和返回的结果字段映射到指定的POJO,而且ibatis最好的一个亮点在于可以操作存储过程。
iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比Hibernate要大很多 。类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。以数据库字段一一对应映射得 到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化的,不像Hibernate映射的 PO是可以表达立体的对象继承, 聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。Hibernate现在已经是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版 本的开发速度都要强于iBATIS
17. java实现线程的方法有哪些?
java实现线程的方法有两种:第一是implements Runnable接口实现它的run()方法,第二种是extends Thread类,覆盖它的run()方法
这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runnable接口了,因为Java只允许单继承的。
启动一个线程你只需要调用start()方法,针对两种实现线程的方法也有两种启动线程的方法,分别如下:
DoSomething doIt = new DoSomething();
Thread myThread = new Thread( doIt );
myThread.start();
DoAnotherThing doIt = new DoAnotherThing();
doIt.start();
18. page、request、session、application的关系与区别
都是Servlet API接口的实现
application 代表了web应用本身,是ServletContext的实例
page 代表了页面本身 也是servlet中的this
request 是HttpServletRequest的实例 该对象封装了一次请求,客户端的请求参数都被封装在里面
session 是HttpSession的实例 该对象代表一次会话、当浏览器与站点建立连接时会话开始,当浏览器关闭的时候会话结束
19. Exception和RunException的区别?
runtimeException 是运行时异常,不需要程序员主动解决,Exception是非运行时异常,需要程序员在写代码时尽量避免, nullpointException,indexOutboundsException就是runtimeException,而IOException,SQLException就是Exception,runtimeException编写代码的时 候不必处理就可以通过编译,而Exception必须处理,否则通不过编译
20. sleep()和wait()两方法有什么区别?
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会 给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放 对象锁。
wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进 入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或 notifyAll) 后本线程才进入对象锁定池准备获得对象锁进入运行状态。
21. notify和notifyAll两方法有什么区别?
使用wait方法和使用synchornized来分配cpu时间是有本质区别的。wait会释放锁,synchornized不释放锁。(wait/notify/notifyAll)只能在取得对 象锁的时候才能调用。
调用notifyAll通知所有线程继续执行,只能有一个线程在执行其余的线程在等待(因为在所有线程被唤醒的时候在synchornized块中)。这时的等待和调 用notifyAll前的等待是不一样的。
notifyAll前:在对象上休息区内休息
notifyAll后:在排队等待获得对象锁。
notify和notifyAll都是把某个对象上休息区内的线程唤醒,notify只能唤醒一个,但究竟是哪一个不能确定,而notifyAll则唤醒这个对象上的休息室中所 有的线程.
一般有为了安全性,我们在绝对多数时候应该使用notifiAll(),除非你明确知道只唤醒其中的一个线程.
22. 写一个单例方法
public class SingletonTest {
private static SingletonTest instance;
private SingletonTest() {
}
public static SingletonTest getInstance() {
if (instance == null) {
instance = new SingletonTest();
}
return instance;
}
}
23. Swing编程:实现点击一个按钮弹出一个提示窗口
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;
public class swingTest extends Frame implements ActionListener{
swingTest (String s){
super(s);
Button button=new Button(“点击我吧”);
button.addActionListener(this);
add(button);
setBounds(60,60,300,300);
button.setSize(10, 10);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowCloseing(swingTest e){
System.exit(0);
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(this,”你点击我了”, “消息对话框”,JOptionPane.WARNING_MESSAGE);
}
public static void main(String args[]){
new swingTest(“测试点击按钮”);
}
}