java面试150题2(续)

 

119、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

  答:Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。

  JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。

  JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。

  WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。

  SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。

  UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

120、C/S 与 B/S 区别:

  答:有如下八个方面的不同:

  1.硬件环境不同:

  C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.

  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行

  2.对安全要求不同

  C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.

  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

  3.对程序架构不同

  C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.

  B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.

  4.软件重用不同

  C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.

  B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

  5.系统维护不同 

  C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

  6.处理问题不同

  C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统

  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

  7.用户接口不同

  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高

  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

  8.信息流不同

  C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低

  B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

121、什么是web容器

  答:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接跟容器中的环境变量交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

122、什么是EJB容器
答:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理

123、什么是JNDI

  答:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。

124、什么是JMS

  答:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。

125、什么是JTA
  答:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。

126、什么是JAF
  答:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。

  RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

127、MVC的各个部分都有那些技术来实现?如何实现?

  答:MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

十、设计模式方面

128、开发中都用到了那些设计模式?用在什么场合?

  答:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。

129、说说你所熟悉或听说过的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架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。

130、j2ee常用的设计模式?说明工厂模式。

  答:Java中的23种设计模式:

  Factory(工厂模式),   Builder(建造模式),       Factory Method(工厂方法模式),
  Prototype(原始模型模式),Singleton(单例模式),     Facade(门面模式),
  Adapter(适配器模式),    Bridge(桥梁模式),        Composite(合成模式),
  Decorator(装饰模式),    Flyweight(享元模式),     Proxy(代理模式),
  Command(命令模式),      Interpreter(解释器模式), Visitor(访问者模式),
  Iterator(迭代子模式),   Mediator(调停者模式),    Memento(备忘录模式),
  Observer(观察者模式),   State(状态模式),         Strategy(策略模式),
  Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)

  工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

131、UML方面

  答:标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图,
UML方面 

十一、CORBA方面

132、CORBA是什么?用途是什么?

  答:CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:

  用不同的程序设计语言书写
  在不同的进程中运行
  为不同的操作系统开发

十二、LINUX方面

133、LINUX下线程,GDI类的解释。

  答:LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。

  GDI类为图像设备编程接口类库。

 
 
十三、代码与编程题

135、写一个Singleton出来

  Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

  一般Singleton模式通常有几种种形式:

  第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {
private Singleton(){}
  private static Singleton instance = new Singleton();

     //这里提供了一个供外部访问本class的静态方法,可以直接访问  
 public static Singleton getInstance() {
   return instance;   
  }
}

   第二种形式:

public class Singleton {
  private static Singleton instance = null;

   //这个方法比上面有所改进,只是第一次使用时生成实例,提高了效率
  public static synchronized Singleton getInstance() {
  if (instance==null) instance=new Singleton();
    return instance;
  }
}

  其他形式:定义一个类,它的构造函数为private的,所有方法为static的。

  一般认为第一种形式要更加安全些

136、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?

  答:父类:

package test;
public class FatherClass {
  public FatherClass() {
    System.out.println("FatherClass Create");
  }
}

  子类:

package test;
import test.FatherClass;
public class  ChildClass extends FatherClass {
  public ChildClass() {
    System.out.println("ChildClass Create");
  }

  public static void main(String[] args) {
    FatherClass fc = new FatherClass();
    ChildClass cc = new ChildClass();
  }
}

  输出结果:

C:\>java test.ChildClass
FatherClass Create
FatherClass Create
ChildClass Create

137、内部类的实现方式?

  答:示例代码如下:

package test;
public class OuterClass {
  private class InterClass {
    public InterClass() {
      System.out.println("InterClass Create");
    }
  }

  public OuterClass() {
    InterClass ic = new InterClass();
    System.out.println("OuterClass Create");
  }

  public static void main(String[] args) {
    OuterClass oc = new OuterClass();
  }
}

  输出结果:

C:\>java test/OuterClass
InterClass Create
OuterClass Create
  再一个例题:

public class OuterClass {
  private double d1 = 1.0;
  //insert code here
}

You need to insert an inner class declaration at line 3. Which two inner class declarations are valid?(Choose two.)

A. class InnerOne{
     public static double methoda() {return d1;}
   }
B. public class InnerOne{
     static double methoda() {return d1;}
   }
C. private class InnerOne{
     double methoda() {return d1;}
   }
D. static class InnerOne{
     protected double methoda() {return d1;}
   }
