Java 面试 宝典 (2)

  
 
JAVA 华为面试题
JAVA 方面
1 面向对象的特征有哪些方面   
2 String 是最基本的数据类型吗 ?
3 int Integer 有什么区别
4 String StringBuffer 的区别
5 运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。 java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
6 说出一些常用的类,包 , 接口,请各举 5
7 说出 ArrayList,Vector, LinkedList 的存储性能和特性
ArrayList Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢, Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
8 设计 4 个线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 。写出程序。
以下程序使用内部类实现线程,对 j 增减的时候没有考虑顺序问题。
public class ThreadTest1{
         private int j;
         public static void main(String args[]){
                  ThreadTest1 tt=new ThreadTest1();
                   Inc inc=tt.new Inc();
                   Dec dec=tt.new Dec();
                   for(int i=0;i<2;i++){
                            Thread t=new Thread(inc);
                            t.start();
                            t=new Thread(dec);
                            t.start();
                   }
         }
         private synchronized void inc(){
                   j++;
                  System.out.println(Thread.currentThread().getName()+"-inc:"+j);
         }
         private synchronized void dec(){
                   j--;
                  System.out.println(Thread.currentThread().getName()+"-dec:"+j);
         }
 
         class Inc implements Runnable{
                   public void run(){
                            for(int i=0;i<100;i++){
                                     inc();
                            }
                   }
         }
         class Dec implements Runnable{
                   public void run(){
                            for(int i=0;i<100;i++){
                                     dec();
                            }
                   }
         }
}
9    JSP 的内置对象及方法。
request request 表示 HttpServletRequest 对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取 cookie, header, session 数据的有用的方法。
response response
表示 HttpServletResponse 对象,并提供了几个用于设置送回 浏览器的响应的方法(如 cookies, 头信息等)
out out
对象是 javax.jsp.JspWriter 的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext pageContext
表示一个 javax.servlet.jsp.PageContext 对象。它是用于方便存取各种范围的名字空间、 servlet 相关的对象的 API ,并且包装了通用的 servlet 相关功能的方法。
session session
表示一个请求的 javax.servlet.http.HttpSession 对象。 Session 可以存贮用户的状态信息
application applicaton
表示一个 javax.servle.ServletContext 对象。这有助于查找有关 servlet 引擎和 servlet 环境的信息
config config
表示一个 javax.servlet.ServletConfig 对象。该对象用于存取 servlet 实例的初始化参数。
page page
表示从该页面产生的一个 servlet 实例
 
10. socket 通讯写出客户端和服务器端的通讯,要求客户发送数据后能够回显相同的数据。
参见课程中 socket 通讯例子。
 
11 说出 Servlet 的生命周期,并说出 Servlet CGI 的区别。
 
Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法, service 方法自动派遣运行与请求对应的 doXXX 方法( doGet doPost )等,当服务器决定将实例销毁的时候调用其 destroy 方法。
cgi 的区别在于 servlet 处于服务器进程中,它通过多线程方式运行其 service 方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而 CGI 对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于 servlet
12.EJB 是基于哪些技术实现的 ? 并说出 SessionBean EntityBean 的区别, StatefulBean StatelessBean 的区别。
 
13 EJB 包括( SessionBean,EntityBean )说出他们的生命周期,及如何管理事务的?
参考 http://blog.iyi.cn/rimen/2005/10/ejb.html
  1.Stateful session Bean ( 有状态会话 Bean)
有状态会话Bean实例有三种状态,不存在,就绪,和钝化。
客户端调用home接口的create 方法,ejb容器实例化一个Bean并调用setSesssionContext,ejbCreate方法,使得Bean处于就绪状态。然后客户就可以使用其商业方法了。ejb容器对Bean的生命周期进行管理,一般会对最少使用的EJB进行钝化,当客户在使用这个EJB时,容器会进行激活,这个过程对客户来说是透明的。当用户调用remove方法,容器调用ejbRemove方法,ejb生命周期结束.
2.Stateless Session Bean( 无状态会话 Bean)
实例就两种状态,不存在和就绪.
客户端调用home接口的create方法,如果不存在可用的实例.ejb容器实例化一个Bean并调用setSesssionContext,ejbCreate方法.当客户调用remove方法之后,ejb容器则调用ejbRemove的方法,ejb生命周期结束.
3.Entity Bean( 实体 bean)
实体bean有三种状态,不存在,在pool中,就绪.
ejb容器创建实例时调用setEntityContext,把容器的上下文传到bean组件中.实例化之后bean会移到池中,此时ejb没有和任何的实体对象进行关联,所有的bean实例是一样,容器会指派它和具体的实体标示关联,进入就绪状态。有两种方法使得一个实体bean从池化进入到就绪状态,一是客户端使用create方法,使得ejb容器调用ejbCreate和ejbPostCreate 方法,二是容器调用ejbActivate方法,这对客户来说是透明的,只有当实体bean处于就绪状态时,才能调用其商业方法。同样如果实体bean要从就绪进行池化也有两种方法,一是客户端调用remove方法,容器调用ejbRemove;二是容器ejbPassivate方法。bmp和cmp,在bean实例从池化到就绪时,对于bmp的实体bean,容器不会自动设置primary key.因此ejbCreate and ejbActivate 需要获得这个primary key ,如果这个key非法,ejbLoad and ejbStore methods 不能同步实体变量到数据库。ejbCreate 通过参数传入,ejbActivate 通过id = (String)context.getPrimaryKey();在pool状态,这些需要持久化的实体变量则不需要,在ejbPasssivate 中把它赋值null。unsetEntityContext,
bean生命周期结束的时候,调用。
4.Message Driven Bean( 消息驱动 Bean)
消息bean就两种状态:不存在和就绪.
就像stateless session bean,容器在实例化bean的时候,调用setMessageDrivenContext,ebjCreate. 调用ejbRemove方法结束生命周期。当消息到达的时候Onmessage方法。因此可以mdb是一种jms客户端企业级组件。
事务处理
可以由容器代理来实现
容器将得到业务逻辑方法的事务处理需求
容器提供事务控制代码
也可以由程序员通过代码实现
 
