1. 程式人生 > >面朝陽光,心向大海 的專欄

面朝陽光,心向大海 的專欄

Set總結:
1. Set實現的基礎是MapHashMap); 2. Set中的元素是不能重複的,如果使用add(Object obj)方法新增已經存在的物件,則會覆蓋前面的物件; 效能時Map所要面對的一個大問題。如果你知道get()時怎麼工作的,你就會發覺(比方說)ArrayList裡面找物件會是相當慢的。而這正是 HashMap的強項。它不是慢慢地一個個地找這個鍵,而是用了一種被稱為hash code的特殊值來進行查詢的。雜湊(hash)時一種演算法,它會從目標物件當中提取一些資訊,然後生成一個表示這個物件的“相對獨特”的int。 hashCode()是Object根類的方法,因此所有Java物件都能生成hash code。HashMap則利用物件的hashCode()來進行快速的查詢。這樣效能就有了急劇的提高。 設計模式方面 1
、開發中都用到了那些設計模式?用在什麼場合?
答:每個模式都描述了一個在我們的環境中不斷出現的問題,然後描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需再重複相同的工作。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。 2UML方面 答: 標準建模語言UML。 用例圖, 靜態圖 ( 包括 類圖、物件圖 和 包圖 ), 行為圖, 互動圖 ( 順序圖, 合作圖 ), 實現圖, *******************************************************************************
1概述struts,以及struts如何實現MVC架構的? 答:struts framework是一種基於java的技術,Web應用程式開發人員通過struts framework即可充分利用面向物件設計、程式碼重用以及“編寫一次、到處執行”的優點。Struts提供了一種建立Web應用程式的框架,其中對應用程式的顯示、表示和資料的後端程式碼進行了抽象。Struts採用jsp作為MVC的檢視ActionServlet具體指定的action動作類作為控制器即MVC中的C負責檢視與模型之間的互動。控制器的每個入口點都由名為struts-config.xml的配置檔案設定。該檔案把來自檢視的請求對映為特定的JAVA類以進行相應的處理,控制器還指定下一個檢視的位置。Struts中的模型主要指的就是
javabean,它是模型的代表,主要封裝資料和業務邏輯。
Struts的處理流程: 控制器進行初始化工作,讀取配置檔案,為不同的Struts模組初始化相應的ModulConfig物件。 控制器接收Http請求,並從ActionConfig中找出對應於該請求的Action子類,如果沒有對應的Action,控制器直接將請求轉發給JSP或者靜態頁面,否則控制器將請求分發至具體的Action類進行處理。 在控制器呼叫具體的ActionExecute方法之前,ActionForm物件將利用Http請求中的引數來填充自已。還可以在ActionForm類中呼叫Validate方法來檢查請求引數的合法性,並且可以返回一個包含所有錯誤資訊的ActionErrors物件。 執行具體的的Execute方法它負責執行相應的業務邏輯。執行完後,返回一個ActionForward物件,控制器通過該ActionForward物件來進行轉發工作。也可以把Action要處理的業務邏輯封裝在JavaBean中,如果系統中還有EJB,那麼通過JavaBean呼叫EJB以完成業務處理;如果沒有EJB,那麼就直接在JavaBean中連線資料庫,進行資料庫相關的操作。 ******************************************************************************* 2概述MVC體系結構 答:MVC包括三類物件,model是應用物件,view是檢視,controller是控制器,它定義使用者介面對使用者輸入的響應方式。 在MVC體系中,模型通常被稱為“業務邏輯”,是真正完成任務的程式碼檢視就是使用介面,反映資料的變化。控制器控制著模型和檢視之間的互動過程,它決定著向用戶返回怎樣的檢視、檢查通過介面輸入的資訊以及選擇處理輸入資訊的模型 MVC中,表示層和邏輯層分離,各部分可相互獨立進行開發,便於開發和維護,提高了開發效率。 3多執行緒的優點 答:可分兩方面來答: 相對於單執行緒而言 可以響應多工的併發操作 多執行緒取消了主迴圈和輪流檢測機制,一個執行緒可以暫停而不阻止系統其他的部分的執行,而且當程式中一個執行緒阻塞時,只有那個被阻塞的執行緒暫停,所有其他的執行緒繼續執行。 相對於程序而言:(可以答也可以不答) 它所要求的開銷比較小,轉換成本較小。 所有執行緒共享同一地址空間,相互協作。 彼此之間通訊很容易。 4   EJB概述答:EJB是企業級的JavaBean,它提供了構建企業級業務邏輯的一種元件模型。
    EJB
