日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

某高人整理的Java就業(yè)面試題大全【2】

 londonKu 2012-05-06
4. 算法與編程

1.判斷身份證:要么是15位,要么是18位,最后一位可以為字母,并寫程序提出其中的年月日。


答:我們可以用正則表達式來定義復雜的字符串格式,(\d{17}[0-9a-zA-Z]|\d{14}[0-9a-zA-Z])可以用來判斷是否為合法的15位或18位身份證號碼。
因為15位和18位的身份證號碼都是從7位到第12位為身份證為日期類型。這樣我們可以設計出更精確的正則模式,使身份證號的日期合法,這樣我們的正則模 式可以進一步將日期部分的正則修改為[12][0-9]{3}[01][0-9][123][0-9],當然可以更精確的設置日期。

在jdk的java.util.Regex包中有實現(xiàn)正則的類,Pattern和Matcher。以下是實現(xiàn)代碼:

  1. import java.util.regex.Matcher;  
  2. import java.util.regex.Pattern;  
  3.   
  4. public class RegexTest {  
  5.   
  6. /** 
  7. * @param args 
  8. */  
  9. public static void main(String[] args) {  
  10.   
  11. // 測試是否為合法的身份證號碼  
  12. String[] strs = { "130681198712092019""13068119871209201x",  
  13. "13068119871209201""123456789012345""12345678901234x",  
  14. "1234567890123" };  
  15. Pattern p1 = Pattern.compile("(\\d{17}[0-9a-zA-Z]|\\d{14}[0-9a-zA-Z])");  
  16. for (int i = 0; i < strs.length; i++) {  
  17. Matcher matcher = p1.matcher(strs[i]);  
  18. System.out.println(strs[i] + ":" + matcher.matches());  
  19. }  
  20.   
  21. Pattern p2 = Pattern.compile("\\d{6}(\\d{8}).*"); // 用于提取出生日字符串  
  22. Pattern p3 = Pattern.compile("(\\d{4})(\\d{2})(\\d{2})");// 用于將生日字符串進行分解為年月日  
  23. for (int i = 0; i < strs.length; i++) {  
  24. Matcher matcher = p2.matcher(strs[i]);  
  25. boolean b = matcher.find();  
  26. if (b) {  
  27. String s = matcher.group(1);  
  28. Matcher matcher2 = p3.matcher(s);  
  29. if (matcher2.find()) {  
  30. System.out  
  31. .println("生日為" + matcher2.group(1) + "年"  
  32. + matcher2.group(2) + "月"  
  33. + matcher2.group(3) + "日");  
  34. }  
  35. }  
  36.   
  37. }  
  38.   
  39. }  
  40.   
  41. }  

1、編寫一個程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合并到c.txt文件中,a.txt文件中的單詞用回車符分隔,b.txt文件中用回車或空格進行分隔。
答:

  1. package cn.itcast;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileReader;  
  5. import java.io.FileWriter;  
  6.   
  7. public class MainClass{  
  8. public static void main(String[] args) throws Exception{  
  9. FileManager a = new FileManager("a.txt",new char[]{'\n'});  
  10. FileManager b = new FileManager("b.txt",new char[]{'\n',' '});    
  11. FileWriter c = new FileWriter("c.txt");  
  12. String aWord = null;  
  13. String bWord = null;  
  14. while((aWord = a.nextWord()) !=null ){  
  15. c.write(aWord + "\n");  
  16. bWord = b.nextWord();  
  17. if(bWord != null)  
  18. c.write(bWord + "\n");  
  19. }  
  20.   
  21. while((bWord = b.nextWord()) != null){  
  22. c.write(bWord + "\n");  
  23. }     
  24. c.close();  
  25. }  
  26.   
  27. }  
  28.   
  29.   
  30. class FileManager{  
  31.   
  32. String[] words = null;  
  33. int pos = 0;  
  34. public FileManager(String filename,char[] seperators) throws Exception{  
  35. File f = new File(filename);  
  36. FileReader reader = new FileReader(f);  
  37. char[] buf = new char[(int)f.length()];  
  38. int len = reader.read(buf);  
  39. String results = new String(buf,0,len);  
  40. String regex = null;  
  41. if(seperators.length >1 ){  
  42. regex = "" + seperators[0] + "|" + seperators[1];  
  43. }else{  
  44. regex = "" + seperators[0];  
  45. }  
  46. words = results.split(regex);  
  47. }  
  48.   
  49. public String nextWord(){  
  50. if(pos == words.length)  
  51. return null;  
  52. return words[pos++];  
  53. }  
  54.   
  55. }  