14 .说出数据连接池的工作机制是什么 ?
  服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
 
15 同步和异步有和异同,在什么情况下分别使用他们?举例说明。
 
16 应用服务器有那些?
  webserver web 担供基本的 Http ,代理和系统管理服务的,应用服务器是在 webserver 之上的,面向应用的服务器 , 一般的结构需要应用服务器 +web 服务器 + 数据库服务器  
 
常见的 web 服务器有 :jws(java   web   server),apache,pws,iis  
 
常见的 appserver :websphere,weblogic,j2ee  
 
17 你所知道的集合类都有哪些?主要方法?
  参见( 1
 
18 给你一个 : 驱动程序 A, 数据源名称为 B, 用户名称为 C, 密码为 D, 数据库表为 T ,请用 JDBC 检索出表 T 的所有数据。
 
 
19 .说出在 JSP 页面里是怎么分页的 ?
页面需要保存以下参数:
总行数:根据 sql 语句得到总行数
每页显示行数:设定值
当前页数:请求参数
页面根据当前页数和每页行数计算出当前页第一行行数,定位结果集到此行,对结果集取出每页显示行数的行即可。
数据库方面:
1.           存储过程和函数的区别
存储过程是用户定义的一系列 sql 语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
2.           事务是什么?
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
3.           游标的作用?如何知道游标已经到了最后?
游标用于定位结果集的行,通过判断全局变量 @@FETCH_STATUS 可以判断是否到了最后,通常此变量不等于 0 表示出错或到了最后。
4.           触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。
语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。
中远面试题
   1 、面向对象的三个基本特征
   2 、方法重载和方法重写的概念和区别
   3 、接口和内部类、抽象类的特性
   4 、文件读写的基本类
   **5 、串行化的注意事项以及如何实现串行化
   6 、线程的基本概念、线程的基本状态以及状态之间的关系
   7 、线程的同步、如何实现线程的同步
   8 、几种常用的数据结构及内部实现原理。
   9 Socket 通信 (TCP UDP 区别及 Java 实现方式 )
  **10 Java 的事件委托机制和垃圾回收机制
  11 JDBC 调用数据库的基本步骤
  **12 、解析 XML 文件的几种方式和区别
  13 Java 四种基本权限的定义
  14 Java 的国际化
 
二、 JSP
   1 、至少要能说出 7 个隐含对象以及他们的区别
  ** 2 forward redirect 的区别
   3 JSP 的常用指令
三、 servlet
   1 、什么情况下调用 doGet() doPost()
   2 servlet init() 方法和 service() 方法的区别
   3 servlet 的生命周期
   4 、如何现实 servlet 的单线程模式
   5 servlet 的配置
   6 、四种会话跟踪技术
 
四、 EJB
   **1 EJB 容器提供的服务
         主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。
   2 EJB 的角色和三个对象
         EJB 角色主要包括 Bean 开发者 应用组装者 部署者 系统管理员 EJB 容器提供者 EJB 服务器提供者
         三个对象是 Remote Local )接口、 Home LocalHome )接口, Bean
   2 EJB 的几种类型
         会话( Session Bean ,实体( Entity Bean 消息驱动的( Message Driven Bean
         会话 Bean 又可分为有状态( Stateful )和无状态( Stateless )两种
         实体 Bean 可分为 Bean 管理的持续性( BMP )和容器管理的持续性( CMP )两种
 
   3 bean 实例的生命周期
         对于 Stateless Session Bean Entity Bean Message Driven Bean 一般存在缓冲池管理,而对于 Entity Bean Statefull Session Bean 存在 Cache 管理,通常包含创建实例,设置上下文、创建 EJB Object create )、业务方法调用、 remove 等过程,对于存在缓冲池管理的 Bean ,在 create 之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在 Cache 管理的 Bean 则通过激活和去激活机制保持 Bean 的状态并限制内存中实例数量。
   4 、激活机制
         Statefull Session Bean 为例:其 Cache 大小决定了内存中可以同时存在的 Bean 实例的数量,根据 MRU NRU 算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个 EJB 实例业务方法时,如果对应 EJB Object 发现自己没有绑定对应的 Bean 实例则从其去激活 Bean 存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的 ejbActive ejbPassivate 方法。
   5 remote 接口和 home 接口主要作用
         remote 接口定义了业务方法,用于 EJB 客户端调用业务方法
         home 接口是 EJB 工厂用于创建和移除查找 EJB 实例
   6 、客服端调用 EJB 对象的几个基本步骤
一、    设置 JNDI 服务工厂以及 JNDI 服务地址系统属性
二、    查找 Home 接口
三、    Home 接口调用 Create 方法创建 Remote 接口
四、    通过 Remote 接口调用其业务方法
五、数据库
   1 、存储过程的编写
   2 、基本的 SQL 语句
六、 weblogic
 
1    如何给 weblogic 指定大小的内存 ?
在启动 Weblogic 的脚本中(位于所在 Domian 对应服务器目录下的 startServerName ),增加 set MEM_ARGS=-Xms32m -Xmx200m ,可以调整最小内存为 32M ,最大 200M
2    如何设定的 weblogic 的热启动模式 ( 开发模式 ) 与产品发布模式 ?
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者 commenv 文件,增加 set PRODUCTION_MODE=true
3    如何启动时不需输入用户名与密码 ?
修改服务启动文件,增加 WLS_USER WLS_PW 项。也可以在 boot.properties 文件中增加加密过的用户名和密码 .
4    weblogic 管理制台中对一个应用域 ( 或者说是一个网站 ,Domain) 进行 jms ejb 或连接池等相关信息进行配置后 , 实际保存在什么文件中 ?
保存在此 Domain config.xml 文件中,它是服务器的核心配置文件。
5    说说 weblogic 中一个 Domain 的缺省目录结构 ? 比如要将一个简单的 helloWorld.jsp 放入何目录下 , 然的在浏览器上就可打入 http:// 主机 : 端口号 //helloword.jsp 就可以看到运行结果了 ? 又比如这其中用到了一个自己写的 javaBean 该如何办 ?
Domain 目录 / 服务器目录 /applications ,将应用目录放在此目录下将可以作为应用访问,如果是 Web 应用,应用目录需要满足 Web 应用目录要求, jsp 文件可以直接放在应用目录中, Javabean 需要放在应用目录的 WEB-INF 目录的 classes 目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。
6    如何查看在 weblogic 中已经发布的 EJB?
可以使用管理控制台,在它的 Deployment 中可以查看所有已发布的 EJB
7    如何在 weblogic 中进行 ssl 配置与客户端的认证配置或说说 j2ee( 标准 ) 进行 ssl 的配置
缺省安装中使用 DemoIdentity.jks 和DemoTrust.jks KeyStore 实现 SSL ,需要配置服务器使用 Enable SSL ,配置其端口,在产品模式下需要从 CA 获取私有密钥和数字证书,创建 identity trust keystore ,装载获得的密钥和数字证书。可以配置此 SSL 连接是单向还是双向的。
   8 、在 weblogic 中发布 ejb 需涉及到哪些配置文件
不同类型的 EJB 涉及的配置文件不同,都涉及到的配置文件包括 ejb-jar.xml,weblogic-ejb-jar.xmlCMP 实体 Bean 一般还需要 weblogic-cmp-rdbms-jar.xml
   9 EJB 需直接实现它的业务接口或 Home 接口吗 , 请简述理由 .
远程接口和 Home 接口不需要直接实现,他们的实现代码是由服务器产生的,程序运行中对应实现类会作为对应接口类型的实例被使用。
  10 、说说在 weblogic 中开发消息 Bean 时的 persistent non-persisten 的差别
persistent 方式的 MDB 可以保证消息传递的可 * , 也就是如果 EJB 容器出现问题而 JMS 服务器依然会将消息在此 MDB 可用的时候发送过来,而 non persistent 方式的消息将被丢弃。
  11 、说说你所熟悉或听说过的 j2ee 中的几种常用模式 ? 及对设计模式的一些看法
       Session Facade Pattern :使用 SessionBean 访问 EntityBean
Message Facade Pattern :实现异步调用
EJB Command Pattern :使用 Command JavaBeans 取代 SessionBean ,实现轻量级访问
Data Transfer Object Factory :通过 DTO Factory 简化 EntityBean 数据提供特性
Generic Attribute Access :通过 AttibuteAccess 接口简化 EntityBean 数据提供特性
Business Interface :通过远程(本地)接口和 Bean 类实现相同接口规范业务逻辑一致性
EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。
1 JSP 中动态 INCLUDE 与静态 INCLUDE 的区别?
答: 动态 INCLUDE jsp:include 动作实现
   <jsp:include page="included.jsp" flush="true" />
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
  
静态 INCLUDE include 伪码实现 , 定不会检查所含文件的变化,适用于包含静态页面
   <%@ include file="included.htm" %>
2 、两种跳转方式分别是什么 ? 有什么区别 ?
答: 有两种,分别为:
  <jsp:include page="included.jsp" flush="true">
  <jsp:forward page= "nextpage.jsp"/>
  
前者页面不会转向 include 所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数 . 后者完全转向新页面,不会再回来。相当于 go to 语句。
3 JAVA SERVLET API forward() redirect() 的区别?
: 前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用 forward() 方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 sendRedirect() 方法。
4 、编程用 JAVA 解析 XML 的方式 .
: SAX 方式解析 XML XML 文件如下:
<?xml version="1.0" encoding="gb2312"?>
<person>
  <name>
王小明 </name>
  <college>
信息学院 </college>  
  <telephone>6258113</telephone>
  <notes>
,1955 年生 , 博士, 95 年调入海南大学 </notes>
</person>
事件回调类 SAXHandler.java
import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
  {
  private Hashtable table = new Hashtable();
  private String currentElement = null;
  private String currentValue = null;
  public void setTable(Hashtable table)
    {
    this.table = table;
    }
  public Hashtable getTable()
    {
    return table;
    }
  public void startElement(String tag, AttributeList attrs)
  throws SAXException
    {
    currentElement = tag;
    }
  public void characters(char[] ch, int start, int length)
  throws SAXException
    {
    currentValue = new String(ch, start, length);
    }
  public void endElement(String name) throws SAXException
    {
    if (currentElement.equals(name))
      table.put(currentElement, currentValue);
    }
  }
JSP
内容显示源码 ,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>
剖析 XML 文件 people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage="ErrPage.jsp"
contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="org.xml.sax.*" %>
<%@ page import="javax.xml.parsers.SAXParserFactory" %>
<%@ page import="javax.xml.parsers.SAXParser" %>
<%@ page import="SAXHandler" %>
<%
File file = new File("c://people.xml");
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println("<TABLE BORDER=2><CAPTION>
教师信息表 </CAPTION>");
out.println("<TR><TD>
姓名 </TD>" + "<TD>" +
  (String)hashTable.get(new String("name")) + "</TD></TR>");
out.println("<TR><TD>
学院 </TD>" + "<TD>" +
  (String)hashTable.get(new String("college"))+"</TD></TR>");
out.println("<TR><TD>
电话 </TD>" + "<TD>" +
  (String)hashTable.get(new String("telephone")) + "</TD></TR>");
out.println("<TR><TD>
备注 </TD>" + "<TD>" +
  (String)hashTable.get(new String("notes")) + "</TD></TR>");
out.println("</TABLE>");
%>
</BODY>
</HTML>
File myFileName = new File( "% 文件夹命 " );
  
  if( myFileName.isDirectory() ){
   String dirContents[] = myFileName.list();
   for( int i=0; i<dirContents.length; i++ ){
    System.out.println( dirContents[i] + "/n");
   }
  }
 
 
 
Java 常见问题集锦 -- 来自 Sun 中国官方站
1 、问 : 如何设置 Java 2(JDK1.2) 的环境变量 ?

: Java 2 安装后 , 需要设置 PATH JAVA_HOME 环境变量 . JDK1.1 不同的是 : 设置好 JAVA_HOME 环境变量后 ,JVM 将自动搜索系统类库以及用户的当前路径 .
Java 2
环境变量的设置如下例所示 :
Solaris
平台 : setenv JAVA_HOME Java2 的安装路径
setenv PATH $JAVA_HOME/bin:${PATH}
Windows
平台 : set JAVA_HOME=Java2 的安装路径
set PATH=$JAVA_HOMEbin;%PATH%

2
、问 : 哪些 Java 集成开发工具支持 Java 2?

: 目前流行的 Java 集成开发环境 , Inprise JBuilder,Symantec Visual Cafe, Sybase PowerJ, 都支持 Java 2.

3
、问 : 如果在 Netscape IE 浏览器中运行 Java applet 时出现了错误 , 如何确定错误范围 ?

: java applet 在浏览器中运行时 , 使用的是浏览器本身的缺省 JVM. 而不同浏览器对 JDK 的支持程度也不尽相同 . 因此 , Netscape IE 浏览器中运行 Java applet 出现了错误 , 建议使用 JDK 提供的工具 appletviewer Sun 公司的 Hotjava 浏览器来测试该 applet, 以确定错误的产生是与浏览器相关 .
如果 applet appletviewer Hotjava 中运行一切正常 , 则错误的产生是由于浏览 器不完全兼容 JDK 而引起的 . 此时 , 解决方法可以是使用 Hotjava 浏览器或者安装 Sun 公司的 Java Plugin.
如果 applet Hotjava 浏览器或 appletviewer 中运行即发生错误 , 则应当根据错误 提示检查 applet 程序 .

4
、问 : 当用 JDBC 向数据库中插入数据或从数据库中提取数据时 , 为何有时中文字符会显示为乱码 ?

: 这个问题的实现通常与各个 JDBC driver 的实现有关 . 目前大多数 JDBC driver 采用本地编码格式来传输中文字符 , 例如中文字符 "0x4175" 会被转成 "0x41" "0x75" 进行传输 . 因此我们需要对 JDBC driver 返回的字符以及要发给 JDBC driver 的字符进行转换 .

当用 JDBC driver 向数据库中插入数据时 , 需要先将 Unicode 转成 native code; JDBC driver 从数据库中查询数据时 , 则需要将 native code 转换成 Unicode. 下面给出了这两种转换的实现 :

String native2Unicode(String s) {
if (s == null || s.length() == 0) {
return null;
}
byte[] buffer = new byte[s.length()];
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {
c = s.charAt(i);
byte []buf = (""+c).getBytes();
buffer[j++] = (char)buf[0];
buffer[j++] = (char)buf[1];
}
else {
buffer[j++] = s.charAt(i);
}
}
return new String(buffer, 0, j);
}
除使用以上两个方法之外 , 有些 JDBC driver 如果对 jdbc driver Manager 设置了正确 的字符集属性 , 以上 2 个方法就不需要了 .


5
、问 :
当用 Servlet 来处理 http 请求并产生返回的 HTML 页面时 , 如何使 HTML 页面中的中文字符能够正常显示 ?
:
javax.servlet.http.HttpResponse
类用于产生返回页面 . 通过 HttpResponse 定义的方法 getOutputStream() 可以获得 ServletOutputStream 的实例 , 这样用户就可以利用 ServletOutputStream.write 方法向输出流中写入返回页面的内容 . 但是 ServletOutputStream 使用的是缺省的编码方式 , 如果要使返回页面中的中文字 符能够正常显示 , 最好显示地指定所用的字符编码方式 . 通常需要构造一个 OutputStreamWriter , 例程如下 :
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");
ow.write("
这是测试 ");
ow.flush();
ow.close();
}

6
、问 :
如何设置 Java WebServer CLASSPATH, 以包含用户的 class 文件 ?
:
有两种方法可以设置 Java WebServer CLASSPATH 环境变量 , 以使用户编写的 Servlet 能够调用用户的 class 文件 .
将用户的 class 文件放到 JavaWebServer_Dir/classes 目录下 , Java WebServer 启动时 ,classes 目录被自动加入到 CLASSPATH 环境变量中了 .
修改 httpd.nojre 文件 , 将用户 class 文件所在的路径名加到 CLASSPATH 环境变量中 .

7
、问 :
为什么在 Windows 平台上用 Naming.lookup 来获取远程 RMI 对象时会很慢 ?

:
机器的网络设置不正确很可能会引起该问题的发生 .
RMI
使用了 Java 网络类 , 特别是 java.net.InetAddress , 它将查询 TCP/IP 的主机名 , 包括 IP 地址到主机名的映射和主机名到 IP 地址的映射 . Windows 平台 , 这种查询功能 是由本地的 Windows Socket 库来实现的 . 因此延时是发生在 Windows 库中 , 而非 RMI .
如果你的机器设置成使用 DNS, 问题通常是 DNS 服务器查不到主机名 , 你所发现的延时 DNS 查询的延时 . 请尝试将 RMI 通信中涉及到的所有主机名 /IP 地址加到本地文件 winntsystem32driversetchosts windowshosts . 格式如下 :
IP
地址 主机名
如此设置应当可以明显地减少查询所花的时间 .

8
、问 : 编写 Java application , 如何设置 proxy 的信息 , 以便访问外部网站 ?
: 若在 java application 中访问外部网站 , 首先应设置 proxy 信息 , 样例代码如下 :
import java.util.properties;

.....

Properties sys = System.getProperties();
sys.put("proxySet","true");
sys.put("proxyHost","myHTTP.proxyserver.com");
sys.put("proxyPort","80");
System.setProperties(sys);
u = new URL(website);
connect = (HttpURLConnection)u.openConnection();
.....

9
、问 : Swing 组件 JList 的列表数据修改了 , 如何通知 JList 改变显示 ?
:
JList
组件有一个单独的显示模式 ListModel 来表示 JList 的显示数据 .
JList
创建以后 ,JList 数据元素的值及数据元素的数量可以动态地改变 .
JList
在它的数据模式 ListModel 中观察数据的改变 . 因此 , 一个 ListModel 的正确实现应当在每次数据发生改变时 , 通知事件的监听者 .
当使用构造函数 JList(Object[]) 创建一个 JList 的实例时 , 系统将自动 创建一个 DefaultListModel 的实例来存储 JList 的显示数据 , 可以调用 DefaultListModel 中定义的简便方法来动态地修改 JList 的数据 , removeElementAt(index),addElement(Object) . DefaultListModel 在修改数据的同时 , 将通知 JList 关于数据的改变 .

10
、问 :
Java applet 中如何实现一个模式对话框 ?
:
Java applet 中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口 . 因为 Applet Panel 类的子类 , 可以作为对话框的父窗口 , 所以首先要获得 applet 所在的窗口 , 作为模式 对话框的父窗口 . 样例代码如下 :
.....
Dialog d = new Dialog( getParentWindow(comp),title);
// comp
applet 上的任意一个组件
....

public void getParentWindow(Component compOnApplet,String title){
Container c = compOnApplet.getParent();
while (c != null) {
if (c instanceof Frame)
return (Frame) c;
c = c.getParent();
}
return null;
}
11
、问 : Java applet 中如何显示另外一个 HTML 页面 ?
:
通过 java.applet.Applet.getAppletContext() 方法可以获得与该 applet 相关的 AppletContext, AppletContext.showDocument(URL) 方法就可以使 applet 所在的浏览器显示另外一个网页 .
12
、问 :
JDK 实现的签名 applet, 可否在 Netscape IE 中运行 ?
:
JDK 实现的签名 applet, 不可以在 Netscape IE 中运行 , 但是可以在 Hotjava 浏览器中运行 .
不同的浏览器提供了不同的签名 applet 机制 , Netscape 提供了 zigbert 工具和 Capability API, IE 则需要使用 CAB 文件 . 但是 , 无论是 Netscape 工具产生的 签名 applet, 还是用 IE 产生的签名 applet, 都不可以在其它的浏览器中运行 .
如果要使 JDK 产生的签名 applet 能够在 Netscape IE 中运行 , 解决方法是在 Netscape IE 中安装 Java Plugin, 则用 JDK 实现的签名 applet 就可以在这两种 浏览器中运行 .

13
、问 :
JNI 技术可以从 Java 应用中调用 C 程序库 , 但是如何使该 C 程序库可以调用另外的 C 程序库 ?
:
如果一个被 Java 调用的 C 程序库 C1 仍需要调用另外一个 C 程序库 C2, 那么在编译 C1 的时候应当联接程序库 C2, 步骤如下 (Solaris 平台 ):
编写调用 C 库的 Java 文件 , 并编译 .
javac java
文件名
产生 C 程序头文件
javah -jni java
文件名 ( 不带后缀 .java)
编写被 Java 调用的 C 程序 C1.c, 以及被 C1 调用的 C2.c, 并编译 .
cc -G -Iinclude
路径名 C2.c -o libC2.so
cc -G -Iinclude
路径名 -lC2 C1.c -o libC1.so
设置环境变量
setenv LD_LIBRARY_PATH libC1.so,libC2.so
所在路径
:${LD_LIBRARY_PATH}

运行 java 应用

14
、问 :
Java 语言中 , 如何列出 PC 机文件系统中的所有驱动器名 ?
:
Java 2 版本中 ,java.io 包中的 File 类新增加了方法 listRoots() 可以实现这一功能 .

15
、问 :
为什么 Runtime.exec("ls") 没有任何输出 ?

:
调用 Runtime.exec 方法将产生一个本地的进程 , 并返回一个 Process 子类的实例 , 该实例可用于控制进程或取得进程的相关信息 . 由于调用 Runtime.exec 方法所创建的子进程没有自己的终端或控制台 , 因此该子进程的标准 IO( stdin,stdou,stderr) 都通过 Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream() 方法重定向给它的父进程了 . 用户需要用这些 stream 来向 子进程输入数据或获取子进程的输出 . 所以正确执行 Runtime.exec("ls") 的例程如下 :
try
{
process = Runtime.getRuntime().exec (command);
InputStreamReader ir=newInputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader (ir);
String line;
while ((line = input.readLine ()) != null)
System.out.println(line);
}
catch (java.io.IOException e){
System.err.println ("IOException " + e.getMessage());
}

16
、问 :
如何产生签名 applet, 以使 applet 能够访问本地资源 ?

:
jdk1.1 , 可以使用 javakey 命令来产生公钥 , 私钥 , 证书和签名的 jar 文件 , 详细资料 请参考 : http://java.sun.com/security/usingJavakey.htmljava 2 对签名机制做了比较大的改进 , 允许用户更灵活地设置安全权限 .Java 2 提供了三个工具 :keytool,policytool jarsigner 来实现签名 applet. 例如 ,Joe 编写了一个签名 applet:SignedApplet.java, 那么产生一个简单的签名 applet 的过程如下 :

//
产生密钥 , 密钥别名为 joe, 口令为 sign12, 存放在密钥库 joestore
keytool -genkey -alias joe -keypass sign12 -keystore joestore
//
SignedApplet.class 及相关文件打包成 jar 文件
jar cvf SignedAppletDemo.jar
//
利用 keytool 生成的自签名的证书产生签名 applet(jar 文件 )
jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe
//
将自签名证书从 keystore 中输出到文件
keytool -export -keystore joestore -alias joe -file joe.cer
而对于签名 applet 的接受方 Susan, 需要通过如下步骤来安全地执行
Joe
编写的签名 applet:
//
得到 Joe 的证书并将之读入到密钥库中 susanstore
keytool -import -alias joe -file joe.cer -keystore susanstore
//
运行 policytool 产生满足 Susan 要求的 policy 文件
policytool
//
appletviewer 运行之 , 或在浏览器中安装 java plugin 来运行之 .
关于签名 applet Java Plugin 中的部署请参考以下网页 :
http://java.sun.com/security/signExample12/
: 以上的例子为简单起见 , 使用了 keytool 产生的自签名证书 . 其实 , 用户也可以
使用 keytool -certreq 向商业 CA 中心申请电子证书 .


17
、问 :
若通过 ObjectOutputStream 向一个文件中多次以追加方式写入 object, 为什么用 ObjectInputStream 读取这些 object 时会产生 StreamCorruptedException?
:
使用缺省的 serializetion 的实现时 , 一个 ObjectOutputStream 的构造和一个 ObjectInputStream 的构造必须一一对应 .ObjectOutputStream 的构造函数会向输出流中写入一个标识头 , ObjectInputStream 会首先读入这个标识头 . 因此 , 多次以追加方式向一个文件中写入 object , 该文件将会包含多个标识头 . 所以用 ObjectInputStream deserialize 这个 ObjectOutputStream , 将产生 StreamCorruptedException. 一种解决方法是可以构造一个 ObjectOutputStream 的子类 , 并覆盖 writeStreamHeader() 方法 . 被覆盖后的 writeStreamHeader() 方法应判断是否为首次向文件中写入 object, ? 则调用 super.writeStreamHeader(); 若否 , 即以追加方式写入 object , 则应调用 ObjectOutputStream.reset() 方法 .

18
、问 :
对象的序列化 (serialization) 类是面向流的 , 应如何将对象写入到随机存取文件中 ?

:
目前 , 没有直接的方法可以将对象写入到随机存取文件中 .
但是可以使用 ByteArray 输入 / 输出流作为中介 , 来向随机存取文件中写入或从随机存取文件中读出字节 , 并且可以利用字节流来创建对象输入 / 输出流 , 以用于读写对象 . 需要注意的是在字节流中要包含一个完整的对象 , 否则读写对象时将发生错误 . 例如 ,java.io.ByteArrayOutputStream 可用于获取 ObjectOutputStream 的字节流 , 从中可得到 byte 数组并可将之写入到随机存取文件中 . 相反 , 我们可以从随机存取文件中读出字节数组 , 利用它可构造 ByteArrayInputStream, 进而构造出 ObjectInputStream, 以读取对象 .

19
、问 :
运行 RMI 应用时 , 可不可以不手工启动名字服务 rmiregistry, 而是从程序中启动之 ?

:
可以 . java.rmi 包中提供了类 java.rmi.registry.LocateRegistry, 用于获取名字服务或创建名字服务 . 调用 LocateRegistry.createRegistry(int port) 方法可以在某一特定端口创建名字服务 , 从而用户无需再手工启动 rmiregistry. 此外 ,LocateRegistry.getRegistry(String host,int port) 方法可用于获取名字服务 .

20
、问 :
使用类 PrintJob 进行打印操作时 , 应如何设置打印机名等打印属性 ?
:
使用如下方法可以获得 PrintJob 的实例用于控制打印操作 :
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)

那么对于打印属性的设置可以通过对 prop 的属性设置来实现 , 打印属性包括 :

awt.print.destination:
可以是 "printer" "file"
awt.print.printer:
打印机名
awt.print.fileName:
打印文件名
awt.print.numCopies:
打印份数
awt.print.options:
打印命令的打印选项
awt.print.orientation:
打印方向 , 可以是 "portrait" "landscape"
awt.print.paperSize:
纸张大小 , 可以是 "letter","legal","executive" "a4"

21
、问 :
JDK1.1 Thread 类定义了 suspend() resume() 方法 , 但是在 JDK1.2 中已经过时 , 应使用什么方法来替代之 ?

:
Thread.suspend
本身易于产生死锁 . 如果一个目标线程对某一关键系统资源进行了加锁操作 , 然后该线程被 suspend, 那么除非该线程被 resume, 否则其它线程都将无法访问该系统资源 . 如果另外一个线程将调用 resume, 使该线程继续运行 , 而在此之前 , 它也需要访问这一系统资源 , 则将产生死锁 .
因此 , Java 2 , 比较流行的方式是定义线程的状态变量 , 并使目标线程轮询该状态变量 , 当状态为悬挂状态时 , 可以使用 wait() 方法使之处于等待状态 . 一旦需要该线程继续运行 , 其它线程会调用 notify() 方法来通知它 .

22
、问 :
使用 JDBC 编程 , 应如何控制结果集 ResultSet 的指针 , 使之能够上下移动 , 以及移动到结果集的第一行和最后一行 ?
:
JDK1.1 ,ResultSet 类中只定义了 next() 方法支持数据指针的下移 . 但在 Java 2 ,ResultSet 类增加了如下方法支持数据指针的移动 , 包括 :


ResultSet.first():
将数据指针移到结果集的第一行
ResultSet.last():
将数据指针移到结果集的最后一行
ResultSet.previous():
将数据指针上移一行
以上的方法定义在 JDBC2.0 的规范中 , 所有支持 JDBC 2.0 JDBC 驱动程序都可以支持上述方法 . 目前 Intersolv OpenLink JDBC 驱动程序厂商均有产品支持 JDBC 2.0 .
23
、问 :
哪几种 Web Server 支持 Servlet? 如何使 IIS 支持 Servlet?
:
目前 , 支持 Servlet 的服务器端产品主要有 : Sun 公司的 Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer Mot Bays Jetty .
此外 , 一些第三方厂商也开发了 Servlet engine, 以使其它 WebServer( Netscape Web Server,IIS ) 能够运行 Servlet, LiveSoftware Jrun(http://www.livesoftware.com/ products/jrun/) .

24
、问 :
如何在 Java 应用中将图像存储到图像文件中 ?
:
Java Advanced Imaging API(
包含在 Java Media API ) 允许在 Java 应用中执行复杂的 , 高性能的图像处理 .JAI API 提供了存储图像的能力 . 目前 ,JAI API 支持以下几种图像文件格式 :BMP,JEPG,PNG,PNM,TIFF. 下面给出了将图像存储到 BMP 文件的一段代码 :
OutputStream os = new FileOutputStream(fileToWriteTo);
BMPEncodeParam param = new BMPEncodeParam();
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param);
enc.encode(img);
os.close();
有关存储图像文件的编程指南请参考以下网页 :
http://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/

25
、问 :
如何用 Java 语言向串口读写数据 ? font>
:
Sun
公司的 Java Communication API2.0 可用于读写串口 , 它支持 RS232 串口和 IEEE 1284 并口 , 提供了一种与平台无关的串 / 并口通信机制 .
 
 
 
大家看看这些问题也许对你以后面试有帮助
1. 面向对象的特征有哪些方面 ?
继承性 多态性 封装性
2. JSP 的常用内置对象都包括哪些 ?
3. Integer 怎么样装换成 int 型?
4 。请问在 weblogic 下如何完整的解决中文问题?
  1) JSP 文件头加入
           <%@ page contentType="text/html; charset=GBK" %>
      