E. abstract class InnerOne{
     public abstract double methoda();
   }

   说明如下:

  1.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。 故 A、B 错

  2.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;故 D 错

  3.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确

  4.答案为C、E

138、Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?

  答:Server端程序:

package test;
import java.net.*;
import java.io.*;

public class Server{
  private ServerSocket ss;
  private Socket socket;
  private BufferedReader in;
  private PrintWriter out;
 
 public Server() {
  try {
   ss=new ServerSocket(10000);
   while(true) {
    socket = ss.accept();
    String RemoteIP = socket.getInetAddress().getHostAddress();
    String RemotePort = ":"+socket.getLocalPort();
    System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line = in.readLine();
    System.out.println("Cleint send is :" + line);
    out = new PrintWriter(socket.getOutputStream(),true);
    out.println("Your Message Received!");
    out.close();
    in.close();
    socket.close();
   }
  }catch (IOException e) {
   out.println("wrong");
  }
 }

 public static void main(String[] args) {
  new Server();
 }
}

  Client端程序:

package test;
import java.io.*;
import java.net.*;

public class Client {
 Socket socket;
 BufferedReader in;
 PrintWriter out;
 public Client() {
  try {
   System.out.println("Try to Connect to 127.0.0.1:10000");
   socket = new Socket("127.0.0.1",10000);
   System.out.println("The Server Connected!");
   System.out.println("Please enter some Character:");
   BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
   out = new PrintWriter(socket.getOutputStream(),true);
   out.println(line.readLine());
   in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   System.out.println(in.readLine());
   out.close();
   in.close();
   socket.close();
  }catch(IOException e) {
   out.println("Wrong");
  }
 }

 public static void main(String[] args) {
  new Client();
 }
}

139、用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 如在COLLECTION框架中,实现比较要实现什么样的接口?

  答:用插入法进行排序代码如下:

package test;
import java.util.*;
class  InsertSort {
 ArrayList al;

 public InsertSort(int num,int mod) {
  al = new ArrayList(num);
  Random rand = new Random();
  System.out.println("The ArrayList Sort Before:");
  for (int i=0;i<num></num>    al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
   System.out.println("al["+i+"]="+al.get(i));
  }
 }

 public void SortIt() {
  Integer tempInt;
  int MaxSize=1;
  for(int i=1;i    tempInt = (Integer)al.remove(i);
   if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue()) {
    al.add(MaxSize,tempInt);
    MaxSize++;
    System.out.println(al.toString());
   } else {
    for (int j=0;j<maxsize></maxsize>      if (((Integer)al.get(j)).intValue()>=tempInt.intValue()) {
      al.add(j,tempInt);
      MaxSize++;
      System.out.println(al.toString());
      break;
     }
    }
   }
  }

  System.out.println("The ArrayList Sort After:");
  for(int i=0;i    System.out.println("al["+i+"]="+al.get(i));
  }
 }

 public static void main(String[] args) {
  InsertSort is = new InsertSort(10,100);
  is.SortIt();
 }
}

140、编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

  答:代码如下:

package test;

class  SplitString {
 String SplitStr;
 int SplitByte;
 public SplitString(String str,int bytes) {
  SplitStr=str;
  SplitByte=bytes;
  System.out.println("The String is:'"+SplitStr+"';SplitBytes="+SplitByte);
 }

 public void SplitIt() {
  int loopCount;
  loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/SplitByte+1);
  System.out.println("Will Split into "+loopCount);
  for (int i=1;i<=loopCount ;i++ ) {
   if (i==loopCount){
    System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
   } else {
    System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));
   }
  }
 }

 public static void main(String[] args) {
  SplitString ss = new SplitString("test中dd文dsaf中男大3443n中国43中国人0ewldfls=103",4);
  ss.SplitIt();
 }
}

141、JAVA多线程编程。 用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。

  希望大家补上,谢谢

142、可能会让你写一段Jdbc连Oracle的程序,并实现数据查询.

  答:程序如下:

package hello.ant;
import java.sql.*;

public class  jdbc {
 String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
 String theUser="admin";
 String thePw="manager";
 Connection c=null;
 Statement conn;
 ResultSet rs=null;

 public jdbc() {
  try{
   Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
      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();
  rs=conn.executeQuery("select * from test");
  try {
   while (rs.next()) {
    System.out.println(rs.getString("id"));
    System.out.println(rs.getString("name"));
   }
  }catch(Exception e) {
   e.printStackTrace();
  }
 }
}

143、ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。