1、編寫一個程序,將d:\java目錄下的所有.java文件復制到d:\jad目錄下,并將原來文件的擴展名從.java改為.jad。
(大家正在做上面這道題,網(wǎng)上遲到的朋友也請做做這道題,找工作必須能編寫這些簡單問題的代碼?。?br> 答:listFiles方法接受一個FileFilter對象,這個FileFilter對象就是過慮的策略對象,不同的人提供不同的FileFilter實現(xiàn),即提供了不同的過濾策略。

  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileOutputStream;  
  4. import java.io.FilenameFilter;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8.   
  9. public class Jad2Java {  
  10.   
  11. public static void main(String[] args) throws Exception {  
  12. File srcDir = new File("java");  
  13. if(!(srcDir.exists() && srcDir.isDirectory()))  
  14. throw new Exception("目錄不存在");  
  15. File[] files = srcDir.listFiles(  
  16. new FilenameFilter(){  
  17.   
  18. public boolean accept(File dir, String name) {  
  19. return name.endsWith(".java");  
  20. }  
  21.   
  22. }  
  23. );  
  24.   
  25. System.out.println(files.length);  
  26. File destDir = new File("jad");  
  27. if(!destDir.exists()) destDir.mkdir();  
  28. for(File f :files){  
  29. FileInputStream fis = new FileInputStream(f);  
  30. String destFileName = f.getName().replaceAll("\\.javatiny_mce_markerquot;, ".jad");  
  31. FileOutputStream fos = new FileOutputStream(new File(destDir,destFileName));  
  32. copy(fis,fos);  
  33. fis.close();  
  34. fos.close();  
  35. }  
  36. }  
  37.   
  38. private static void copy(InputStream ips,OutputStream ops) throws Exception{  
  39. int len = 0;  
  40. byte[] buf = new byte[1024];  
  41. while((len = ips.read(buf)) != -1){  
  42. ops.write(buf,0,len);  
  43. }  
  44.   
  45. }  
  46. }  

由本題總結(jié)的思想及策略模式的解析:
1.
class jad2java{
1. 得到某個目錄下的所有的java文件集合
1.1 得到目錄 File srcDir = new File("d:\\java");
1.2 得到目錄下的所有java文件:File[] files = srcDir.listFiles(new MyFileFilter());
1.3 只想得到.java的文件
: class MyFileFilter implememyts FileFilter{
public boolean accept(File pathname){
return pathname.getName().endsWith(".java")
}
}


2.將每個文件復制到另外一個目錄,并改擴展名
2.1 得到目標目錄,如果目標目錄不存在,則創(chuàng)建之
2.2 根據(jù)源文件名得到目標文件名,注意要用正則表達式,注意.的轉(zhuǎn)義。
2.3 根據(jù)表示目錄的File和目標文件名的字符串,得到表示目標文件的File。
//要在硬盤中準確地創(chuàng)建出一個文件,需要知道文件名和文件的目錄。 
2.4 將源文件的流拷貝成目標文件流,拷貝方法獨立成為一個方法,方法的參數(shù)采用抽象流的形式。
//方法接受的參數(shù)類型盡量面向父類,越抽象越好,這樣適應面更寬廣。

}


分析listFiles方法內(nèi)部的策略模式實現(xiàn)原理
File[] listFiles(FileFilter filter){
File[] files = listFiles();
//Arraylist acceptedFilesList = new ArrayList();
File[] acceptedFiles = new File[files.length];
int pos = 0;
for(File file: files){
boolean accepted = filter.accept(file);
if(accepted){
//acceptedFilesList.add(file);
acceptedFiles[pos++] = file;
}
}


Arrays.copyOf(acceptedFiles,pos);
//return (File[])accpetedFilesList.toArray();


}


1、編寫一個截取字符串的函數(shù),輸入為一個字符串和字節(jié)數(shù),輸出為按字節(jié)截取的字符串,但要保證漢字不被截取半個,如"我ABC",4,應該截取"我AB",輸入"我ABC漢DEF",6,應該輸出"我ABC",而不是"我ABC+漢的半個"。
答:
首先要了解中文字符有多種編碼及各種編碼的特征。
假設n為要截取的字節(jié)數(shù)。

  1. public static void main(String[] args) throws Exception{  
  2. String str = "我a愛中華abc我愛傳智def';  
  3. String str = "我ABC漢";  
  4. int num = trimGBK(str.getBytes("GBK"),5);  
  5. System.out.println(str.substring(0,num) );  
  6. }  
  7.   
  8. public static int trimGBK(byte[] buf,int n){  
  9. int num = 0;  
  10. boolean bChineseFirstHalf = false;  
  11. for(int i=0;i<n;i++)  
  12. {  
  13. if(buf[i]<0 && !bChineseFirstHalf){  
  14. bChineseFirstHalf = true;  
  15. }else{  
  16. num++;  
  17. bChineseFirstHalf = false;    
  18. }  
  19. }  
  20. return num;  
  21. }  

1、有一個字符串,其中包含中文字符、英文字符和數(shù)字字符,請統(tǒng)計和打印出各個字符的個數(shù)。
答:哈哈,其實包含中文字符、英文字符、數(shù)字字符原來是出題者放的煙霧彈。

  1. String content = "中國aadf的111薩bbb菲的zz薩菲";  
  2. HashMap map = new HashMap();  
  3. for(int i=0;i<content.length;i++)  
  4. {  
  5. char c = content.charAt(i);  
  6. Integer num = map.get(c);  
  7. if(num == null)  
  8. num = 1;  
  9. else  
  10. num = num + 1;  
  11. map.put(c,num);  
  12. }   
  13. for(Map.EntrySet entry : map)  
  14. {  
  15. system.out.println(entry.getkey() + ":" + entry.getValue());  
  16. }  

估計是當初面試的那個學員表述不清楚,問題很可能是:
如果一串字符如"aaaabbc中國1512"要分別統(tǒng)計英文字符的數(shù)量,中文字符的數(shù)量,和數(shù)字字符的數(shù)量,假設字符中沒有中文字符、英文字符、數(shù)字字符之外的其他特殊字符。

  1. int engishCount;  
  2. int chineseCount;  
  3. int digitCount;  
  4. for(int i=0;i<str.length;i++)  
  5. {  
  6. char ch = str.charAt(i);  
  7. if(ch>='0' && ch<='9')  
  8. {  
  9. digitCount++  
  10. }  
  11. else if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))  
  12. {  
  13. engishCount++;  
  14. }  
  15. else  
  16. {  
  17. chineseCount++;  
  18. }  
  19. }  
  20. System.out.println(...............);  



1、說明生活中遇到的二叉樹,用java實現(xiàn)二叉樹
這是組合設計模式。

我有很多個(假設10萬個)數(shù)據(jù)要保存起來,以后還需要從保存的這些數(shù)據(jù)中檢索是否存在某個數(shù)據(jù),(我想說出二叉樹的好處,該怎么說呢?那就是說別人的缺 點),假如存在數(shù)組中,那么,碰巧要找的數(shù)字位于99999那個地方,那查找的速度將很慢,因為要從第1個依次往后取,取出來后進行比較。平衡二叉樹(構(gòu) 建平衡二叉樹需要先排序,我們這里就不作考慮了)可以很好地解決這個問題,但二叉樹的遍歷(前序,中序,后序)效率要比數(shù)組低很多,原理如下圖:



