int pivotloc=Partition(array,low,high);
QSort(array,low,pivotloc-1);
QSort(array,pivotloc+1,high);
}
}
void QuickSort(int array[]){
QSort(array,0,array.length-1);
}
public static void main(String args[]){
int array[]={49,38,65,97,76,13,27,49};
Sort sort=new Sort();
sort.output(array);
sort.BubbleSort(array);
System.out.println();
array=new int[]{49,38,65,97,76,13,27,49};
sort.output(array);
sort.InsertSort(array);
sort.InsertSort(array);System.out.println();
array=new int[]{49,38,65,97,76,13,27,49};
sort.output(array);
sort.QuickSort(array);
}
}
如在COLLECTION框架中,实现比较要实现什么样的接口?
Collection框架中实现比较要实现Comparable 接口和 Comparator 接口
什么是线程?
线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程被称为轻负荷进程(light-weight process)。一个进程中可以包含多个线程。
一个线程是一个程序内部的顺序控制流。
1. 进程:每个进程都有独立的代码和数据空间(进程上下文) ,进程切换的开销大。
2. 线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
3. 多进程:在操作系统中,能同时运行多个任务程序。
4. 多线程:在同一应用程序中,有多个顺序流同时执行。
(进程上下文) ,进程切换的开销大。
2. 线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
3. 多进程:在操作系统中,能同时运行多个任务程序。
4. 多线程:在同一应用程序中,有多个顺序流同时执行。同步和异步有和异同,在什么情况下分别使用他们?
临界资源问题
线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,而不需要外部的资源或方法,也不必关心其它线程的状态或行为。但是经常有一些同时运行的线程需要共享数据,此时就需考虑其他线程的状态和行为,否则就不能保证程序的运行结果的正确性。
我们需要做的是允许一个线程彻底完成其任务后,再允许下一个线程执行。必须保证一个共享的资源一次只能被一个线程使用。实现此目的的过程称为同步。
同步是用于确保资源一次只能被一个线程使用的过程。
同步对于单线程程序没有任何好处。使用同步比非同步的性能差三到四倍。
临界资源问题
线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,而不需要外部的资源或方法,也不必关心其它线程的状态或行为。但是经常有一些同时运行的线程需要共享数据,此时就需考虑其他线程的状态和行为,否则就不能保证程序的运行结果的正确性。
我们需要做的是允许一个线程彻底完成其任务后,再允许下一个线程执行。必须保证一个共享的资源一次只能被一个线程使用。实现此目的的过程称为同步。
同步是用于确保资源一次只能被一个线程使用的过程。
同步对于单线程程序没有任何好处。使用同步比非同步的性能差三到四倍。线程方法介绍:
构造函数:
Thread()
Thread(Runable target)
Thread(Runable target,String name)
Thread(ThreadGroup group,Runable target)
Thread(ThreadGroup group,Runable target,String name)
Thread(ThreadGroup group,String name)
用于完成一个线程“实际功能”的代码放在run方法中。Run方法可以在Thread的子类中重写,也可以在Runable对象中重写。一旦线程死去,它就永远不能再重新启动,否则会抛出异常。用start方法启动一个已经启动的线程也会抛出异常。isAlive、interrupt、Thread.currentThread、suspend、resume、stopSleep方法可以使低优先级的线程得到执行的机会,Yield方法只能使同优先级的线程有执行的机会。Join方法能够使调用该方法的线程在此之前执行完毕,在该方法之后,调用join方法的线程不会产生输出了,Wait与notify使用时,需要注意的事项?
它们只能用于synchronized同步块中;
它们需要配对使用;
Wait一般出现在一个while循环中,while语句使用一个boolean标志控制。
死锁
当被锁定的A对象试图访问另一个被锁定的B对象,B对象同时又要访问已被锁定的A对象。这样导致两个线程都在等待另一个线程释放资源,这样就出现了死锁。
STRING与STRINGBUFFER的区别。
答:STRING的长度是不可变的,STRINGBUFFER的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
JDBC调用数据库的基本步骤WEBLOGIC SERVER中的JDBC配置
1、建立到指定数据库的连接池Connection Pool
2、建立基于该连接池的数据源DataSource
3、访问数据库时通过数据源的JNDI名字查找到该数据源,然后通过数据源获得数据库连接对象。得到该对象后就可以依次生成数据库语句对象和结果集对象,进行相应的数据库操作。WEBLOGIC SERVER中的JDBC配置
1、建立到指定数据库的连接池Connection Pool
2、建立基于该连接池的数据源DataSource
3、访问数据库时通过数据源的JNDI名字查找到该数据源,然后通过数据源获得数据库连接对象。得到该对象后就可以依次生成数据库语句对象和结果集对象,进行相应的数据库操作。import java.sql.*;
import javax.naming.*;
import javax.sql.*;
import java.util.*;
import javax.rmi.*;java.sql.*;
import javax.naming.*;
import javax.sql.*;
importjava.util.*;
importjavax.rmi.*;public class DataSourceTest{
private static Context getInitialContext() throws Exception{
Properties properties=null;
try{
properties=new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
properties.put(Context.PROVIDER_URL,url);
if(user!=null){
properties.put(Context.SECURITY_PRINCIPAL,user);
properties.put(Context.SECURITY_CREDENTIALS,
}
return new InitialContext(properties);
}catch(Exception e){
throw e;
}
}
public static void main(String args[]){
UserTransaction tx=null;
DataSource ds=null;
Context ctx=null;
Connection myConn=null;
try{
ctx=getInitialContext();
tx.begin();
}catch(Exception e){
e.printStackTrace();
}
Statement myStatement=null;
ResultSet myResultSet=null;
try{
myConn=ds.getConnection();
myStatement=myConn.createStatement();
myResultSet=myStatement.executeQuery(
while(myResultSet.next()){
}
tx.commit();
}catch(Exception e){
try{
tx.rollback();
}catch(Exception e){
}
}finally{
myStatement.close();
myConn.close();
}
}
}
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import java.io.*;public class Student{
public static void main(String args[]){
Document doc;
Element students;
Element stud;
Element fName;
Element sName;
try{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
doc=db.newDocument();
stud.appendChild(fName);
students.appendChild(stud);
doc.appendChild(students);TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
transformer.transform(new DOMSource(doc),new StreamResult(System.out));
}catch(Exception e){
e.printStackTrace();
}
}
}
使用DOM API显示现有XML文档内容
使用DOM API将XML文档数据插入数据库使用DOM API根据数据库创建XML文档Java的国际化
国际化是为了将应用程序发布在多个地区(locale)而进行准备的过程。不同地区标识了各个特定的国家在信息表现上所广泛使用的语言、流通货币、字符集、日期格式及其他要素。
支持国际化的应用程序具有以下特点:
1、不用改变代码就可以支持另外的语言。
2、文本元素、消息和图片保存在源代码之外。
3、将于文化背景有关的数据,比如日期和时间、十进制数值以及流通货币,根据用户所用的语言和所在地理位置进行正确格式化。
4、支持非标准字符集。
5、应用程序可以快速适应新的语言区域。
为了使一个应用程序国际化,:
1、必须将用户所见到的硬编码字符(如标签、工具提示和错误信息等)替换成包含在资源包ResourceBundle中的字符。它是一个java属性文件,它将关键字映射为字符值。并且可以使用多个不同语言版本的ResourceBundle,这样将可以对于不同语言提供不同的字符串。
2、使用Locale对象,可以使数据格式化为与地区相关的数据。
3、国际化的应用程序还必须使用统一的字符编码标准字符集。
ResourceBundle中的字符。它是一个java属性文件,它将关键字映射为字符值。并且可以使用多个不同语言版本的ResourceBundle,这样将可以对于不同语言提供不同的字符串。
2、使用Locale对象,可以使数据格式化为与地区相关的数据。
3、国际化的应用程序还必须使用统一的字符编码标准字符集。应用服务器有那些?Servlet方面
什么是Servlet?
Servlet是J2EE应用框架中部署于Web层的Web组件,运行在支持Servlet的Web服务器或应用服务器上。Servlet为客户端和服务器端的信息处理提供了一种“请求/响应”机制。
客户程序将请求发送到服务器;服务器将请求发送到Servlet;依据客户程序的请求,Servlet动态地构造回答信息并返回给服务器;服务器将回答返回给客户程序。
什么是JSP?
JSP是J2EE应用框架中部署于Web层的Web组件,是对Servlet技术的扩展。它使在静态的页面中加入动态的内容变得非常容易。并且通过使用标签库可以大大节省开发时间;将JavaBean与JSP一起使用可以将数据表示和程序实现分离。
在MVC架构模式中:
使用Servlet作为控制器,而JSP作为数据视图。
CGI与Servlet的区别?
CGI(公共网关接口)是一项标准,使WEB服务器可以与外部应用程序交互。但是该技术存在一些严重的限制:
1、CGI应用程序占用资源很多。当系统要处理来自一个用户的请求时,就会创建一个新的进程来处理该请求,一旦CGI脚本停止执行,系统就必须收回该进程。这种重量级进程的经常启动和停止非常低效。
2、CGI很难链接于请求进程的其他阶段,因为在WEB服务器上它们运行于不同的进程。这就很难处理授权、工作流和日志记录工作。
Java Servlet技术提供了一个基于组件、与平台无关的方法来构建WEB应用程序。Servlet没有标准CGI应用程序所遇到的性能局限。
Servlet比CGI更高效是因为:
Servlet应用中将只创建一个单一个重量级进程,并对每个用户请求使用更轻量级的线程来完成请求处理,并且这些线程是由JVM自动维护。每个客户端请求对应一个线程,每个Servlet类在Servlet容器中只存在一个唯一的对象(实例)。Servlet类首次加载后将常驻内存。
常驻内存。1、说一说Servlet的生命周期?
答:在第一次请求Servlet时将创建Servlet实例,容器调用实例的init方法,如果容器有请求要传送给servlet,它就会调用servlet实例的Service方法。一个请求将作为一个线程。如果服务器要销毁servlet实例就会调用servlet实例的destory方法,否则该实例将会常驻内存。
JAVA SERVLET API中forward() 与redirect()的区别?
使用重定向:当调用sendRedirect方法时,Web容器就会向浏览器返回响应,指示需要新的URL。因为浏览器发出了完全崭新的请求,所以在重定向之前存储为请求属性的任何对象都会消失。
使用转发:当为一个请求调用转发时,请求就发送给服务器上另一个资源,而无需通知客户机由不同的资源处理请求。这个过程完全在Web容器内部进行,客户机绝不知晓。与重定向不同,转发过程中,对象可以存储在请求中,并发送给下一个资源使用。
因为转发过程完全在服务器上进行,与客户机没用通信,因此转发的性能优于重定向。
但是如果在JSP页面上使用图形的相对路径和其他资源,转发机制就会带来问题。因为浏览器无从得知发生了转发,所以相对路径只是相对初始的Servlet,而不是所转发到的JSP页面。使用JSP自定义标签可以解决这个问题。
如何现实servlet的单线程模式servlet的配置4、Servlet的基本架构
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
}
HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
}JSP中动态INCLUDE与静态include的区别?
答:动态INCLUDE用jsp:include动作实现
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
可能会让你写一段Jdbc连Oracle的程序,并实现数据查询.
答:程序如下:
package hello.ant;
import java.sql.*;
public class jdbc {
Connection c=null;
Statement conn;
ResultSet rs=null;
public jdbc() {
try{
c = DriverManager.getConnection(dbUrl,theUser,thePw);
conn=c.createStatement();
}catch(Exception e){
e.printStackTrace();
}
}
public boolean executeUpdate(String sql) {
try {
conn.executeUpdate(sql);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public ResultSet executeQuery(String sql) {
rs=null;
try {
rs=conn.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public void close(){
try {
conn.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ResultSet rs;
jdbc conn = new jdbc();
try{
while (rs.next()) {
}
}catch(Exception e) {
e.printStackTrace();
}
}
}动态INCLUDE与静态include的区别?
答:动态INCLUDE用jsp:include动作实现
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
可能会让你写一段Jdbc连Oracle的程序,并实现数据查询.
答:程序如下:
package hello.ant;
import java.sql.*;
public class jdbc {
Connection c=null;
Statement conn;
ResultSet rs=null;
public jdbc() {
try{
c = DriverManager.getConnection(dbUrl,theUser,thePw);
conn=c.createStatement();
}catch(Exception e){
e.printStackTrace();
}
}
public boolean executeUpdate(String sql) {
try {
conn.executeUpdate(sql);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public ResultSet executeQuery(String sql) {
rs=null;
try {
rs=conn.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public void close(){
try {
conn.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ResultSet rs;
jdbc conn = new jdbc();
try{
while (rs.next()) {
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
说出在JSP页面里是怎么分页的?
页面需要保存以下参数:
总行数:根据sql语句得到总行数
每页显示行数:设定值
当前页数:请求参数
页面根据当前页数和每页行数计算出当前页第一行行数,定位结果集到此行,对结果集取出每页显示行数的行即可。
说出在JSP页面里是怎么分页的?
页面需要保存以下参数:
总行数:根据sql语句得到总行数
每页显示行数:设定值
当前页数:请求参数
页面根据当前页数和每页行数计算出当前页第一行行数,定位结果集到此行,对结果集取出每页显示行数的行即可。
设计模式方面
1、开发中都用到了那些设计模式?用在什么场合?
答:人们在自己的环境中不断发现问题和寻找问题的解决方案的时候,发现有一些问题及其解决方案不断变换面孔重复出现,但在这些不同的面孔后面有着共同的本质,这些共同的本质就是模式。设计模式就是用来描述解决这些问题的解决方案的核心的。
工厂模式
专门负责将大量有共同接口的类实例化。工厂模式可以动态确定将那一个类实例化,不必事先知道每次要实例化那一个类。
简单工厂模式
或称静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式就是由一个工厂类根据传入的参数决定创建那一种产品类的实例。
简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色:l工厂类角色:含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象。l抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。l具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例。
优点是:允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端。缺点是:如果有新的产品加入到系统中去,就需要修改工厂类,将必要的逻辑加入到工厂类中。
工厂方法模式
或称多态性工厂模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。它仅负责给出具体工厂子类必须实现的接口。这样可以用来允许系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式涉及到的角色:l抽象工厂角色:它不包含应用逻辑。任何在模式中创建对象的工厂类必须实现这个接口。l具体工厂角色:含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。l抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。l具体产品角色:这个角色实现了抽象产品角色所声明的接口。
单例模式
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
特点:单例类只能有一个实例;单例类必须自己创建自己的惟一的实例;单例类必须给所有其他对象提供这一实例。
多例模式
多例类可以有多个实例,并且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。
在系统中可以用于数据库连接池、键值缓存等。
代理模式
给某个对象提供一个代理对象,并由代理对象控制对原对象的引用。
代理模式所涉及的角色:抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题角色。简单工厂模式
或称静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式就是由一个工厂类根据传入的参数决定创建那一种产品类的实例。
简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色:l工厂类角色:含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象。l抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。l具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例。
优点是:允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端。缺点是:如果有新的产品加入到系统中去,就需要修改工厂类,将必要的逻辑加入到工厂类中。
工厂方法模式
或称多态性工厂模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。它仅负责给出具体工厂子类必须实现的接口。这样可以用来允许系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式涉及到的角色:l抽象工厂角色:它不包含应用逻辑。任何在模式中创建对象的工厂类必须实现这个接口。l具体工厂角色:含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。l抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。l具体产品角色:这个角色实现了抽象产品角色所声明的接口。
单例模式
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
特点:单例类只能有一个实例;单例类必须自己创建自己的惟一的实例;单例类必须给所有其他对象提供这一实例。
多例模式
多例类可以有多个实例,并且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。
在系统中可以用于数据库连接池、键值缓存等。
代理模式
给某个对象提供一个代理对象,并由代理对象控制对原对象的引用。
代理模式所涉及的角色:抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题角色。