指定该 JSP 采用的字符集。
    2)
Weblogic.xml 文件的 <jsp-descriptor> 中加入:
           <jsp-param>
              <param-name>encoding</param-name>
              <param-value>GBK</param-value>
           </jsp-param>
      
指定 JSP 文件中采用的字符集,在 JSP 文件中的
            <%@ page contentType="text/html; charset=GBK" %>
会覆盖该设置
    3)
Weblogic.xml 文件的 <jsp-descriptor> 中加入
            <jsp-param>
                <param-name>compilerSupportsEncoding</param-name>
                <param-value>true</param-value>
            </jsp-param>
      
如果为 TRUE ,指定在编译 JSP 文件时,采用在 JSP 文件中定义的
            <%@ page contentType="text/html; charset=GBK" %>
      

            <jsp-descriptor>
      
中定义的 encoding 参数中定义的字符集进行编码 ;
      
如果为 FALSE ,则采用 JVM 中默认指定的字符集进行编码。
5. 某字段有 10 条重复记录请把对应表中的记录查询出来 ?
表名 appeal_base_info
字段 appeal_type(number)
SELECT * form appeal_base_info where appeal_type in (select appeal_type from appeal_base_info group by appeal_type having count(appeal_type) = 10)

6.
一张主表 , 一张从表 , 请将两张表的所有记录查询出来 ?
主表 : appeal_base_info   主键 :base_id (number)
主表 : appeal_person_info 主键 :person_id(number) 外键 : base_id(number)
select * from appeal_base_info,appeal_person_info where appeal_base_info.base_id = appeal_person_info.base_id