  答:一种分页方法:

<!---->

  输出内容:

//输出翻页连接
合计:<!---->/<!---->首页上页
<!---->
  []
<!---->
下页末页

144、用jdom解析xml文件时如何解决中文问题?如何解析?

  答:看如下代码,用编码方式加以解决:

package test;
import java.io.*;

public class DOMTest {
 private String inFile = "c:\\people.xml";
 private String outFile = "c:\\people.xml";

 public static void main(String args[]) {
  new DOMTest();
 }

 public DOMTest() {
  try {
   javax.xml.parsers.DocumentBuilder builder =
    javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
      org.w3c.dom.Document doc = builder.newDocument();
      org.w3c.dom.Element root = doc.createElement("老师");
      org.w3c.dom.Element wang = doc.createElement("王");
   org.w3c.dom.Element liu = doc.createElement("刘");
      wang.appendChild(doc.createTextNode("我是王老师"));
      root.appendChild(wang);
      doc.appendChild(root);
      javax.xml.transform.Transformer transformer =
       javax.xml.transform.TransformerFactory.newInstance().newTransformer();
      transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
      transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");  
      transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
       new javax.xml.transform.stream.StreamResult(outFile));
  } catch (Exception e) {
   System.out.println (e.getMessage());
  }
 }
}

145、编程用JAVA解析XML的方式.

  答:用SAX方式解析XML,XML文件如下:

<!---->
<person></person>
  <name></name>王小明
  <college></college>信息学院  
  <telephone></telephone>6258113
  <notes></notes>男,1955年生,博士,95年调入海南大学

   事件回调类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:






<!---->
<!---->
<!---->
<!---->
<!---->
<!---->
<!---->
<!---->
<!---->

146、EJB的基本架构

  答:一个EJB包括三个部分:

  Remote Interface 接口的代码:

  package Beans;
  import javax.ejb.EJBObject;
  import java.rmi.RemoteException;
  public interface Add extends EJBObject {
    //some method declare
  }

  Home Interface 接口的代码:

 

  package Beans;
  import java.rmi.RemoteException;
  import jaax.ejb.CreateException;
  import javax.ejb.EJBHome;
  public interface AddHome extends EJBHome {
    //some method declare
  }
  EJB类的代码:

  package Beans;
  import java.rmi.RemoteException;
  import javax.ejb.SessionBean;
  import javx.ejb.SessionContext;
  public class AddBean Implements SessionBean
  {
    //some method declare
  }

147、如何校验数字型?

var re=/^\d{1,8}$|\.\d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null) {
  sign=-4;
  break;
}else{
  document.form1.all(i).value=parseFloat(str);
}
 
148、将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七),请用java语言编一段程序实现!

public class Reader {
  private String strNum;
  private String strNumChFormat;
  private String strNumTemp;
  private int intNumLen;
  private String strBegin;
  public Reader(String strNum) {
    this.strNum = strNum;
  }

  public boolean check(String strNum) {
    boolean valid = false;
   
    if (strNum.substring(0,1).equals("0")){
     this.strNum = strNum.substring(1);
    }
    try {
      new Double(strNum);
      valid = true;
    } catch (NumberFormatException ex) {
      System.out.println("Bad number format!");
    }
    return valid;
  }

  public void init() {
    strNumChFormat = "";
    intNumLen = strNum.length();
    strNumTemp = strNum;
    strNumTemp = strNumTemp.replace('1', '一');
    strNumTemp = strNumTemp.replace('2', '二');
    strNumTemp = strNumTemp.replace('3', '三');
    strNumTemp = strNumTemp.replace('4', '四');
    strNumTemp = strNumTemp.replace('5', '五');
    strNumTemp = strNumTemp.replace('6', '六');
    strNumTemp = strNumTemp.replace('7', '七');
    strNumTemp = strNumTemp.replace('8', '八');
    strNumTemp = strNumTemp.replace('9', '九');
    strNumTemp = strNumTemp.replace('0', '零');
    strNumTemp = strNumTemp.replace('.', '点');
    strBegin = strNumTemp.substring(0, 1);
  }

