天天看點

java寶典(6)

78、從類似如下的文本檔案中讀取出所有的姓名,并列印出重複的姓名和重複的次數,并按重複次數排序:

1,張三,28

2,李四,35

3,張三,28

4,王五,35

5,張三,28

6,李四,35

7,趙六,28

8,田七,35

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

package com.huawei.interview;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.Comparator;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.TreeSet;

public class GetNameTest {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

//InputStream ips = GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt");

//用上一行注釋的代碼和下一行的代碼都可以,因為info.txt與GetNameTest類在同一包下面,是以,可以用下面的相對路徑形式

Map results = new HashMap();

InputStream ips = GetNameTest.class.getResourceAsStream("info.txt");

BufferedReader in = new BufferedReader(new InputStreamReader(ips));

String line = null;

try {

while((line=in.readLine())!=null)

{

dealLine(line,results);

}

sortResults(results);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

static class User

public  String name;

public Integer value;

public User(String name,Integer value)

this.name = name;

this.value = value;

@Override

public boolean equals(Object obj) {

//下面的代碼沒有執行,說明往treeset中增加資料時,不會使用到equals方法。

boolean result = super.equals(obj);

System.out.println(result);

return result;

private static void sortResults(Map results) {

TreeSet sortedResults = new TreeSet(

new Comparator(){

public int compare(Object o1, Object o2) {

User user1 = (User)o1;

User user2 = (User)o2;

/*如果compareTo傳回結果0,則認為兩個對象相等,新的對象不會增加到集合中去

* 是以,不能直接用下面的代碼,否則,那些個數相同的其他姓名就列印不出來。

* */

//return user1.value-user2.value;

//return user1.value<user2.value?-1:user1.value==user2.value?0:1;

if(user1.value<user2.value)

return -1;

}else if(user1.value>user2.value)

return 1;

}else

return user1.name.compareTo(user2.name);

);

Iterator iterator = results.keySet().iterator();

while(iterator.hasNext())

String name = (String)iterator.next();

Integer value = (Integer)results.get(name);

if(value > 1)

sortedResults.add(new User(name,value));

printResults(sortedResults);

private static void printResults(TreeSet sortedResults)

Iterator iterator  = sortedResults.iterator();

User user = (User)iterator.next();

System.out.println(user.name + ":" + user.value);

public static void dealLine(String line,Map map)

if(!"".equals(line.trim()))

String [] results = line.split(",");

if(results.length == 3)

String name = results[1];

Integer value = (Integer)map.get(name);

if(value == null) value = 0;

map.put(name,value + 1);

79、寫一個Singleton出來。

Singleton模式主要作用是保證在Java應用程式中,一個類Class隻有一個執行個體存在。

一般Singleton模式通常有幾種種形式:

第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時執行個體話,通過一個public的getInstance方法擷取對它的引用,繼而調用其中的方法。

public class Singleton {

private Singleton(){}

     //在自己内部定義自己一個執行個體,是不是很奇怪?

     //注意這是private 隻供内部調用

     private static Singleton instance = new Singleton();

     //這裡提供了一個供外部通路本class的靜态方法,可以直接通路  

     public static Singleton getInstance() {

       return instance;    

     }

  }

  第二種形式:

 private static Singleton instance = null;

 public static synchronized Singleton getInstance() {

 //這個方法比上面有所改進,不用每次都進行生成對象,隻是第一次      

 //使用時生成執行個體,提高了效率!

 if (instance==null)

   instance=new Singleton();

return instance;

}

其他形式:

定義一個類,它的構造函數為private的,所有方法為static的。

一般認為第一種形式要更加安全些

80、遞歸算法題1

一個整數,大于0,不用循環和本地變量,按照n,2n,4n,8n的順序遞增,當值大于5000時,把值按照指定順序輸出來。

例:n=1237

則輸出為:

1237,

2474,

4948,

9896,

public static void multiply(int n)

if(n>5000) return;

System.out.println(n);

multiply(n*2);

81、遞歸算法題2

第1個人10,第2個比第1個人大2歲,依次遞推,第8個人多大?

package cn.itcast;

import java.util.Date;

public class A1 {

public static void main(String [] args)

System.out.println(computeAge(8));

public static int computeAge(int n)

if(n==1) return 10;

return computeAge(n-1) + 2;

public static void toBinary(int n,StringBuffer result)

if(n/2 != 0)

toBinary(n/2,result);

result.append(n%2);

82、排序都有哪幾種方法?請列舉。用JAVA實作一個快速排序。

本人隻研究過冒泡排序、選擇排序和快速排序,下面是快速排序的代碼:

public class QuickSort {

* 快速排序

* @param strDate

* @param left

* @param right

*/

public void quickSort(String[] strDate,int left,int right){

String middle,tempDate;

int i,j;

i=left;

j=right;

middle=strDate[(i+j)/2];

do{

while(strDate[i].compareTo(middle)<0&& i<right)

i++; //找出左邊比中間值大的數

while(strDate[j].compareTo(middle)>0&& j>left)

j--; //找出右邊比中間值小的數

if(i<=j){ //将左邊大的數和右邊小的數進行替換

tempDate=strDate[i];

strDate[i]=strDate[j];

strDate[j]=tempDate;

i++;

j--;

}while(i<=j); //當兩者交錯時停止

if(i<right){

quickSort(strDate,i,right);//從

if(j>left){

quickSort(strDate,left,j);

 * @param args

 */

public static void main(String[] args){

String[] strVoid=new String[]{"11","66","22","0","55","22","0","32"};

QuickSort sort=new QuickSort();

sort.quickSort(strVoid,0,strVoid.length-1);

for(int i=0;i<strVoid.length;i++){

System.out.println(strVoid[i]+" ");

83、有數組a[n],用java代碼将數組元素順序颠倒

package cn.itcast.lecture2;

import java.util.Arrays;

import java.util.Collections;

public class ReverseTest {

//産生若幹0到1000的随機數,作為數組的初始值

int data[] = new int[]{

(int)(Math.random() * 1000),

(int)(Math.random() * 100),

};

System.out.println(Math.random());

System.out.print("交換前的資料:");

System.out.println(

Arrays.toString(data));

reverse(data);

System.out.print("交換後的資料:");

System.out.println(Arrays.toString(data));

//方法執行完後,參數data中的資料順序即被颠倒

//實作思路是第1個和第n個交換,第2個和第n-1個交換,依次類推...

public static void reverse(int[] data)

int len = data.length;

for(int i=0;i<len/2;i++)

int temp = data[i];

data[i] = data[len-1-i];

data[len-1-i] = temp;

84.金額轉換,阿拉伯數字的金額轉換成中國傳統的形式如:(¥1011)->(一千零一拾一進制整)輸出。

public class RenMingBi {

* @param args add by zxx ,Nov 29, 2008

private static final char[] data = new char[]{

'零','壹','貳','叁','肆','伍','陸','柒','捌','玖'

};

private static final char[] units = new char[]{

'元','拾','佰','仟','萬','拾','佰','仟','億'

convert(135689123));

public static String convert(int money)

StringBuffer sbf = new StringBuffer();

int unit = 0;

while(money!=0)

sbf.insert(0,units[unit++]);

int number = money%10;

sbf.insert(0, data[number]);

money /= 10;

return sbf.toString();

2. html&JavaScript部分

85. 判斷第二個日期比第一個日期大

如何用腳本判斷使用者輸入的的字元串是下面的時間格式2004-11-21 必須要保證使用者的輸入是此格式,并且是時間,比如說月份不大于12等等,另外我需要使用者輸入兩個,并且後一個要比前一個晚,隻允許用JAVASCRIPT,請詳細幫助作答,,

//這裡可用正規表達式判斷提前判斷一下格式,然後按下提取各時間字段内容

<input type="text" id="d1"/>

<input type="text" id="d2" οnblur="compare()"/>

<script>

function compare()

var d1 = document.getElementById("d1").value;

var d2 = document.getElementById("d2").value;

arr1 = d1.split("-");

arr2 = d2.split("-");

date1 = new Date(arr1[0],arr1[1],arr1[2]);

date2 = new Date(arr2[0],arr2[1],arr2[2]);

if(date2.getTime()<date1.getTime())

alert("不能比第一個日期小");

return false;

</script>

86. 用table顯示n條記錄,每3行換一次顔色,即1,2,3用紅色字型,4,5,6用綠色字型,7,8,9用紅顔色字型。

87、HTML 的 form 送出之前如何驗證數值不為空? 為空的話提示使用者并終止送出?

88、請寫出用于校驗HTML文本框中輸入的内容全部為數字的javascript代碼

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);

3. Java web部分

89、HTTP請求的GET與POST方式的差別

答:servlet有良好的生存期的定義,包括加載和執行個體化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。

90、解釋一下什麼是servlet;

91、說一說Servlet的生命周期?

Servlet被伺服器執行個體化後,容器運作其init方法,請求到達時運作其service方法,service方法自動派遣運作與請求對應的doXXX方法(doGet,doPost)等,當伺服器決定将執行個體銷毀的時候調用其destroy方法。

web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實作,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。

92、Servlet的基本架構

public class ServletName extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws

93、SERVLET API中forward() 與redirect()的差別?

答:前者僅是容器中控制權的轉向,在用戶端浏覽器位址欄中不會顯示出轉向後的位址;後者則是完全的跳轉,浏覽器将會得到跳轉的位址,并重新發送請求連結。這樣,從浏覽器的位址欄中可以看到跳轉後的連結位址。是以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隐藏實際的連結。在有些情況下,比如,需要跳轉到一個其它伺服器上的資源,則必須使用

sendRedirect()方法。

94、什麼情況下調用doGet()和doPost()?

Jsp頁面中的FORM标簽裡的method屬性為get時調用doGet(),為post時調用doPost()。

95、Request對象的主要方法:

setAttribute(String name,Object):設定名字為name的request的參數值

getAttribute(String name):傳回由name指定的屬性值

getAttributeNames():傳回request對象所有屬性的名字集合,結果是一個枚舉的執行個體

getCookies():傳回用戶端的所有Cookie對象,結果是一個Cookie數組

getCharacterEncoding():傳回請求中的字元編碼方式

getContentLength():傳回請求的Body的長度

getHeader(String name):獲得HTTP協定定義的檔案頭資訊

getHeaders(String name):傳回指定名字的request Header的所有值,結果是一個枚舉的執行個體

getHeaderNames():傳回是以request Header的名字,結果是一個枚舉的執行個體

getInputStream():傳回請求的輸入流,用于獲得請求中的資料

getMethod():獲得用戶端向伺服器端傳送資料的方法

getParameter(String name):獲得用戶端傳送給伺服器端的有name指定的參數值

getParameterNames():獲得用戶端傳送給伺服器端的所有參數的名字,結果是一個枚舉的執行個體

getParametervalues(String name):獲得有name指定的參數的所有值

getProtocol():擷取用戶端向伺服器端傳送資料所依據的協定名稱

getQueryString():獲得查詢字元串

getRequestURI():擷取送出請求字元串的用戶端位址

getRemoteAddr():擷取用戶端的IP位址

getRemoteHost():擷取用戶端的名字

getSession([Boolean create]):傳回和請求相關Session

getServerName():擷取伺服器的名字

getServletPath():擷取用戶端所請求的腳本檔案的路徑

getServerPort():擷取伺服器的端口号

removeAttribute(String name):删除請求中的一個屬性

96、forward 和redirect的差別

forward是伺服器請求資源,伺服器直接通路目标位址的URL,把那個URL的響應内容讀取過來,然後把這些内容再發給浏覽器,浏覽器根本不知道伺服器發送的内容是從哪兒來的,是以它的位址欄中還是原來的位址。

  redirect就是服務端根據邏輯,發送一個狀态碼,告訴浏覽器重新去請求那個位址,一般來說浏覽器會用剛才請求的所有參數重新請求,是以session,request參數都可以擷取。

97、request.getAttribute() 和 request.getParameter() 有何差別?

98. jsp有哪些内置對象?作用分别是什麼? 分别有什麼方法?

答:JSP共有以下9個内置的對象:

request 使用者端請求,此請求會包含來自GET/POST請求的參數

response 網頁傳回使用者端的回應

pageContext 網頁的屬性是在這裡管理

session 與請求有關的會話期

application servlet 正在執行的内容

out 用來傳送回應的輸出

config servlet的構架部件

page JSP網頁本身

exception 針對錯誤網頁,未捕捉的例外

request表示HttpServletRequest對象。它包含了有關浏覽器請求的資訊,并且提供了幾個用于擷取cookie, header, 和session資料的有用的方法。

  response表示HttpServletResponse對象,并提供了幾個用于設定送回 浏覽器的響應的方法(如cookies,頭資訊等)

  out對象是javax.jsp.JspWriter的一個執行個體,并提供了幾個方法使你能用于向浏覽器回送輸出結果。

  pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于友善存取各種範圍的名字空間、servlet相關的對象的API,并且包裝了通用的servlet相關功能的方法。

  session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯使用者的狀态資訊

  applicaton 表示一個javax.servle.ServletContext對象。這有助于查找有關servlet引擎和servlet環境的資訊

  config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet執行個體的初始化參數。

  page表示從該頁面産生的一個servlet執行個體

99. jsp有哪些動作?作用分别是什麼?

(這個問題似乎不重要,不明白為何有此題)

答:JSP共有以下6種基本動作

jsp:include:在頁面被請求的時候引入一個檔案。

jsp:useBean:尋找或者執行個體化一個JavaBean。

jsp:setProperty:設定JavaBean的屬性。

jsp:getProperty:輸出某個JavaBean的屬性。

jsp:forward:把請求轉到一個新的頁面。

jsp:plugin:根據浏覽器類型為Java插件生成OBJECT或EMBED标記

100、JSP的常用指令

isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式)

101. JSP中動态INCLUDE與靜态INCLUDE的差別?

答:動态INCLUDE用jsp:include動作實作

<jsp:include page=included.jsp flush=true />它總是會檢查所含檔案中的變化,适合用于包含動态頁面,并且可以帶參數 靜态INCLUDE用include僞碼實作,定不會檢查所含檔案的變化,适用于包含靜态頁面 <%@ include file=included.htm %>

102、兩種跳轉方式分别是什麼?有什麼差別?

(下面的回答嚴重錯誤,應該是想問forward和sendRedirect 的差別,畢竟出題的人不是專業搞文字藝術的人,可能表達能力并不見得很強,用詞不一定精準,加之其自身的技術面也可能存在一些問題,不一定真正将他的意思表達清楚了,嚴格意思上來講,一些題目可能根本就無人能答,是以,答題時要掌握主動,隻要把自己知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是什麼,不要一味想着是在答題)

答:有兩種,分别為:

<jsp:include page=included.jsp flush=true>

<jsp:forward page= nextpage.jsp/>

前者頁面不會轉向include所指的頁面,隻是顯示該頁的結果,首頁面還是原來的頁面。執行完後還會回來,相當于函數調用。并且可以帶參數.後者完全轉向新頁面,不會再回來。相當于go to 語句。

103、頁面間對象傳遞的方法

request,session,application,cookie等

104、JSP和Servlet有哪些相同點和不同點,他們之間的聯系是什麼?

JSP是Servlet技術的擴充,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java檔案中,并且完全從表示層中的HTML裡分離開來。而JSP的情況是Java和HTML可以組合成一個擴充名為.jsp的檔案。JSP側重于視圖,Servlet主要用于控制邏輯。

105、MVC的各個部分都有那些技術來實作?如何實作?

答:MVC是Model-View-Controller的簡寫。Model 代表的是應用的業務邏輯(通過JavaBean,EJB元件實作), View 是應用的表示面(由JSP頁面産生),Controller 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的元件實作。這些元件可以進行互動和重用。