7.
两个 int 型的整数 , 不经过第 3 方变量进行替换 ?
a =10 b =5
转换后 a =5 b =10
方法一、 a=a+b;b=a-b;a=a-b;
方法二、 a=a + b<<16; // b 放到了 a 的高 16
b=(a &0XFFFF0000)>>16  //
a 放到了 a 的高 16
a=a & 0x0000ffff;
方法三、 a^= b;
b ^= a;
a ^= b;

8.
排错题
1.
  public BaseVO getAll(String id) throws SQLException {
    PreparedStatement ps = null;
    BaseVo vo = null;
    ResultSet rs = null;
    List list = null;
    String sql = "select * from base_info where id = "+ id";
    ps = dbConnection.prepareStatement(sql);
    try {
      rs = ps.executeQuery();
      if (rs.next()) {
         vo = fillVO(rs);
      }
    }
    catch (SQLException e) {
      throw e;
    }
    finally {
      closeDBObject(ps,rs);
      return vo;
    }
  }

  2.
  public boolean compare(String str,List list){
list = new ArrayList();
int len = list.size();
boolean b = false;
for(int i=0;i<len;i++){
String str1 = list.get(i);
if(str.equals(str1)){
b = true;
}
}
return b;
  }
9. 编程题
1.
请写出你认为效率最高的方法 , 实现从 1 加到 100.
1-100 的累加相当于加 50 101 ,这样循环次数从 100 次降为 50 次:
int sun = 0
for(int i = 1,j = 100 ; i <= 50 ; i++,j--){
    sun = sun + i + j;
}
2. 给定两个日期 begin,end
请对两个日期进行对比
如果 begin>end 返回 true
日期格式 (yyyy-mm-dd hh:ss)
注意有可能为 null 的条件
请用 javascript 实现 .