  public String readNum() {
    if (check(strNum)) {
      init();
      try {
        for (int i = 1, j = 1, k = 1; i < intNumLen; i++) {
          if (strNumTemp.charAt(intNumLen - 1) == '零' && i == 1) {
            strNumChFormat = "位";
          }
          else if (strNumTemp.charAt(intNumLen - i) == '零' && j == 1) {
            strNumChFormat = "位" + strNumChFormat;
          }
          else if (strNumTemp.charAt(intNumLen - i) == '点') {
            j = 1;
            k = 1;
            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
            continue;
          }
          else {
            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
          }
          if (strNumTemp.charAt(intNumLen - i - 1) != '位' &&
              strNumTemp.charAt(intNumLen - i - 1) != '零') {
            if (j == 1 && i < intNumLen) {
              strNumChFormat = '拾' + strNumChFormat;
            }
            else if (j == 2 && i < intNumLen) {
              strNumChFormat = '百' + strNumChFormat;
            }
            else if (j == 3 && i < intNumLen) {
              strNumChFormat = '千' + strNumChFormat;
            }
          }
          if (j == 4 && i < intNumLen) {
            j = 0;
          }
          if (k == 4 && i < intNumLen) {
            strNumChFormat = '万' + strNumChFormat;
          }
          else if (k == 8 && i < intNumLen) {
            k = 0;
            strNumChFormat = '亿' + strNumChFormat;
          }
          j++;
          k++;
        }
        while (strNumChFormat.indexOf("位") != -1) {
          strNumChFormat = strNumChFormat.replaceAll("位", " ");
        }
        if (strNumChFormat.substring(0, 2) == "一拾") {
          strNumChFormat = strNumChFormat.substring(1, strNumChFormat.length());
        }
        if (strNumChFormat.indexOf("点") >= 0) {
          String rebegin = strNumChFormat.substring(0,
              strNumChFormat.indexOf("点"));
          String relast = strNumChFormat.substring(strNumChFormat.indexOf("点"),
              strNumChFormat.length());
          for (int i = 1; i <= relast.length(); i++) {
            relast = relast.replaceAll("拾", "");
            relast = relast.replaceAll("百", "");
            relast = relast.replaceAll("千", "");
            relast = relast.replaceAll("万", "");
            relast = relast.replaceAll("亿", "");
          }
          strNumChFormat = rebegin + relast;
        }
      }
      catch (ArrayIndexOutOfBoundsException ex) {
        ex.printStackTrace();
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
      int off = strNumChFormat.indexOf("点");
      strNumChFormat = strBegin + strNumChFormat.substring(0);
    }
    else {
      strNumChFormat = "";
    }
    return strNumChFormat;
  }
  public static void main(String args[]) {
    try {
      String number = args[0].toString();
      System.out.println("The number is: " + number);
      Reader reader = new Reader(number);
      System.out.println("Output String: " + reader.readNum());
    }
    catch (Exception ex) {
      System.out.println("Please input like that: javac Reader <number></number>");
    }
  }
}

 149、JAVA代码查错

  (1) 下面这段代码有什么错误?

abstract class Name {
   private String name;
   public abstract boolean isStupidName(String name) {}
}
  答: abstract method必须以分号结尾,且不带花括号。

  (2) 下面这段代码有错吗?

public class Something {
  void doSomething () {
    private String s = "";
    int l = s.length();
  }
}
  答: 有错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

  (3) 下面这段代码有错吗?

abstract class Something {
  private abstract String doSomething ();
}
  答: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract method封锁起来呢? (同理,abstract method前不能加final)。

  (4)下面这段代码有什么错误?

public class Something {
  public int addOne(final int x) {
    return ++x;
  }
}
  答: 这个错误比较明显。int x被修饰成final,意味着x不能在addOne method中被修改。

  (5) 下面这段代码有错吗?

public class Something {
  public static void main(String[] args) {
    Other o = new Other();
    new Something().addOne(o);
  }

  public void addOne(final Other o) {
    o.i++;
  }
}

class Other {
  public int i;
}