分為三種:Session Bean  Entity Bean  Message-Driven Bean 三種,其中Session Bean分為有狀態和無狀態Session Bean兩種,Entity Bean分為容器管理的Entity Bean ( CMP )  Bean管理的 Entity Bean ( BMP )。每一個EJB由一個遠端介面、一個本地介面和一個EJB容器實現組成,遠端介面聲明瞭提供給EJB客戶呼叫的各種應用方法,本地介面聲明瞭建立新的EJB例項的create方法、尋找EJB例項的查詢(finder)方法以及刪除EJB例項的remove方法EJB容器提供了EJB的執行環境和生命週期的管理。
4java訪問Oracle資料庫、取得記錄並輸出到介面 答:……………………..    Class.forName(“oracle.jdbc.driver.OracleDriver”);    Connection conn=DriverManager.getConnection( url , username , password );    Statement stmt=conn.createStatement();    String str=”select * from [table]”;    ResultSet rs=stmt.executeQuery(str);    While(rs.next())    {      ……………………    }    rs.close();    stmt.close();    conn.close(); 5概述java垃圾回收機制 答:它的工作原理如下:     當不存在對一個物件的引用時,我們就假定不再需要那個物件,那個物件所佔有的儲存單元可以被收回,可通過System.gc()方法回收,但一般要把不再引用的物件標誌為null為佳。 6 java類是否可以多繼承,怎麼實現多繼承? 答:java沒有多繼承,但可以通過介面的形式來達到多繼承的目地。 7面向物件的特點 答:面向物件有三大特點:封裝、繼承、多型。(如果要回答四個,可加上 抽象性 這一特點) 9、介面有什麼優點 答:介面有以下優點: 1 介面只是一個框架而沒有實現,因此在介面定義時不需要考慮介面中的方法如何實現。 2 利用介面可達到實現多繼承的目地。 3 可以在不暴露物件的類的前提下,暴露物件的程式設計介面。 4 不用強迫類關係在無關類中截獲相似處(採用介面卡就可以了)。 5 宣告想執行的一個或多個方法10 ArrayList  Vector 的區別 答:主要從兩個方面來說明: ? 安全、效率方面 如果要實現同步安全,則要用Vector,否則則用ArrayList,因為ArrayList不考慮同步安全的問題,所以效率要高些。 ? 資源方面 當兩者的容量已滿時,它們都會自動增長其容量,但Vector是按其容量的一倍增長,而ArrayList則按其容量的50%增加,所以Vector更能節省資源。 11MVC結構在Jtable中怎樣實現的,這種結構有什麼好處? 答、在Jtable中不儲存它的單元資料,它的所有例項把它們的單元值交給實現了TableModel介面的物件來維護和管理,所以在MVC結構中,Jtable的表格主要體現了一個V的作用,其表格將資料變化體現出來,而資料模型則體現了M的作用,封裝資料和業務邏輯。 注:詳細解說見第二題 12、在控制檯中輸入一個字串,然後按照逆序打印出來 答:import java.io.*; public class test{ public static void main(String args[]){     String A=””;     String B=””;     String C=””;     try{        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));        If ((B=br.readLine())!=null){           A=A+B;        }        for(int I=A.length()-1;I>=0;I--){           C=C+A.substring(I,I+1); } System.out.println(C);     }     catch(Exception e){         System.out.println(e.getMessage());     } } } 13java是否存在記憶體洩露 答:存在,當一個物件引用另一物件後,當另一物件為空時,會出現記憶體洩露。 14String類的值是否可以改變 答:String類的值在初始後不能改變,如果要改變,可轉換為StringBuffer類,這個類的值是可以動態改變的。(這裡主要考String 和 StringBuffer 的區別) 17java 有幾種修飾符?預設的是什麼? 答:(注:修飾符是影響類、變數及成員方法的生存空間和可訪問性的關鍵字) 修飾符 類 成員方法 成員變數 區域性變數 abstract √   √        -       - static   -   √        √       - public  √   √        √        - protected - √         √       - private - √ √ - private protected - √ √ - synchronized - √ - - native - √ - - volatile - - √ - final √ √ √ - transient - - √ √ 以下是訪問控制修飾符:預設為friendly 修飾符 同類 同包 子孫類 不同包 public √ √ √ √ protected √ √ √ - friendly √ √ - - private √ - - - 18toString方法的概述 答:因為每個類都繼承了Object類,所以都實現了toString()方法。     通過toString()方法可以決定所建立物件的字串表達形式。 19Object類的概述 答:Object類是所有其他的類的超類,Object的一個變數可以引用任何其他類的物件因為陣列是作為類實現的,所以Object的一個變數也可以引用任何陣列它包括以下幾種方法:     clone() equals() finalize() getClass() hashCode() notify() notifyAll() toString() wait() 20java特點 答:java具有以下幾個主要特點: 簡單性 ? 面向物件:JAVA是完全面向物件的,它支援靜態和動態風格的程式碼繼承及重用 分散式:包括資料分佈和操作分佈 健壯性:java系統仔細檢測對記憶體的每次訪問,確認它是否合法,而且在編譯和執行程式時,都要對可能出現的問題進行檢查,以消除錯誤的產生。 結構中立 安全性:java不支援指標,一切對記憶體的訪問都必須通過物件的例項變數來實現,這樣就防止程式設計師使用木馬等欺騙手段訪問物件的私有成員,同時也避免了指標操作中容易產生的錯誤。 ? 與平臺無關:java寫的應用程式不用修改就可在不同的軟硬平臺上執行。平臺無關性有兩種:原始碼級和目的碼級。 Java主要靠JAVA虛擬機器在目的碼級上實現平臺無關性 解釋執性:執行JAVA程式時,它首先被編譯成位元組程式碼,位元組程式碼非常類似機器碼,執行效率非常高。 ? 高效能 ? 多性程 ? 動態性:它允許程式動態的裝入執行時需要的類。 21、什麼叫抽象類?抽象類跟介面有什麼區別?為什麼引進資料介面概念? 答:具有關鍵字abstract ,在實現內容上沒有完全定義的類就叫抽象類。 抽象類和介面的區別如下: 在類繼承抽象類時,只需實現部分具體方法和全部抽象方法,而實現介面則要實現裡面的全部方法 ②在介面中無成員變數,而抽象類中可有成員變數。 Java中引進介面主要是為了解決多繼承的問題。 22doGetdoPut的區別? 答: doPut會把地址作為一個檔案寫到伺服器,而doGet不會,而只顯示在位址列。 23、多執行緒實現有那幾種方法,同步有哪幾種方法 答:實現同步主要有兩種方法:1.synchronized 2.wait notify 實現多執行緒主要繼承Thread 類和實現Runnable介面。 24JSP頁面的跳轉? 答:jsp頁面實現跳轉主要有jsp:forward 和 sendRedirect 兩種方法 jsp:forward在本容器內跳轉跳轉後,位址列地址不變。效率高。跳轉後立即結束本頁的內容。 sendRedirect:在容器之間的跳轉,跳轉後位址列地址為跳轉後的地址,效率較低。 通常採用jsp:forward方式跳轉。 25、類變數的初始化 答:在Java中類變數在區域性中一定要初始化,因為區域性變數會覆蓋全域性變數,否則會報錯:變數未初始化。全域性變數則可以不初始化,而到具體的內部方法或其他的類成員中初始化。 26、陣列的定義 答:陣列是作為一種物件實現的。陣列元素可以包含作何型別值,但數組裡面的每個元素的型別必須一致 建立陣列步聚如下: 宣告 構造 初始化 27Hastable HashMap的區別? 答:Hashtable和Hashmap的主要區別如下: ? Hashtable是同步的,而HashMap不是同步的。所以不要求同步的時候,用HashMap的效率較高? Hashtable版本較HashMap版本低。 Java程式碼查錯: 1.   abstract class Name {    private String name;    public abstract boolean isStupidName(String name) {} } 大俠們,這有何錯誤? 答案錯。abstract method必須以分號結尾,且不帶花括號。 2. public class Something {    void doSomething () {        private String s = "";        int l = s.length();    } } 有錯嗎? 答案錯。區域性變數前不能放置任何訪問修飾符(privatepublic,和protected)final可以用來修飾區域性變數(final如同abstractstrictfp,都是非訪問修飾符,strictfp只能修飾classmethod而非variable) 3. abstract class Something {    private abstract String doSomething (); } 這好像沒什麼錯吧? 答案錯。abstractmethods不能以private修飾。abstractmethods就是讓子類implement(實現)具體細節的,怎麼可以用privateabstractmethod封鎖起來呢? (同理,abstract method前不能加final) 4. public class Something {    public int addOne(final int x) {        return ++x;    } } 這個比較明顯。 答案錯。int x被修飾成final,意味著x不能在addOne method中被修改。 5. public class Something {    public static void main(String[] args) {        Other o = new Other();        new Something().addOne(o);    }    public void addOne(final Other o) {       o.i++;    } } class Other {    public int i; } 和上面的很相似,都是關於final的問題,這有錯嗎? 答案正確。在addOne method中,引數o被修飾成final。如果在addOne method裡我們修改了oreference(比如: o = new Other();),那麼如同上例這題也是錯的。但這裡修改的是omember vairable(成員變數),而oreference並沒有改變。 6. class Something {     int i;     public void doSomething() {         System.out.println("i = " + i);     } } 有什麼錯呢看不出來啊。 答案正確。輸出的是"i = 0"int i屬於instant variable (例項變數,或叫成員變數)instant variabledefault valueintdefault value0 7. class Something {     final int i;     public void doSomething() {         System.out.println("i = " + i);     } } 和上面一題只有一個地方不同,就是多了一個final。這難道就錯了嗎? 答案錯。final int i是個finalinstant variable (例項變數,或叫成員變數)finalinstant variable沒有default value,必須在constructor (構造器)結束之前被賦予一個明確的值。可以修改為"final int i = 0;" 8. public class Something {      public static void main(String[] args) {         Something s = new Something();         System.out.println("s.doSomething() returns " + doSomething());     }     public String doSomething() {         return "Do something ...";     } } 看上去很完美。 答案錯。看上去在maincall doSomething沒有什麼問題,畢竟兩個methods都在同一個class裡。但仔細看,mainstaticstatic method不能直接call non-static methods可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能訪問non-static instant variable 9. 此處,Something類的檔名叫OtherThing.java class Something {     private static void main(String[] something_to_do) {                System.out.println("Do something ...");     } } 這個好像很明顯。 答案正確。從來沒有人說過JavaClass名字必須和其檔名相同。public class的名字必須和檔名相同。 10 interface A{    int x = 0; } class B{    int x =1; } class C extends B implements A {    public void pX(){       System.out.println(x);    }    public static void main(String[] args) {       new C().pX();    } } 答案:錯誤。在編譯時會發生錯誤(錯誤描述不同的JVM有不同的資訊,意思就是未明確的x呼叫,兩個x都匹配(就象在同時import java.utiljava.sql兩個包時直接宣告Date一樣)。對於父類的變數,可以用super.x來明確,而介面的屬性預設隱含為 public static final.所以可以通過A.x來明確。 11. interface Playable {     void play(); } interface Bounceable {     void play(); } interface Rollable extends Playable, Bounceable {     Ball ball = new Ball("PingPang"); } class Ball implements Rollable {     private String name;     public String getName() {         return name;     }     public Ball(String name) {         this.name = name;            }    public void play() {         ball = new Ball("Football");              //錯在這兒         System.out.println(ball.getName());     } } 這個錯誤不容易發現。 答案錯。"interface Rollable extends Playable, Bounceable"沒有問題。interface可繼承多個interfaces,所以這裡沒錯。問題出在interface Rollable裡的"Ball ball = new Ball("PingPang");"。任何在interface裡宣告的interface variable (介面變數,也可稱成員變數),預設為public static final。也就是說"Ball ball = new Ball("PingPang");"實際上是"public static final Ball ball = new Ball("PingPang");"。在Ball類的Play()方法中,"ball = new Ball("Football");"改變了ballreference,而這裡的ball來自Rollable interfaceRollable interface裡的ballpublic static final的,finalobject是不能被改變reference的。因此編譯器將在"ball = new Ball("Football");"這裡顯示有錯。 JAVA程式設計題 1.現在輸入n個數字,以逗號,分開;然後可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什麼排序,結果為,提供reset import java.util.*; public class bycomma{  public static String[] splitStringByComma(String source){    if(source==null||source.trim().equals(""))     return null;    StringTokenizer commaToker = new StringTokenizer(source,",");    String[] result = new String[commaToker.countTokens()];    int i=0;    while(commaToker.hasMoreTokens()){     result[i] = commaToker.nextToken();     i++;    }    return result;  }  public static void main(String args[]){  String[] s = splitStringByComma("5,8,7,4,3,9,1");  int[] ii = new int[s.length];  for(int i = 0;i<s.length;i++){  ii[i] =Integer.parseInt(s[i]);  }     Arrays.sort(ii);     //asc     for(int i=0;i<s.length;i++){     System.out.println(ii[i]);     }     //desc     for(int i=(s.length-1);i>=0;i--){     System.out.println(ii[i]);     }  } }