乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

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

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


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

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

      }


      分析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,應(yīng)該截取"我AB",輸入"我ABC漢DEF",6,應(yīng)該輸出"我ABC",而不是"我ABC+漢的半個"。
      答:
      首先要了解中文字符有多種編碼及各種編碼的特征。
      假設(shè)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. }  

      估計是當初面試的那個學(xué)員表述不清楚,問題很可能是:
      如果一串字符如"aaaabbc中國1512"要分別統(tǒng)計英文字符的數(shù)量,中文字符的數(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)二叉樹
      這是組合設(shè)計模式。

      我有很多個(假設(shè)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、從類似如下的文本文件中讀取出所有的姓名,并打印出重復(fù)的姓名和重復(fù)的次數(shù),并按重復(fù)次數(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;


      }


      第三:更實際的應(yīng)用(在什么情況用單例)
      public class SequenceGenerator{
      //下面是該類自身的業(yè)務(wù)功能代碼
      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應(yīng)用程序中,一個類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>
      除了寫完代碼,還應(yīng)該在網(wǎng)頁上寫出實驗步驟和在代碼中加入實現(xiàn)思路,讓面試官一看就明白你的意圖和檢查你的結(jié)果。


      1、說說你用過那些ajax技術(shù)和框架,說說它們的區(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有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。


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


      Servlet被服務(wù)器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應(yīng)的doXXX方法(doGet,doPost)等,當服務(wù)器決定將實例銷毀的時候調(diào)用其destroy方法。
      web容器加載servlet,生命周期開始。通過調(diào)用servlet的init()方法進行servlet的初始化。通過調(diào)用service()方法實 現(xiàn),根據(jù)請求的不同調(diào)用不同的do***()方法。結(jié)束服務(wù),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ū)別? 
      答:前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會顯示出轉(zhuǎn)向后的地址;后者則是完全的跳轉(zhuǎn),瀏覽器將會得到跳轉(zhuǎn)的地址,并重新發(fā)送請求鏈接。 這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱 藏實際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個其它服務(wù)器上的資源,則必須使用
      sendRedirect()方法。


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


      66、Request對象的主要方法: 
      setAttribute(String name,Object):設(shè)置名字為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():獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法 
      getParameter(String name):獲得客戶端傳送給服務(wù)器端的有name指定的參數(shù)值 
      getParameterNames():獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字,結(jié)果是一個枚舉的實例 
      getParametervalues(String name):獲得有name指定的參數(shù)的所有值 
      getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱 
      getQueryString():獲得查詢字符串 
      getRequestURI():獲取發(fā)出請求字符串的客戶端地址 
      getRemoteAddr():獲取客戶端的IP地址 
      getRemoteHost():獲取客戶端的名字 
      getSession([Boolean create]):返回和請求相關(guān)Session 
      getServerName():獲取服務(wù)器的名字 
      getServletPath():獲取客戶端所請求的腳本文件的路徑 
      getServerPort():獲取服務(wù)器的端口號 
      removeAttribute(String name):刪除請求中的一個屬性


      19、forward 和redirect的區(qū)別 
      forward是服務(wù)器請求資源,服務(wù)器直接訪問目標地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。 
      redirect就是服務(wù)端根據(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)頁傳回用戶端的回應(yīng) 
      pageContext 網(wǎng)頁的屬性是在這里管理 
      session 與請求有關(guān)的會話期 
      application servlet 正在執(zhí)行的內(nèi)容 
      out 用來傳送回應(yīng)的輸出 
      config servlet的構(gòu)架部件 
      page JSP網(wǎng)頁本身 
      exception 針對錯誤網(wǎng)頁,未捕捉的例外


      request表示HttpServletRequest對象。它包含了有關(guān)瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header, 和session數(shù)據(jù)的有用的方法。 
      response表示HttpServletResponse對象,并提供了幾個用于設(shè)置送回 瀏覽器的響應(yīng)的方法(如cookies,頭信息等) 
      out對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結(jié)果。 
      pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對象的API,并且包裝了通用的servlet相關(guān)功能的方法。 
      session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態(tài)信息 
      applicaton 表示一個javax.servle.ServletContext對象。這有助于查找有關(guān)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:設(shè)置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ū)別? 
      (下面的回答嚴重錯誤,應(yīng)該是想問forward和sendRedirect 的區(qū)別,畢竟出題的人不是專業(yè)搞文字藝術(shù)的人,可能表達能力并不見得很強,用詞不一定精準,加之其自身的技術(shù)面也可能存在一些問題,不一定真正將他的意思 表達清楚了,嚴格意思上來講,一些題目可能根本就無人能答,所以,答題時要掌握主動,只要把自己知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是 什么,不要一味想著是在答題)
      答:有兩種,分別為: 
      <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技術(shù)的擴展,本質(zhì)上是Servlet的簡易方式,更強調(diào)應(yīng)用的外表表達。JSP編譯后是"類servlet"。Servlet和 JSP最主要的不同點在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML 可以組合成一個擴展名為.jsp的文件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。


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


      68、我們在web應(yīng)用開發(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)試時,怎樣查看一個變量的值?
      在要查看的變量前先設(shè)置斷點,然后選中變量,右鍵選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有哪些解析技術(shù)?區(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ū)別是不需要特別去比較,就像說傳智播客與其他培訓(xùn)機構(gòu)的區(qū)別時,我們只需說清楚傳智播客有什么特點和優(yōu)點就行了,這就已經(jīng)間接回答了彼此的區(qū)別。


      2、你在項目中用到了xml技術(shù)的哪些方面?如何實現(xiàn)的? 
      答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺時,將不能數(shù)據(jù)源的數(shù)據(jù)組裝成XML文件,然后將XML文件壓縮打包加密后通過網(wǎng)絡(luò)傳送給接收者, 接收解密與解壓縮后再同XML文件中還原相關(guān)信息進行處理。在做軟件配置時,利用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>信息學(xué)院</college>   
      5. <telephone>6258113</telephone>   
      6. <notes>男,1955年生,博士,95年調(diào)入海南大學(xué)</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>學(xué)院</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)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多