  答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference
(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable
(成员变量),而o的reference并没有改变。

  (6) 下面这段代码有错吗?

class Something {
  int i;
  public void doSomething() {
    System.out.println("i = " + i);
  }
}
   答案: 正确。输出的是"i = 0"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

  (7) 和上面一题只有一个地方不同,就是多了一个final。下面这段代码有错吗?

class Something {
  final int i;

  public void doSomething() {
    System.out.println("i = " + i);
  }
}

  答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int i = 0;"。

  (8) 下面这段代码看上去很完美,错在哪里呢?

public class Something {
  public static void main(String[] args) {
    Something s = new Something();
    System.out.println("s.doSomething() returns " + doSomething());
  }

  public String doSomething() {
    return "Do something ...";
  }
}

  答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能访问non-static instant variable。

  (9) 此处Something类的文件名叫OtherThing.java

class Something {
  private static void main(String[] something_to_do) {       
    System.out.println("Do something ...");
  }
}
  答案: 从没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同,错误,main一定是public的。

  (10) 下面这段代码有错吗?

interface A {
  int x = 0;
}

class B {
  int x =1;
}

class C extends B implements A {
  public void pX(){
    System.out.println(x);
  }

  public static void main(String[] args) {
    new C().pX();
  }
}

  答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。

  (11) 这个错误不容易发现

interface Playable {
  void play();
}

interface Bounceable {
  void play();
}

interface Rollable extends Playable, Bounceable {
  Ball ball = new Ball("PingPang");
}
class Ball implements Rollable {
  private String name;

  public String getName() {
    return name;
  }

  public Ball(String name) {
    this.name = name;       
  }

  public void play() {
    ball = new Ball("Football");
    System.out.println(ball.getName());
  }
}

  答案: 错。"interface Rollable extends Playable, Bounceable"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。

150、设计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();
   }
   }
  }
}

6、 线程的基本概念、线程的本状态以及状态之间的关系
?新建 (Born) : 新建的线程处于新建状态?就绪 (Ready) : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用?运行 (Running) : 线程在开始执行时进入运行状态?睡眠 (Sleeping) : 线程的执行可通过使用 sleep() 方法来暂时中止。在睡眠后,线程将进入就绪状态?等待 (Waiting) : 如果调用了 wait() 方法,线程将处于等待状态。用于在两个或多个线程并发运行时。?挂起 (Suspended) : 在临时停止或中断线程的执行时,线程就处于挂起状态。?恢复 (Resume) : 在挂起的线程被恢复执行时,可以说它已被恢复。?阻塞 (Blocked) – 在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。?死亡 (Dead) – 在 run() 方法已完成执行或其 stop() 方法被调用之后,线程就处于死亡状态。 5、 串行化的注意事项以及如何实现串行化答:如果有循环引用是不可以串行化的。对象输出流的WriteObject方法和 对象输入流的ReadObect 方法
7、 线程的同步、如何实现线程的同步答:当两个或多个线程同时访问同一个变量,并且以个线程需要修改这个变量。就要用到线程同步。在Java 中,同步是通过 synchronized 关键字来定义的。 诺是想同步化某程序段,可以使用 synchronized(object){}方法,其中{}内的程序语句被同步化。

9、 socket通信(tcp/udp区别及JAVA的实现方式)TCP——传输控制协议,具有极高的可靠性,保证数据包按照顺序准确到达,但其也有着很高的额外负担。UDP——使用者数据元协议,并不能保证数据包会被成功的送达,也不保证数据包到达的顺序,但其传输速度很快。大多数我们会使用TCP,偶尔才会动用UDP,如声音讯号,即使少量遗失,也无        关紧要。

10、 JAVA的事件委托机制和垃圾回收机制
java 事件委托机制的概念,一个源产生一个事件并将它送到一个或多个监听器那里。在这种方案中,监听器简单的等待,直到它收到一个事件。一旦事件被接受,监听器将处理这个事件,然后返回。垃圾回收机制 垃圾收集是将分配给对象但不在使用的内存回收或释放的过程。如果一个对象没有指向它的引用或者其赋值为null,则次对象适合进行垃圾回收

11、 JDBC调用数据库的基本步骤导入必要的类,装入JDBC驱动程序,识别数据源,分配一个Connection对象,分配一个Statement对象,使用Statement执行一个查询,从返回的ResultSet对象中检索数据,关闭ResultSet,关闭Statement对象,关闭Connection对象

12、 解析XML文件的几种方式和区别答:Dom解析 在内存中创建一个DOM树,能随机访问文件内容,也可以修改原文件内容SAX解析 线性解析,不能随机访问,也无法修改原文件Dom解析要先用SAX解析创建DOM树

13、 JAVA的四种基本权限的定义public private protected 默认

14、 JAVA的国际化  答:Java 中提供了诺干国际化明感类,来实现国际化的。例如:dateformat  timezone 等等。

5、 servlet的配置
<web-app></web-app><servlet></servlet><servlet-name></servlet-name>Admin<servlet-class></servlet-class>jb-aptech.adminservlet<init-param></init-param> <param-name></param-name> email <param-value></param-value> [email protected]