10.
在某页面有一下拉框 , 需要随着数据库的变化而动态变化 , 请说明你所知道的方式 , 以及具体思路 .
a
、就像 csdn 论坛首页那样做,页面一框架形式存在,定时刷新框架的一部分,如 csdn 刷新的就只是用户状态栏。
b
、借鉴 .net 的实现方法,将页面状态已编码的方式存放在 form 中,当数据库发生变化时,不论用户是否完成表单编辑页面信息都会被提交,但是不会被处理,只有要变化的下拉框的状态会发生变化,其它的值将回读编码值,以保存原有的状态。
编写一个截取字符的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但是要保证汉字不被截半个,如( ABC” 4 ),应该截为 AB” ,输入为( ABC DEF” 6 ),应该截为 ABC” ,而不是 ABC+ 汉的一半
public class CutString {
public static void main(String args[]) {
String str="
我喜欢 JAVA:)";
for(int i=0;i<=str.length();i++) {//
循环打印
System.out.println(cutString(str,i));
}
}
public static String cutString(String s,int len) {
byte [] sb=s.getBytes();
boolean b=true;
for(int i=0;i<len;i++) {
if(sb[i]<0 && b==true) {//
遇到汉字 len++
len++;
b=false;
}else{
b=true;
}
}
return new String(sb,0,len);
}
}
static String cutstr(String str, int n) {
int i;
for (i = 0; i < n; i++) {
if (str.charAt(i) > 127)
n--;
}
return str.substring(0, n);
}