代碼如下:

  1. package com.huawei.interview;  
  2.   
  3. public class Node {  
  4. public int value;  
  5. public Node left;  
  6. public Node right;  
  7.   
  8. public void store(int value)  
  9. {  
  10. if(value<this.value)  
  11. {  
  12. if(left == null)  
  13. {  
  14. left = new Node();  
  15. left.value=value;  
  16. }  
  17. else  
  18. {  
  19. left.store(value);  
  20. }  
  21. }  
  22. else if(value>this.value)  
  23. {  
  24. if(right == null)  
  25. {  
  26. right = new Node();  
  27. right.value=value;  
  28. }  
  29. else  
  30. {  
  31. right.store(value);  
  32. }     
  33. }  
  34. }  
  35.   
  36. public boolean find(int value)  
  37. {     
  38. System.out.println("happen " + this.value);  
  39. if(value == this.value)  
  40. {  
  41. return true;  
  42. }  
  43. else if(value>this.value)  
  44. {  
  45. if(right == nullreturn false;  
  46. return right.find(value);  
  47. }else  
  48. {  
  49. if(left == nullreturn false;  
  50. return left.find(value);  
  51. }  
  52.   
  53. }  
  54.   
  55. public void preList()  
  56. {  
  57. System.out.print(this.value + ",");  
  58. if(left!=null) left.preList();  
  59. if(right!=null) right.preList();  
  60. }  
  61.   
  62. public void middleList()  
  63. {  
  64. if(left!=null) left.preList();  
  65. System.out.print(this.value + ",");  
  66. if(right!=null) right.preList();      
  67. }  
  68. public void afterList()  
  69. {  
  70. if(left!=null) left.preList();  
  71. if(right!=null) right.preList();  
  72. System.out.print(this.value + ",");   
  73. }     
  74. public static void main(String [] args)  
  75. {  
  76. int [] data = new int[20];  
  77. for(int i=0;i<data.length;i++)  
  78. {  
  79. data[i] = (int)(Math.random()*100) + 1;  
  80. System.out.print(data[i] + ",");  
  81. }  
  82. System.out.println();  
  83.   
  84. Node root = new Node();  
  85. root.value = data[0];  
  86. for(int i=1;i<data.length;i++)  
  87. {  
  88. root.store(data[i]);  
  89. }  
  90.   
  91. root.find(data[19]);  
  92.   
  93. root.preList();  
  94. System.out.println();  
  95. root.middleList();  
  96. System.out.println();     
  97. root.afterList();  
  98. }  
  99. }  

-----------------又一次臨場寫的代碼---------------------------

  1. import java.util.Arrays;  
  2. import java.util.Iterator;  
  3.   
  4. public class Node {  
  5. private Node left;  
  6. private Node right;  
  7. private int value;  
  8. //private int num;  
  9.   
  10. public Node(int value){  
  11. this.value = value;  
  12. }  
  13. public void add(int value){  
  14.   
  15. if(value > this.value)  
  16. {  
  17. if(right != null)  
  18. right.add(value);  
  19. else  
  20. {  
  21. Node node = new Node(value);      
  22. right = node;  
  23. }  
  24. }  
  25. else{  
  26. if(left != null)  
  27. left.add(value);  
  28. else  
  29. {  
  30. Node node = new Node(value);      
  31. left = node;  
  32. }     
  33. }  
  34. }  
  35.   
  36. public boolean find(int value){  
  37. if(value == this.value) return true;  
  38. else if(value > this.value){  
  39. if(right == nullreturn false;  
  40. else return right.find(value);  
  41. }else{  
  42. if(left == nullreturn false;  
  43. else return left.find(value);     
  44. }  
  45.   
  46. }  
  47.   
  48. public void display(){  
  49. System.out.println(value);  
  50. if(left != null) left.display();  
  51. if(right != null) right.display();  
  52.   
  53. }  
  54.   
  55. /*public Iterator iterator(){ 
  56.  
  57. }*/  
  58.   
  59. public static void main(String[] args){  
  60. int[] values = new int[8];  
  61. for(int i=0;i<8;i++){  
  62. int num = (int)(Math.random() * 15);  
  63. //System.out.println(num);  
  64. //if(Arrays.binarySearch(values, num)<0)  
  65. if(!contains(values,num))  
  66. values[i] = num;  
  67. else  
  68. i--;  
  69. }  
  70.   
  71. System.out.println(Arrays.toString(values));  
  72.   
  73. Node root = new Node(values[0]);  
  74. for(int i=1;i<values.length;i++){  
  75. root.add(values[i]);  
  76. }  
  77.   
  78. System.out.println(root.find(13));  
  79.   
  80. root.display();  
  81.   
  82. }  
  83.   
  84. public static boolean contains(int [] arr, int value){  
  85. int i = 0;  
  86. for(;i<arr.length;i++){  
  87. if(arr[i] == value) return true;  
  88.   
  89. }  
  90. return false;  
  91. }  
  92.   
  93. }  

1、從類似如下的文本文件中讀取出所有的姓名,并打印出重復的姓名和重復的次數(shù),并按重復次數(shù)排序:
1,張三,28
2,李四,35
3,張三,28
4,王五,35
5,張三,28
6,李四,35
7,趙六,28
8,田七,35


程序代碼如下(答題要博得用人單位的喜歡,包名用該公司,面試前就提前查好該公司的網(wǎng)址,如果查不到,現(xiàn)場問也是可以的。還要加上實現(xiàn)思路的注釋):

  1. package com.huawei.interview;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.util.Comparator;  
  8. import java.util.HashMap;  
  9. import java.util.Iterator;  
  10. import java.util.Map;  
  11. import java.util.TreeSet;  
  12.   
  13.   
  14. public class GetNameTest {  
  15.   
  16. /** 
  17. * @param args 
  18. */  
  19. public static void main(String[] args) {  
  20. // TODO Auto-generated method stub  
  21. //InputStream ips = GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt");  
  22. //用上一行注釋的代碼和下一行的代碼都可以,因為info.txt與GetNameTest類在同一包下面,所以,可以用下面的相對路徑形式  
  23.   
  24. Map results = new HashMap();  
  25. InputStream ips = GetNameTest.class.getResourceAsStream("info.txt");  
  26. BufferedReader in = new BufferedReader(new InputStreamReader(ips));  
  27. String line = null;  
  28. try {  
  29. while((line=in.readLine())!=null)  
  30. {  
  31. dealLine(line,results);  
  32. }  
  33. sortResults(results);  
  34. catch (IOException e) {  
  35. // TODO Auto-generated catch block  
  36. e.printStackTrace();  
  37. }  
  38. }  
  39.   
  40. static class User  
  41. {  
  42. public String name;  
  43. public Integer value;  
  44. public User(String name,Integer value)  
  45. {  
  46. this.name = name;  
  47. this.value = value;  
  48. }  
  49.   
  50. @Override  
  51. public boolean equals(Object obj) {  
  52. // TODO Auto-generated method stub  
  53.   
  54. //下面的代碼沒有執(zhí)行,說明往treeset中增加數(shù)據(jù)時,不會使用到equals方法。  
  55. boolean result = super.equals(obj);  
  56. System.out.println(result);  
  57. return result;  
  58. }  
  59. }  
  60.   
  61. private static void sortResults(Map results) {  
  62. // TODO Auto-generated method stub  
  63. TreeSet sortedResults = new TreeSet(  
  64. new Comparator(){  
  65. public int compare(Object o1, Object o2) {  
  66. // TODO Auto-generated method stub  
  67. User user1 = (User)o1;  
  68. User user2 = (User)o2;  
  69. /*如果compareTo返回結(jié)果0,則認為兩個對象相等,新的對象不會增加到集合中去 
  70. * 所以,不能直接用下面的代碼,否則,那些個數(shù)相同的其他姓名就打印不出來。 
  71. * */  
  72.   
  73. //return user1.value-user2.value;  
  74. //return user1.value<user2.value?-1:user1.value==user2.value?0:1;  
  75. if(user1.value<user2.value)  
  76. {  
  77. return -1;  
  78. }else if(user1.value>user2.value)  
  79. {  
  80. return 1;  
  81. }else  
  82. {  
  83. return user1.name.compareTo(user2.name);  
  84. }  
  85. }  
  86.   
  87. }  
  88. );  
  89. Iterator iterator = results.keySet().iterator();  
  90. while(iterator.hasNext())  
  91. {  
  92. String name = (String)iterator.next();  
  93. Integer value = (Integer)results.get(name);  
  94. if(value > 1)  
  95. {     
  96. sortedResults.add(new User(name,value));      
  97. }  
  98. }  
  99.   
  100. printResults(sortedResults);  
  101. }  
  102. private static void printResults(TreeSet sortedResults)   
  103. {  
  104. Iterator iterator = sortedResults.iterator();  
  105. while(iterator.hasNext())  
  106. {  
  107. User user = (User)iterator.next();  
  108. System.out.println(user.name + ":" + user.value);  
  109. }     
  110. }  
  111. public static void dealLine(String line,Map map)  
  112. {  
  113. if(!"".equals(line.trim()))  
  114. {  
  115. String [] results = line.split(",");  
  116. if(results.length == 3)  
  117. {  
  118. String name = results[1];  
  119. Integer value = (Integer)map.get(name);  
  120. if(value == null) value = 0;  
  121. map.put(name,value + 1);  
  122. }  
  123. }  
  124. }  
  125.   
  126. }  

48、寫一個Singleton出來。
第一種:飽漢模式
public class SingleTon {
private SingleTon(){
}


//實例化放在靜態(tài)代碼塊里可提高程序的執(zhí)行效率,但也可能更占用空間
private final static SingleTon instance = new SingleTon();
public static SingleTon getInstance(){
return instance;
}
}


第二種:饑漢模式
public class SingleTon {
private SingleTon(){}


private static instance = null;//new SingleTon();


public static synchronized SingleTon getInstance(){
if(instance == null)
instance = new SingleTon();
return instance;
}
}


第三種:用枚舉
public enum SingleTon{
ONE;


}


第三:更實際的應用(在什么情況用單例)
public class SequenceGenerator{
//下面是該類自身的業(yè)務功能代碼
private int count = 0;


public synchronized int getSequence(){
++count;
}


//下面是把該類變成單例的代碼
private SequenceGenerator(){}
private final static instance = new SequenceGenerator();
public static SingleTon getInstance(){
return instance;
}


}


第四:
public class MemoryDao
{
private HashMap map = new HashMap();


public void add(Student stu1){ 
map.put(SequenceGenerator.getInstance().getSequence(),stu1);
}


//把MemoryDao變成單例 
}




Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。 
一般Singleton模式通常有幾種種形式: 
第一種形式: 定義一個類,它的構(gòu)造函數(shù)為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調(diào)用其中的方法。 
public class Singleton { 
private Singleton(){} 
//在自己內(nèi)部定義自己一個實例,是不是很奇怪? 
//注意這是private 只供內(nèi)部調(diào)用 
private static Singleton instance = new Singleton(); 
//這里提供了一個供外部訪問本class的靜態(tài)方法,可以直接訪問   
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;   


其他形式: 
定義一個類,它的構(gòu)造函數(shù)為private的,所有方法為static的。 
一般認為第一種形式要更加安全些 


7、遞歸算法題1
一個整數(shù),大于0,不用循環(huán)和本地變量,按照n,2n,4n,8n的順序遞增,當值大于5000時,把值按照指定順序輸出來。
例:n=1237
則輸出為:
1237,
2474,
4948,
9896,
9896,
4948,
2474,
1237,
提示:寫程序時,先致謝按遞增方式的代碼,寫好遞增的以后,再增加考慮遞減部分。
public static void doubleNum(int n)
{
System.out.println(n);
if(n<=5000)
doubleNum(n*2);
System.out.println(n);
}




7、遞歸算法題2
第1個人10,第2個比第1個人大2歲,依次遞推,請用遞歸方式計算出第8個人多大?

  1. package cn.itcast;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class A1 {  
  6.   
  7. public static void main(String [] args)  
  8. {  
  9. System.out.println(computeAge(8));  
  10. }  
  11.   
  12. public static int computeAge(int n)  
  13. {  
  14. if(n==1return 10;  
  15. return computeAge(n-1) + 2;  
  16. }  
  17. }  
  18.   
  19. public static void toBinary(int n,StringBuffer result)  
  20. {  
  21.   
  22. if(n/2 != 0)  
  23. toBinary(n/2,result);  
  24. result.append(n%2);   
  25. }  

94、排序都有哪幾種方法?請列舉。用JAVA實現(xiàn)一個快速排序。 
本人只研究過冒泡排序、選擇排序和快速排序,下面是快速排序的代碼:

  1. public class QuickSort {  
  2. /** 
  3. * 快速排序 
  4. * @param strDate 
  5. * @param left 
  6. * @param right 
  7. */  
  8. public void quickSort(String[] strDate,int left,int right){  
  9. String middle,tempDate;  
  10. int i,j;  
  11. i=left;  
  12. j=right;  
  13. middle=strDate[(i+j)/2];  
  14. do{  
  15. while(strDate[i].compareTo(middle)<0&& i<right)  
  16. i++; //找出左邊比中間值大的數(shù)  
  17. while(strDate[j].compareTo(middle)>0&& j>left)  
  18. j--; //找出右邊比中間值小的數(shù)  
  19. if(i<=j){ //將左邊大的數(shù)和右邊小的數(shù)進行替換   
  20. tempDate=strDate[i];  
  21. strDate[i]=strDate[j];  
  22. strDate[j]=tempDate;  
  23. i++;  
  24. j--;  
  25. }  
  26. }while(i<=j); //當兩者交錯時停止  
  27.   
  28. if(i<right){  
  29. quickSort(strDate,i,right);//從  
  30. }  
  31. if(j>left){  
  32. quickSort(strDate,left,j);  
  33. }  
  34. }  
  35. /** 
  36. * @param args 
  37. */  
  38. public static void main(String[] args){  
  39. String[] strVoid=new String[]{"11","66","22","0","55","22","0","32"};  
  40. QuickSort sort=new QuickSort();  
  41. sort.quickSort(strVoid,0,strVoid.length-1);  
  42. for(int i=0;i<strVoid.length;i++){  
  43. System.out.println(strVoid[i]+" ");  
  44. }  
  45. }  
  46.   
  47.   
  48. }  

7、有數(shù)組a[n],用java代碼將數(shù)組元素順序顛倒
//用下面的也可以
//for(int i=0,int j=a.length-1;i<j;i++,j--) 是否等效于 for(int i=0;i<a.length/2;i++)呢?

  1. import java.util.Arrays;  
  2.   
  3. public class SwapDemo{  
  4.   
  5. public static void main(String[] args){  
  6. int [] a = new int[]{  
  7. (int)(Math.random() * 1000),  
  8. (int)(Math.random() * 1000),  
  9. (int)(Math.random() * 1000),  
  10. (int)(Math.random() * 1000),      
  11. (int)(Math.random() * 1000)   
  12. };    
  13.   
  14. System.out.println(a);  
  15. System.out.println(Arrays.toString(a));  
  16. swap(a);  
  17. System.out.println(Arrays.toString(a));   
  18. }  
  19.   
  20. public static void swap(int a[]){  
  21. int len = a.length;  
  22. for(int i=0;i<len/2;i++){  
  23. int tmp = a[i];  
  24. a[i] = a[len-1-i];  
  25. a[len-1-i] = tmp;  
  26. }  
  27. }  
  28. }  

2.金額轉(zhuǎn)換,阿拉伯數(shù)字的金額轉(zhuǎn)換成中國傳統(tǒng)的形式如:(¥1011)->(一千零一拾一元整)輸出。
去零的代碼:

return sb.reverse().toString().replaceAll("零[拾佰仟]","零").replaceAll("零+萬","萬").replaceAll("零+元","元").replaceAll("零+","零");

  1. public class RenMingBi {  
  2.   
  3. /** 
  4. * @param args add by zxx ,Nov 29, 2008 
  5. */  
  6. private static final char[] data = new char[]{  
  7. '零','壹','貳','叁','肆','伍','陸','柒','捌','玖'  
  8. };   
  9. private static final char[] units = new char[]{  
  10. '元','拾','佰','仟','萬','拾','佰','仟','億'  
  11. };  
  12. public static void main(String[] args) {  
  13. // TODO Auto-generated method stub  
  14. System.out.println(  
  15. convert(135689123));  
  16. }  
  17.   
  18. public static String convert(int money)  
  19. {  
  20. StringBuffer sbf = new StringBuffer();  
  21. int unit = 0;  
  22. while(money!=0)  
  23. {  
  24. sbf.insert(0,units[unit++]);  
  25. int number = money%10;  
  26. sbf.insert(0, data[number]);  
  27. money /= 10;  
  28. }  
  29.   
  30. return sbf.toString();  
  31. }  
  32. }  

5. html&JavaScript&ajax部分


1. 判斷第二個日期比第一個日期大
如何用腳本判斷用戶輸入的的字符串是下面的時間格式2004-11-21 必須要保證用戶的輸入是此格式,并且是時間,比如說月份不大于12等等,另外我需要用戶輸入兩個,并且后一個要比前一個晚,只允許用JAVASCRIPT,請詳細幫助作答,, 
//這里可用正則表達式判斷提前判斷一下格式,然后按下提取各時間字段內(nèi)容
<script type="text/javascript">
window.onload = function()
{
//這么寫是為了實現(xiàn)js代碼與html代碼的分離,當我修改js時,不能影響html代碼。
document.getElementById("frm1").onsubmit = 
function(){
var d1 = this.d1.value;
var d2 = this.d2.value;
if(!verifyDate (d1)) {alert("第一個日期格式不對");return false;}
if(!verifyDate (d2)) {alert("第二個日期格式不對");return false;}
if(!compareDate(d1,d2)) {alert("第二個日期比第一日期小");return false;}
};
}


function compareDate(d1,d2)
{
var arrayD1 = d1.split("-");
var date1 = new Date(arrayD1[0],arrayD1[1],arrayD1[2]);
var arrayD2 = d2.split("-");
var date2 = new Date(arrayD2[0],arrayD2[1],arrayD2[2]);
if(date1 > date2) return false;
return true;



function verifyDate(d)
{
var datePattern = /^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\d|3[0-1])$/;
return datePattern.test(d);
}
</script>


<form id="frm1" action="xxx.html">
<input type="text" name="d1" />
<input type="text" name="d2" />
<input type="submit"/>
</form>
1. 用table顯示n條記錄,每3行換一次顏色,即1,2,3用紅色字體,4,5,6用綠色字體,7,8,9用紅顏色字體。
<body>
<table id="tbl">
<tr><td>1</td></tr>
<tr><td>2</td></tr>
<tr><td>3</td></tr>
<tr><td>4</td></tr>
<tr><td>5</td></tr>
<tr><td>6</td></tr>
<tr><td>7</td></tr>
<tr><td>8</td></tr>
<tr><td>9</td></tr>
<tr><td>10</td></tr>
</table>
</body>
<script type="text/javascript">
window.onload=function()
{
var tbl = document.getElementById("tbl");
rows = tbl.getElementsByTagName("tr");
for(i=0;i<rows.length;i++)
{
var j = parseInt(i/3);
if(j%2==0) rows[i].style.backgroundColor="#f00";
else rows[i].style.backgroundColor="#0f0";
}
}
</script>
1、HTML 的 form 提交之前如何驗證數(shù)值文本框的內(nèi)容全部為數(shù)字? 否則的話提示用戶并終止提交?
<form onsubmit='return chkForm(this)'>
<input type="text" name="d1"/>
<input type="submit"/>
</form>
<script type="text/javascript" />
function chkForm(this)

var value = thist.d1.value;
var len = value.length;
for(var i=0;i<len;i++)
{
if(value.charAt(i)>"9" || value.charAt(i)<"0")
{
alert("含有非數(shù)字字符"); return false;
}
}
return true;
}
</script>


2、請寫出用于校驗HTML文本框中輸入的內(nèi)容全部為數(shù)字的javascript代碼
<input type="text" id="d1" onblur=" chkNumber (this)"/>
<script type="text/javascript" />
function chkNumber(eleText) 

var value = eleText.value;
var len = value.length;
for(var i=0;i<len;i++)
{
if(value.charAt(i)>"9" || value.charAt(i)<"0")
{
alert("含有非數(shù)字字符"); 
eleText.focus();
break; 
}
}
}
</script>
除了寫完代碼,還應該在網(wǎng)頁上寫出實驗步驟和在代碼中加入實現(xiàn)思路,讓面試官一看就明白你的意圖和檢查你的結(jié)果。


1、說說你用過那些ajax技術和框架,說說它們的區(qū)別
答:去掉對web.xml的監(jiān)視,把jsp提前編輯成Servlet。
有富余物理內(nèi)存的情況,加大tomcat使用的jvm的內(nèi)存



6. Java web部分


ww

1、Tomcat的優(yōu)化經(jīng)驗
答:去掉對web.xml的監(jiān)視,把jsp提前編輯成Servlet。
有富余物理內(nèi)存的情況,加大tomcat使用的jvm的內(nèi)存




1、HTTP請求的GET與POST方式的區(qū)別
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。


62、解釋一下什么是servlet;
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
1、說一說Servlet的生命周期? 
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。


Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調(diào)用其destroy方法。
web容器加載servlet,生命周期開始。通過調(diào)用servlet的init()方法進行servlet的初始化。通過調(diào)用service()方法實 現(xiàn),根據(jù)請求的不同調(diào)用不同的do***()方法。結(jié)束服務,web容器調(diào)用servlet的destroy()方法。


4、Servlet的基本架構(gòu) 
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 { 


3、SERVLET API中forward() 與redirect()的區(qū)別? 
答:前者僅是容器中控制權的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會顯示出轉(zhuǎn)向后的地址;后者則是完全的跳轉(zhuǎn),瀏覽器將會得到跳轉(zhuǎn)的地址,并重新發(fā)送請求鏈接。 這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱 藏實際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個其它服務器上的資源,則必須使用
sendRedirect()方法。


60、什么情況下調(diào)用doGet()和doPost()? 
Jsp頁面中的FORM標簽里的method屬性為get時調(diào)用doGet(),為post時調(diào)用doPost()。


66、Request對象的主要方法: 
setAttribute(String name,Object):設置名字為name的request的參數(shù)值 
getAttribute(String name):返回由name指定的屬性值 
getAttributeNames():返回request對象所有屬性的名字集合,結(jié)果是一個枚舉的實例 
getCookies():返回客戶端的所有Cookie對象,結(jié)果是一個Cookie數(shù)組 
getCharacterEncoding():返回請求中的字符編碼方式 
getContentLength():返回請求的Body的長度 
getHeader(String name):獲得HTTP協(xié)議定義的文件頭信息 
getHeaders(String name):返回指定名字的request Header的所有值,結(jié)果是一個枚舉的實例 
getHeaderNames():返回所以request Header的名字,結(jié)果是一個枚舉的實例 
getInputStream():返回請求的輸入流,用于獲得請求中的數(shù)據(jù) 
getMethod():獲得客戶端向服務器端傳送數(shù)據(jù)的方法 
getParameter(String name):獲得客戶端傳送給服務器端的有name指定的參數(shù)值 
getParameterNames():獲得客戶端傳送給服務器端的所有參數(shù)的名字,結(jié)果是一個枚舉的實例 
getParametervalues(String name):獲得有name指定的參數(shù)的所有值 
getProtocol():獲取客戶端向服務器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱 
getQueryString():獲得查詢字符串 
getRequestURI():獲取發(fā)出請求字符串的客戶端地址 
getRemoteAddr():獲取客戶端的IP地址 
getRemoteHost():獲取客戶端的名字 
getSession([Boolean create]):返回和請求相關Session 
getServerName():獲取服務器的名字 
getServletPath():獲取客戶端所請求的腳本文件的路徑 
getServerPort():獲取服務器的端口號 
removeAttribute(String name):刪除請求中的一個屬性


19、forward 和redirect的區(qū)別 
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。 
redirect就是服務端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請求,所以session,request參數(shù)都可以獲取。

4、request.getAttribute() 和 request.getParameter() 有何區(qū)別?


1. jsp有哪些內(nèi)置對象?作用分別是什么? 分別有什么方法? 
答:JSP共有以下9個內(nèi)置的對象: 
request 用戶端請求,此請求會包含來自GET/POST請求的參數(shù) 
response 網(wǎng)頁傳回用戶端的回應 
pageContext 網(wǎng)頁的屬性是在這里管理 
session 與請求有關的會話期 
application servlet 正在執(zhí)行的內(nèi)容 
out 用來傳送回應的輸出 
config servlet的構(gòu)架部件 
page JSP網(wǎng)頁本身 
exception 針對錯誤網(wǎng)頁,未捕捉的例外


request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header, 和session數(shù)據(jù)的有用的方法。 
response表示HttpServletResponse對象,并提供了幾個用于設置送回 瀏覽器的響應的方法(如cookies,頭信息等) 
out對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結(jié)果。 
pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關的對象的API,并且包裝了通用的servlet相關功能的方法。 
session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態(tài)信息 
applicaton 表示一個javax.servle.ServletContext對象。這有助于查找有關servlet引擎和servlet環(huán)境的信息 
config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數(shù)。 
page表示從該頁面產(chǎn)生的一個servlet實例



2. jsp有哪些動作?作用分別是什么? 
(這個問題似乎不重要,不明白為何有此題)
答:JSP共有以下6種基本動作 
jsp:include:在頁面被請求的時候引入一個文件。 
jsp:useBean:尋找或者實例化一個JavaBean。 
jsp:setProperty:設置JavaBean的屬性。 
jsp:getProperty:輸出某個JavaBean的屬性。 
jsp:forward:把請求轉(zhuǎn)到一個新的頁面。 
jsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標記
59、JSP的常用指令 
isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式)


3. JSP中動態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別? 
答:動態(tài)INCLUDE用jsp:include動作實現(xiàn) 
<jsp:include page=included.jsp flush=true />它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù) 靜態(tài)INCLUDE用include偽碼實現(xiàn),定不會檢查所含文件的變化,適用于包含靜態(tài)頁面 <%@ include file=included.htm %>



4、兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別? 
(下面的回答嚴重錯誤,應該是想問forward和sendRedirect 的區(qū)別,畢竟出題的人不是專業(yè)搞文字藝術的人,可能表達能力并不見得很強,用詞不一定精準,加之其自身的技術面也可能存在一些問題,不一定真正將他的意思 表達清楚了,嚴格意思上來講,一些題目可能根本就無人能答,所以,答題時要掌握主動,只要把自己知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是 什么,不要一味想著是在答題)
答:有兩種,分別為: 
<jsp:include page=included.jsp flush=true> 
<jsp:forward page= nextpage.jsp/> 
前者頁面不會轉(zhuǎn)向include所指的頁面,只是顯示該頁的結(jié)果,主頁面還是原來的頁面。執(zhí)行完后還會回來,相當于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁面,不會再回來。相當于go to 語句。



63、頁面間對象傳遞的方法 
request,session,application,cookie等 
64、JSP和Servlet有哪些相同點和不同點,他們之間的聯(lián)系是什么? 
JSP是Servlet技術的擴展,本質(zhì)上是Servlet的簡易方式,更強調(diào)應用的外表表達。JSP編譯后是"類servlet"。Servlet和 JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML 可以組合成一個擴展名為.jsp的文件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。


1、MVC的各個部分都有那些技術來實現(xiàn)?如何實現(xiàn)? 
答:MVC是Model-View-Controller的簡寫。Model 代表的是應用的業(yè)務邏輯(通過JavaBean,EJB組件實現(xiàn)), View 是應用的表示面(由JSP頁面產(chǎn)生),Controller 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現(xiàn)。這些組件可以進行交互和重 用。


68、我們在web應用開發(fā)過程中經(jīng)常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串? 
Public String translate (String str) { 
String tempStr = ""; 
try { 
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK"); 
tempStr = tempStr.trim(); 

catch (Exception e) { 
System.err.println(e.getMessage()); 

return tempStr; 

1.現(xiàn)在輸入n個數(shù)字,以逗號,分開;然后可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什么排序,結(jié)果為,提供reset
7. 實際項目開發(fā)
1、在eclipse中調(diào)試時,怎樣查看一個變量的值?
在要查看的變量前先設置斷點,然后選中變量,右鍵選debug as-->Java Application,打開debug透視圖,這時在Variables窗口中可以看到變量當前的值。
如果是局部變量,也可以在局部變量窗口中查看。
要知道一個方法被調(diào)用的方法調(diào)用鏈,可以在方法棧中查看。


2、你們公司使用的代碼配置管理工具是什么? 
除了說以前使用cvs,現(xiàn)在新項目使用svn了,還簡要說一下使用的過程,如果有可能,還說說倉庫的概念和如何使用鎖之類的細節(jié)。


3、你們的項目總金額多少,多少人開發(fā),總共花了多少個月?
像巴巴運動網(wǎng)這種規(guī)模的項目,可以說是4、5個人、開發(fā)了4、5個月,費用則是4、50萬。按每人每月兩萬收入去計算,就差不多了。


8. XML部分


1、xml有哪些解析技術?區(qū)別是什么? 
答:有DOM,SAX,STAX等 
DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結(jié)構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝 入內(nèi)存,適合對XML的隨機訪問SAX:不現(xiàn)于DOM,SAX是事件驅(qū)動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到 像文件開頭,文檔結(jié)束,或者標簽開頭與標簽結(jié)束時,它會觸發(fā)一個事件,用戶通過在其回調(diào)事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問 
STAX:Streaming API for XML (StAX) 
講解這些區(qū)別是不需要特別去比較,就像說傳智播客與其他培訓機構(gòu)的區(qū)別時,我們只需說清楚傳智播客有什么特點和優(yōu)點就行了,這就已經(jīng)間接回答了彼此的區(qū)別。


2、你在項目中用到了xml技術的哪些方面?如何實現(xiàn)的? 
答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺時,將不能數(shù)據(jù)源的數(shù)據(jù)組裝成XML文件,然后將XML文件壓縮打包加密后通過網(wǎng)絡傳送給接收者, 接收解密與解壓縮后再同XML文件中還原相關信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數(shù)都存貯在XML文件中。 
3、用jdom解析xml文件時如何解決中文問題?如何解析? 
答:看如下代碼,用編碼方式加以解決 

  1. package test;   
  2. import java.io.*;   
  3. public class DOMTest   
  4. {   
  5. private String inFile = "c:\\people.xml"   
  6. private String outFile = "c:\\people.xml"   
  7. public static void main(String args[])   
  8. {   
  9. new DOMTest();   
  10. }   
  11. public DOMTest()   
  12. {   
  13. try   
  14. {   
  15. javax.xml.parsers.DocumentBuilder builder =   
  16. javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();   
  17. org.w3c.dom.Document doc = builder.newDocument();   
  18. org.w3c.dom.Element root = doc.createElement("老師");   
  19. org.w3c.dom.Element wang = doc.createElement("王");   
  20. org.w3c.dom.Element liu = doc.createElement("劉");   
  21. wang.appendChild(doc.createTextNode("我是王老師"));   
  22. root.appendChild(wang);   
  23. doc.appendChild(root);   
  24. javax.xml.transform.Transformer transformer =   
  25. javax.xml.transform.TransformerFactory.newInstance().newTransformer();   
  26. transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");   
  27. transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");   
  28. transformer.transform(new javax.xml.transform.dom.DOMSource(doc),   
  29. new   
  30. javax.xml.transform.stream.StreamResult(outFile));   
  31. }   
  32. catch (Exception e)   
  33. {   
  34. System.out.println (e.getMessage());   
  35. }   
  36. }   
  37. }   

4、編程用JAVA解析XML的方式. 

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

  1. <?xml version=1.0 encoding=gb2312?>   
  2. <person>   
  3. <name>王小明</name>   
  4. <college>信息學院</college>   
  5. <telephone>6258113</telephone>   
  6. <notes>男,1955年生,博士,95年調(diào)入海南大學</notes>   
  7. </person>   
事件回調(diào)類SAXHandler.java 

  1. import java.io.*;   
  2. import java.util.Hashtable;   
  3. import org.xml.sax.*;   
  4. public class SAXHandler extends HandlerBase   
  5. {   
  6. private Hashtable table = new Hashtable();   
  7. private String currentElement = null;   
  8. private String currentValue = null;   
  9. public void setTable(Hashtable table)   
  10. {   
  11. this.table = table;   
  12. }   
  13. public Hashtable getTable()   
  14. {   
  15. return table;   
  16. }   
  17. public void startElement(String tag, AttributeList attrs)   
  18. throws SAXException   
  19. {   
  20. currentElement = tag;   
  21. }   
  22. public void characters(char[] ch, int start, int length)   
  23. throws SAXException   
  24. {   
  25. currentValue = new String(ch, start, length);   
  26. }   
  27. public void endElement(String name) throws SAXException   
  28. {   
  29. if (currentElement.equals(name))   
  30. table.put(currentElement, currentValue);   
  31. }  
  32.   
  33. }   

JSP內(nèi)容顯示源碼,SaxXml.jsp: 

  1. <HTML>   
  2. <HEAD>   
  3. <TITLE>剖析XML文件people.xml</TITLE>   
  4. </HEAD>   
  5. <BODY>   
  6. <%@ page errorPage=ErrPage.jsp   
  7. contentType=text/html;charset=GB2312 %>   
  8. <%@ page import=java.io.* %>   
  9. <%@ page import=java.util.Hashtable %>   
  10. <%@ page import=org.w3c.dom.* %>   
  11. <%@ page import=org.xml.sax.* %>   
  12. <%@ page import=javax.xml.parsers.SAXParserFactory %>   
  13. <%@ page import=javax.xml.parsers.SAXParser %>   
  14. <%@ page import=SAXHandler %>   
  15. <%   
  16. File file = new File(c:\people.xml);   
  17. FileReader reader = new FileReader(file);   
  18. Parser parser;   
  19. SAXParserFactory spf = SAXParserFactory.newInstance();   
  20. SAXParser sp = spf.newSAXParser();   
  21. SAXHandler handler = new SAXHandler();   
  22. sp.parse(new InputSource(reader), handler);   
  23. Hashtable hashTable = handler.getTable();   
  24. out.println(<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>);   
  25. out.println(<TR><TD>姓名</TD> + <TD> +   
  26. (String)hashTable.get(new String(name)) + </TD></TR>);   
  27. out.println(<TR><TD>學院</TD> + <TD> +   
  28. (String)hashTable.get(new String(college))+</TD></TR>);   
  29. out.println(<TR><TD>電話</TD> + <TD> +   
  30. (String)hashTable.get(new String(telephone)) + </TD></TR>);   
  31. out.println(<TR><TD>備注</TD> + <TD> +   
  32. (String)hashTable.get(new String(notes)) + </TD></TR>);   
  33. out.println(</TABLE>);   
  34. %>   
  35. </BODY>   
  36. </HTML>   

70、XML文檔定義有幾種形式?它們之間有何本質(zhì)區(qū)別?解析XML文檔有哪幾種方式? 
a: 兩種形式 dtd schema,

b: 本質(zhì)區(qū)別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發(fā)展schema的根本目的),c:有DOM,SAX,STAX等 
DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結(jié)構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝入內(nèi)存,適合對XML的隨機訪問 
SAX:不現(xiàn)于DOM,SAX是事件驅(qū)動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結(jié)束,或者標簽開頭與標簽結(jié)束時,它會觸發(fā)一個事件,用戶通過在其回調(diào)事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問 
STAX:Streaming API for XML (StAX)

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多