16、 谈谈你对swing mvc模式的理解?
答:Swing号称是完全按照MVC的思路来进行设计的。在设计开始前,Swing的希望能够达到的目标就包括:
模型驱动(Model-Driven)的编程方式。 提供一套单一的API,但是能够支持多种视感(look-and-feel),为用户提供不同的界面。 严格的说,Swing中的MVC实际上是MVC的一个变体:M-VC。 Swing中只显示的定义了Model接口,而在一个UI对象中集成了视图和控制器的部分机制。View和Control比较松散的交叉组合在一起,而更多的控制逻辑是在事件监听者部分引入的。 但是,这并没有妨碍在Swing中体现MVC的精髓。事实上,在Swing的开发初期,Swing确实是按照标准的MVC模式来设计的,但是很快的问题就出现了:View和Controller实际上是紧密耦合的,很难作出一个能够适应不同View的一般化的Controller来,而且,一般也没有很大的必要。

18、 Java程序怎么优化?答:提高JAVA的性能,一般考虑如下的四个主要方面:
程序设计的方法和模式  (2) JAVA布署的环境。  (3) JAVA应用程序的实现 (4) 硬件和操作系统 为了提高JAVA程序的性能,需要遵循如下的六个步骤。 a) 明确对性能的具体要求 b) 了解当前程序的性能 c) 找到程序的性能瓶颈  d) 采取适当的措施来提高性能 e) 只进行某一方面的修改来提高性能 f) 返回到步骤c,继续作类似的工作,一直达到要求的性能为止。 

动态查询如何实现?表的结构变化后,如果不需要修改程序,如何设计和实现查询?答:讲查询封装进存储过程中,通过调用存储过程实现动态调用;表结构发生变化后修改相应的存储过程即可再不修改程序的情况下实现查询。

2、 如何优化数据库,如何提高数据库的性能?答:优化数据库主要是优化查询语句,通过高性能的查询语句提高数据库的性能。

3、 设计数据库应注意那些问题答:首先应尽量满足三范式的要求,在一定程度上打破3范式的要求以提高数据库的性能。

4、 表与表之间的关联关系答:分为3种:一对一、一对多、多对多。

5、 主键和外键的区别答:主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。

3. 数据类型之间的转换  如何将数值型字符转换为数字(Integer,Double)  如何将数字转换为字符  如何去小数点前两位,并四舍五入。

4. 日期和时间  如何取得年月日,小时分秒Date dat=new Date();dat.getYear();dat.getMonth();dat.getDay();dat.getHours();...
如何取得从1970年到现在的毫秒数long now=dat.getTime();如何获取某个日期是当月的最后一天如何格式化日期
DateFormate df=DateFormate.getInstance();df.Format(dat);

6. 文件和目录(I/O)操作  如何列出某个目录下的所有文件  如何列出某个目录下的所有子目录  判断一个文件或目录是否存在  如何读写文件

6. 文件和目录(I/O)操作  如何列出某个目录下的所有文件  如何列出某个目录下的所有子目录  判断一个文件或目录是否存在  如何读写文件

4. 描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理。
Cookie是在客户端开辟的一块可长期存储用户信息的地方;

8. 描述一下你最常用的编程风格。

(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。

(2) 为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素的定义:equals()hashCode()toString()clone()(implement Cloneable)implement Serializable

(3) 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。

(4) 应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。

(5) 设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。

(6) 使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议:一个复杂的开关语句:考虑采用“多形”机制数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现许多成员变量在特征上有很大的差别:考虑使用几个类

(7) 让一切东西都尽可能地“私有”——private。可使库的某一部分“公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素——只有private字段才能在非同步使用的情况下受到保护。

(8) 谨惕“巨大对象综合症”。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。

(9) 若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。

(10) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的“用内部类改进代码”)。

(11) 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。

(12) 避免使用“魔术数字”,这些数字很难与代码很好地配合。如以后需要修改它,无疑会成为一场噩梦,因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”。所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。

(13) 涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何异常——如果它造成了那个对象的创建失败。这样一来,调用者就不会以为那个对象已正确地创建,从而盲目地继续。

(14) 当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表明自己的用途。除此以外,可在类内放置一个boolean(布尔)标记,指出对象是否已被清除。在类的finalize()方法里,请确定对象已被

你可能感兴趣的:(java,设计模式,多线程,编程,面试)