给出任一字符串,如 abcdd, 找出所有可能的字母组合(如 ab ac add dd …… !
public class GenCombination
{
char num[];
public GenCombination(int i,char[] ia){
  num=new char[i];
  for (int j=0 ;j<i ; j++ ) {
   num[j]=ia[j];  
  }  
}

public int getCombination(int n,int m){
  if (n<m){
   System.out.println("Wrong Parameters: first Param >= Second Param");
   return 0;
  }
  System.out.println("get "+ m + " char from "+ n + " char :");    
  int numOfResult=0;
  char result[][]=new char[100][];  int a[];
  a=new int[m+1] ;
  int i,j;
     for (i=1;i<=m;i++) a[i]=i;
       for (;;)
    {
      result[numOfResult] = new char[m];
      int h=0;
      
      for (i=1;i<=m;i++) {            
       result[numOfResult][h] = num[ a[i]-1 ];        
       h++;
      }
      
      for (int p=0; p<result[numOfResult].length; p++ ){
       System.out.print(result[numOfResult][p]);
      
      }      

     System.out.println();
      numOfResult++;

      for (j=m;j>=1;j--) if (a[j]<n-m+j) break;
      if (j==0) break;
      a[j]++;
      for (i=j+1;i<=m;i++) a[i]=a[i-1]+1;
    }
    
    System.out.println( "/n"+numOfResult+" result!/n/n");
    return numOfResult;
}


    public static void main(String args[])
    {    
      
      String s="abcdd";
      char ca[]=s.toCharArray();
      
      GenCombination gc=new GenCombination(s.length(),ca);

      for (int i=1 ; i<=s.length(); i++)
       gc.getCombination(s.length(),i);
    }
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值