匯總題

一、Java基礎

1.寫出下面代碼的執行結果

public class Foo {
    public static void main(String[] args) {
        String strValue="ABCDEFG"; 
        strValue.substring(3); 
        strValue.concat("123");
        System.out.println("result=" + strValue);       
        String value = new String ("ABCDEFG");
        System.out.println(strValue== value); 
    }
}
result=ABCDEFG
false

2.寫出下面代碼的執行結果

public class Foo{  (分值5分)
    public static void main(String args[]) {
        int x = 100;
        int y = 200;
        if (x = y)
            System.out.println("Not equal");
        else
            System.out.println("Equal");
    }
}
編譯報錯if (true或false)x = y結果為int類型不兼容

3.寫出下面代碼的執行結果 (此題需寫出分析過程,沒有分析過程不得分,分值10分)

public static void main(String args[]) {
    try {
        new TestAll().methodA(5);
    } catch (IOException e) {
        System.out.println("caught IOException");
    } catch (Exception e) {
        System.out.println("caught Exception");
    }finally{
        System.out.println("no Exception");
    }
}

void methodA(int i) throws IOException {
    if (i%2 != 0)
        throw new IOException("methodA IOException");
}
caught IOException
no Exception
try{}
catch(){}
finally{}
try catch捕獲相應的異常類型,finally始終會執行

4.寫出下面代碼執行的結果(此題需寫出分析過程,沒有分析過程不得分,分值10分)

static boolean isTrue() {
    System.out.println("isTrue");
    return true;
}

static boolean isFalse() {
    System.out.println("isFalse");
    return false;
}

public static void main(String[] args) {
    if (isTrue() || isFalse()) {
        System.out.println(" || operate return true");
    }
    if (isFalse() & isTrue()) {
        System.out.println(" & operate return true");
    }
}
isTrue
 || operate return true
isFalse
isTrue

||具有“短路功能”當左邊為真后 右邊不在執行

5.寫出下面代碼執行的結果(此題需寫出分析過程,沒有分析過程不得分)

class MyThread extends Thread{
    public void run(){
        try {
            Thread.currentThread().sleep(3000);
        } catch (InterruptedException e) {
        }
        System.out.println("MyThread running");
    }
}



public class ThreadTest{
    public static void main(String argv[]) {
        MyThread t = new MyThread();
        t.run();
        t.start();
        System.out.println("Thread Test");
      }

}
MyThread running
Thread Test
MyThread running

t.run();調用 MyThread 的run()方法,當前線程為主線程main睡眠3s
t.start();啟動一個新的線程,先的線程睡眠3s所以Thread Test會先打印

6.執行B.main的結果是什么?(此題需寫出分析過程,沒有分析過程不得分,分值10分)

class A {
  void fun1() {
    System.out.println(this.fun2());
  }
  int fun2() {
    return 123;
  }
}

class B extends A {
  int fun2() {
    return 456;
  }
  public static void main(String argv[]) {
    A a;
    B b = new B();
    b.fun1();
    a = b;
    a.fun1();
  }
}
456
456
this調用的是當前對象,a = b a指向new B();

7.執行ListTest.main的結果是什么?(此題需寫出分析過程,沒有分析過程不得分,分值10分)

class Data {
    int val;
    int getVal() {
        return val;
    }
    void    setVal(int val) {
        this.val = val;
    }
}

public class ListTest {

    public static void main(String argv[]) {
        Data data = new Data();
        ArrayList list = new ArrayList();

        for (int i=100; i<103; i++) {
            data.setVal(i);
            list.add(data);
        }

        int j = 0;
        while (j < list.size()) {
            Data tmp = (Data )list.get(j);
            System.out.println("list(" + j + ") = " + tmp.getVal());
            j++;
        }
    }
}
list(0) = 102
list(1) = 102
list(2) = 102
for循環當中每次改變的都是同一個date對象中的值,應該在for循環內創建(new)對象

8.請指出以下代碼有哪些錯誤(分值15分)

1. 
abstract class Name {
private String name;
// 抽象類中的抽象方法,不應該有方法體
public abstract boolean isStupidName(String name) {}
}
2. 
public class Something {
    void doSomething () 
    {
        private String s = ""; // 方法中的修飾符不能是private,這個只能在類中使用
        int l = s.length();
    }
}
3.
abstract class Something {
    private abstract String doSomething ();// 抽象方法不應該是private的,因為注定要被繼承, 如果是private,就繼承不了啦
}
4.
public class Something {
    public int addOne(final int x) {
        return ++x; // final 修飾的x,不能被修改
    }
}
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;
}

6. 沒錯
class Something {
    int i;
    public void doSomething() {
        System.out.println("i = " + i);
    }
}

7.
class Something {
    final int i; // final修飾的變量要被初始化
    public void doSomething() {
        System.out.println("i = " + i);
    }
}
8.
public class Something {
    public static void main(String[] args) {
        Something s = new Something();
         
        // 靜態方法main中調用doSomething, 但是doSomething不是static修飾的
        System.out.println("s.doSomething() returns " + doSomething());
    }
    public String doSomething() {
        return "Do something ...";
    }
}

9. 寫法沒錯,但是和文件名稱不統一
class Something {
    private static void main(String[] something_to_do) 
    {
        System.out.println("Do something ...");
    }
}

9.寫出以下正則表達式(分值10分)
1-6位字母或數字: ^[0-9a-zA-Z]{1,6}$
手機號(只能以139或159開通,11位數字):
"^(139|159)\d{8}$"

10.寫一個方法,實現字符串的反轉,如:輸入abc,輸出cba(分值10分)

Java code
String str = "abc";
String reStr = new StringBuilder(str).reverse().toString();

或者
/**
 * 將字符串變成數組
 * 對數組反轉,將數組變成字符串
 */
public static String reverseString(String s, int start, int end) {
    //字符串變數組。
    char[] chs = s.toCharArray();
    //反轉數組。
    reverse(chs, start, end);
    //將數組變成字符串。
    return new String(chs);
}

private static void reverse(char[] arr, int x, int y) {
    for (int start = x, end = y - 1; start < end; start++, end--) {
        swap(arr, start, end);
    }
}

private static void swap(char[] arr, int x, int y) {
    char temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;

11.寫一個延遲加載的單例模式(Singleton)的例子(分值10分)

//懶漢
public class Singleton {
    private Singleton(){}
    private static class LazyHodler{
        private static Singleton Instance = new Singleton();
    }
    public static Singleton getInstance(){
        return LazyHodler.Instance;
    }
}
public class OuterClass { 
  private double d1 = 1.0; 
    //insert code here 
} 
把下列答案存放在指定code位置上,哪兩個答案是正確的。闡述原因。
A. class InnerOne{
     public static double methoda() {return d1;}
   } 
B. public class InnerOne{
     static double methoda() {return d1;}
   } 
C. private class InnerOne{
     double methoda() {return d1;}
   } 
D. static class InnerOne{
     protected double methoda() {return d1;}
   } 
E. abstract class InnerOne{
     public abstract double methoda();
   }

說明如下:
靜態內部類可以有靜態成員,而非靜態內部類不能有靜態成員AB錯,
靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量return d1;出錯故D錯
非靜態內部類的非靜態成員可以訪問外部類的非靜態變量 故C正確
CE

題目補充

1、Java里的傳引用和傳值的區別是什么?
答案:傳引用是指傳遞的是地址而不是值本身,傳值則是傳遞值的一份拷貝。

2、為什么Java里沒有全局變量?
答案:全局變量是全局可見的,Java不支持全局可見的變量,因為:全局變量破壞了引用透明性原則。全局變量導致了命名空間的沖突。

3、如何將String類型轉化成Number類型?
答案:Integer類的valueOf方法可以將String轉成Number。

4、面向對象編程的原則是什么?
答案:主要有三點,多態,繼承和封裝。

5、所有類的父類是什么?
答案:object

6、Java的基本類型有哪些?
答案:byte,char, short, int, long, float, double, boolean。

7、怎么判斷數組是null還是為空?
答案:輸出array.length的值,如果是0,說明數組為空。如果是null的話,會拋出空指針異常。

8、JDK和JRE的區別是什么?
答案:Java運行時環境(JRE)是將要執行Java程序的Java虛擬機。它同時也包含了執行applet需要的瀏覽器插件。Java開發工具包(JDK)是完整的Java軟件開發包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調試器),可以讓開發者開發、編譯、執行Java應用程序。

9、Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思?
答案:Java的方法重載,就是在類中可以創建多個方法,它們具有相同的名字,Java中的方法重載發生在同一個類里面兩個或者是多個方法的方法名相同但是參數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數列表和返回類型。覆蓋者可能不會限制它所覆蓋的方法的訪問。

10、Java支持多繼承么?
答案:不支持,Java不支持多繼承。每個類都只能繼承一個類,但是可以實現多個接口。

11、進程和線程的區別是什么?
答案:進程是執行著的應用程序,而線程是進程內部的一個執行序列。一個進程可以有多個線程。線程又叫做輕量級進程。

12、創建線程有幾種不同的方式?你喜歡哪一種?為什么?
答案:有三種方式可以用來創建線程:
繼承Thread類
實現Runnable接口
實現Callable接口
應用程序可以使用Executor框架來創建線程池
實現Runnable接口這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用。

13、什么是死鎖(deadlock)?
答案:兩個進程都在等待對方執行完畢才能繼續往下執行的時候就發生了死鎖。結果就是兩個進程都陷入了無限的等待中。

14、簡單的說下HashMap和TreeMap的區別?
答案:HashMap:適用于在Map中插入、刪除和定位元素。TreeMap:適用于按自然順序或自定義順序遍歷鍵(key)。HashMap通常比TreeMap快一點(樹和哈希表的數據結構使然),建議多使用HashMap,在需要排序的Map時候才用TreeMap。

18、try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?
答案:會執行,在return前執行。

19、在JAVA中,如何跳出當前的循環?
答案:用break; return方法。

20、在Java中,如何跳出當前的多重嵌套循環?
答案:在最外層循環前加一個標記如A,然后用break A;可以跳出多重循環。

21、在書寫代碼記錄操作日志時,是先寫日志 還是后寫日志?哪個會好些?
答案:先寫日志。 先寫日志-->處理業務-->更新日志狀態。

25、說出幾種java中的修飾符?
答案:public、protect、default、private

27、當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
答案:當一個線程訪問“某對象”的“synchronized方法”或者“synchronized代碼塊”時,其他線程仍然可以訪問“該對象”的非同步代碼塊;當一個線程訪問“某對象”的“synchronized方法”或者“synchronized代碼塊”時,其他線程對“該對象”的其他的“synchronized方法”或者“synchronized代碼塊”的訪問將被阻塞。

28、Collection 和 Collections的區別?
答案:Collection是集合類的上級接口,繼承與他的接口主要有Set 和List。Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

29、在java中一個類被聲明為final類型,表示了什么意思?
答案:表示該類不能被繼承,是頂級類。

30、存在使i + 1 < i的數嗎?
答案:存在,解析:如果i為int型,那么當i為int能表示的最大整數時,i+1就溢出變成負數了,此時不就<i了嗎。

31、Java接口的修飾符可以為(D)
A private B protected C final D abstract

32、不通過構造函數也能創建對象嗎(A)
A 是 B 否
(1)用new語句創建對象,這是最常見的創建對象的方法。
(2) 運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。
(3) 調用對象的clone()方法。
(4) 運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。

33、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
答:早期的JDK中,switch(expr)中,expr可以是byte、short、char、int。從1.5版開始,Java中引入了枚舉 類型(enum),expr也可以是枚舉,從JDK 1.7版開始,還可以是字符串(String)。長整型(long)是不可以的。

34、是否可以繼承String 類?
答:String類是final類,不可以被繼承。

35、當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?
答:是值傳遞。Java編程語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的屬性可以在被調用過程中被改變,但對象的引用是永遠不會改變的。

36、String 和StringBuilder、StringBuffer的區別?
答:Java 平臺提供了兩種類型的字符串:String和StringBuffer / StringBuilder,它們可以儲存和操作字符串。其中String是只讀字符串,也就意味著String引用的字符串內容是不能被改變的。而 StringBuffer和StringBuilder類表示的字符串對象可以直接進行修改。StringBuilder是JDK 1.5中引入的,它和StringBuffer的方法完全相同,區別在于它是在單線程環境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer略高。

37、char 型變量中能不能存貯一個中文漢字?為什么?
答:char類型可以存儲一個中文漢字,因為Java中使用的編碼是Unicode(不選擇任何特定的編碼,直接使用字符在字符集中的編號,這是統一的唯一方法),一個char類型占2個字節(16bit),所以放一個中文是沒問題的。
補充:使用Unicode意味著字符在JVM內部和外部有不同的表現形式,在JVM內部都是Unicode,當這個字符被從JVM內部轉移到外部時 (例如存入文件系統中),需要進行編碼轉換。所以Java中有字節流和字符流,以及在字符流和字節流之間進行轉換的轉換流,如 InputStreamReader和OutputStreamReader,這兩個類是字節流和字符流之間的適配器類,承擔了編碼轉換的任務;

38、抽象類(abstract class)和接口(interface)有什么異同?
答:抽象類和接口都不能夠實例化,但可以定義抽象類和接口類型的引用。一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現,否則該類仍然需要被聲明為抽象類。接口比抽象類更加抽象,因為抽象類中可以定義構造器,可以有抽象方法和具體方法,而接口中不能定義構造器而且其 中的方法全部都是抽象方法。抽象類中的成員可以是private、默認、protected、public的,而接口中的成員全都是public的。抽象 類中可以定義成員變量,而接口中定義的成員變量實際上都是常量。有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法。

39、靜態變量和實例變量的區別?
答:靜態變量是被static修飾符修飾的變量,也稱為類變量,它屬于類,不屬于類的任何一個對象,一個類不管創建多少個對象,靜態變量在內存中有 且僅有一個拷貝;實例變量必須依存于某一實例,需要先創建對象然后通過對象才能訪問到它。靜態變量可以實現讓多個對象共享內存。在Java開發中,上下文 類和工具類中通常會有大量的靜態成員。

40、是否可以從一個靜態(static)方法內部發出對非靜態(non-static)方法的調用?
答:不可以,靜態方法只能訪問靜態成員,因為非靜態方法的調用要先創建對象,因此在調用靜態方法時可能對象并沒有被初始化。

41、如何實現對象克隆?
答:有兩種方式:
1.實現Cloneable接口并重寫Object類中的clone()方法;
2.實現Serializable接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆。

42、GC 是什么?為什么要有GC?

答:GC是垃圾收集的意思,內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。Java程序員不用擔心內存管理, 因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),但JVM可以屏蔽掉顯示的垃圾回收調用。

43、String s=new String(“xyz”);創建了幾個字符串對象?
答:兩個對象,一個是靜態存儲區的"xyz",一個是用new創建在堆上的對象。

44、接口是否可繼承(extends)接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承具體類(concrete class)?
答:接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可繼承具體類,但前提是具體類必須有明確的構造函數。

45、什么時候用assert?
答:assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。一般來說,assertion用于保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高性能,在軟件發布后,assertion檢查通常是關閉的。在實現中,斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為true;如果表達式計算為false,那么系統會報告一個AssertionError。

46、Error和Exception有什么區別?
答:Error 表示系統級的錯誤和程序不必處理的異常,是恢復不是不可能但很困難的情況下的一種嚴重問題;比如內存溢出,不可能指望程序能處理這樣的情 況;Exception表示需要捕捉或者需要程序進行處理的異常,是一種設計或實現問題;也就是說,它表示如果程序運行正常,從不會發生的情況。

47、sleep()和wait()有什么區別?
答:sleep()方法是線程類(Thread)的靜態方法,導致此線程暫停執行指定時間,將執行機會給其他線程,但是監控狀態依然保持,到時后會 自動恢復(線程回到就緒(ready)狀態),因為調用sleep不會釋放對象鎖。wait()是Object類的方法,對此對象調用wait()方法導致本線程放棄對象鎖(線程暫停執行),進入等待此對象的等待鎖定池,只有針對此對象發出notify 方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入就緒狀態。

48、sleep()和yield()有什么區別?
答:sleep()方法給其他線程運行機會時不考慮線程的優先級,因此會給低優先級的線程以運行的機會;yield()方法只會給相同優先級或更高優先級的線程以運行的機會;線程執行sleep()方法后轉入阻塞(blocked)狀態,而執行yield()方法后轉入就緒(ready)狀態;sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常;sleep()方法比yield()方法(跟操作系統相關)具有更好的可移植性。

49、請說出與線程同步相關的方法。
答:
1.wait():使一個線程處于等待(阻塞)狀態,并且釋放所持有的對象的鎖;
2.sleep():使一個正在運行的線程處于睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常,不會釋放鎖;
3.notify():喚醒一個處于等待狀態的線程,當然在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且與優先級無關;
4.notityAll():喚醒所有處入等待狀態的線程,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭;
5.JDK 1.5通過Lock接口提供了顯式(explicit)的鎖機制,增強了靈活性以及對線程的協調。Lock接口中定義了加鎖(lock())和解鎖 (unlock())的方法,同時還提供了newCondition()方法來產生用于線程之間通信的Condition對象;
6.JDK 1.5還提供了信號量(semaphore)機制,信號量可以用來限制對某個共享資源進行訪問的線程的數量。在對資源進行訪問之前,線程必須得到信號量的 許可(調用Semaphore對象的acquire()方法);在完成對資源的訪問后,線程必須向信號量歸還許可(調用Semaphore對象的release()方法)。

50、什么是線程池(thread pool)?
答:
在面向對象編程中,創建和銷毀對象是很費時間的,因為創建一個對象要獲取內存資源或者其它更多資源。在Java中更是如此,虛擬機將試圖跟蹤每 一個對象,以便能夠在對象銷毀后進行垃圾回收。所以提高服務程序效率的一個手段就是盡可能減少創建和銷毀對象的次數,特別是一些很耗資源的對象創建和銷 毀,這就是"池化資源"技術產生的原因。線程池顧名思義就是事先創建若干個可執行的線程放入一個池(容器)中,需要的時候從池中獲取線程不用自行創建,使用完畢不需要銷毀線程而是放回池中,從而減少創建和銷毀線程對象的開銷。
在Java 5+中的Executor接口定義一個執行線程的工具。它的子類型即線程池接口是ExecutorService。要配置一個線程池是比較復雜的,尤其是對于線程池的原理不是很清楚的情況下,因此在工具類Executors面提供了一些靜態工廠方法,生成一些常用的線程池,如下所示:
newSingleThreadExecutor:創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當于單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。
newFixedThreadPool:創建固定大小的線程池。每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那么線程池會補充一個新線程。
newCachedThreadPool: 創建一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,那么就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可 以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴于操作系統(或者說JVM)能夠創建的最大線程大小。
newScheduledThreadPool:創建一個大小無限的線程池。此線程池支持定時以及周期性執行任務的需求。
newSingleThreadExecutor:創建一個單線程的線程池。此線程池支持定時以及周期性執行任務的需求。
如果希望在服務器上使用線程池,強烈建議使用newFixedThreadPool方法來創建線程池,這樣能獲得更好的性能。

82、簡述synchronized和java.util.concurrent.locks.Lock的異同?
答:Lock是Java 5以后引入的新的API,和關鍵字synchronized相比主要相同點:Lock 能完成synchronized所實現的所有功能;主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally 塊中釋放(這是釋放外部資源的最好的地方)。

83、Java中如何實現序列化,有什么意義?
答:序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網絡之間。序列化是為了解決對象流讀寫操作時可能引發的問題(如果不進行序列化可能會存在數據亂序的問題)。要實現序列化,需要讓一個類實現Serializable接口,該接口是一個標識性接口,標注該類對象是可被序列化的,然后使用一個輸出流來。構造一個對象輸出流并通過writeObject(Object obj)方法就可以將實現對象寫出(即保存其狀態);如果需要反序列化則可以用一個輸入流建立對象輸入流,然后通過readObject方法從流中讀取對 象。序列化除了能夠實現對象的持久化之外,還能夠用于對象的深度克隆。

84、heap和stack有什么區別。
答:java的內存分為兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用于存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。堆是與棧作用不同的內存,一般用于存放不放在當前方法棧中的那些數據,例如,使用new創建的對象都放在堆里,所以,它不會隨方法的結束而消失。方法中的局部變量使用final修飾后,放在堆中,而不是棧中。

1、談談你對面向對象的理解
答:
面向對像的程序是由類組成的,每個類包含對用戶公開的特定功能部分和隱藏的實現部分。傳統的結構化程序設計通過設計一系列的過程(即算法)來求解問題。這一些過程一旦被確定,就要開始考考慮存儲數據的方式,這就明確的表述了程序員的工作方式。但面相對像卻調換了這個順序,它不必關心數據對象的具體實現,只要能滿足用戶的需求即可。面向對象有三個最基本的特性,即:封裝,繼承,多態。

2、ClassLoader如何加載class 。
答:
jvm里有多個類加載,每個類加載可以負責加載特定位置的類,例如,bootstrap類加載負責加載jre/lib/rt.jar中的類, 我們平時用的jdk中的類都位于rt.jar中。extclassloader負責加載jar/lib/ext/*.jar中的類,appclassloader負責classpath指定的目錄或jar中的類。除了bootstrap之外,其他的類加載器本身也都是java類,它們的父類是ClassLoader。

3、如何實現線程通訊

①同步 這里講的同步是指多個線程通過synchronized關鍵字這種方式來實現線程間的通信。
這種方式,本質上就是“共享內存”式的通信。多個線程需要訪問同一個共享變量,誰拿到了鎖(獲得了訪問權限),誰就可以執行。
③wait/notify機制
②while輪詢的方式

二、jsp/servlet/jquery/ajax

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

2、什么情況下調用doGet()和doPost()?
答:Jsp頁面中的FORM標簽里的method屬性為get時調用doGet(),為post時調用doPost()。
15、自定義標簽要繼承哪個類?
答案:這個類可以繼承TagSupport或者BodyTagSupport,兩者的差別是前者適用于沒有主體的標簽,而后者適用于有主體的標簽。如果選擇繼承TagSupport,可以實現doStartTag和doEndTag兩個方法實現Tag的功能,如果選擇繼承BodyTagSupport,可以實現doAfterBody這個方法。

3、request.getAttribute()和request.getParameter() 有何區別?

答:getAttribute是返回對象,getParameter返回字符串 。總的來說:request.getAttribute()方法返回request范圍內存在的對象,而request.getParameter()方法是獲取http提交過來的數據。

4、jsp有哪些內置對象?作用分別是什么? 分別有什么方法?

答:
JSP中九大內置對象為:

對象 含義 類型 作用域
request 請求對象 javax.servlet.ServletRequest Request
response 響應對 javax.servlet.SrvletResponse Page
pageContext 頁面上下文對象 javax.servlet.jsp.PageContext Page
session 會話對象 javax.servlet.http.HttpSession Session
application 應用程序對象 javax.servlet.ServletContext Application
out 輸出對象 javax.servlet.jsp.JspWriter Page
config 配置對象 javax.servlet.ServletConfig Page
page 頁面對象 javax.lang.Object Page
exception 例外對象 javax.lang.Throwable page
相關方法:

request對象代表的是來自客戶端的請求,例如我們在FORM表單中填寫的信息等,是最常用的對象。常用的方法有:getParameter、getParameterNames 和getParameterValues通過調用這幾個方法來獲取請求對象中所包含的參數的值。
response 對象代表的是對客戶端的響應,也就是說可以通過response 對象來組織發送到客戶端的數據。但是由于組織方式比較底層,所以不建議普通讀者使用,需要向客戶端發送文字時直接使用
pageContext對象直譯時可以稱作“頁面上下文”對象,代表的是當前頁面運行的一些屬性。常用的方法有 :findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope。一般情況下pageContext對象用到得也不是很多,只有在項目所面臨的情況比較復雜的情況下,才會利用到頁面屬性來輔助處理。
session對象代表服務器與客戶端所建立的會話,當需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物、客戶軌跡跟蹤等。“session” 對象建立在cookie的基礎上,所以使用時應注意判斷一下客戶端是否打開了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。

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

答:request,session,application,cookie等。

6、J2EE是技術還是平臺還是框架? 什么是J2EE

答:J2EE本身是一個標準,一個為企業分布式應用的開發提供的標準平臺。 J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。

7、什么是MVC模式?

MVC是三個單詞的首字母縮寫,它們是Model(模型)、View(視圖)和Controller(控制)。
這個模式認為,程序不論簡單或復雜,從結構上看,都可以分成三層:

1)最上面的一層,是直接面向最終用戶的"視圖層"(View)。它是提供給用戶的操作界面,是程序的外殼。
2)最底下的一層,是核心的"數據層"(Model),也就是程序需要操作的數據或信息。
3)中間的一層,就是"控制層"(Controller),它負責根據用戶從"視圖層"輸入的指令,選取"數據層"中的數據,然后對其進行相應的操作,產生最終結果。
這三層是緊密聯系在一起的,但又是互相獨立的,每一層內部的變化不影響其他層。每一層都對外提供接口(Interface),供上面一層調用。這樣一來,軟件就可以實現模塊化,修改外觀或者變更數據都不用修改其他層,大大方便了維護和升級。

8、解析xml有哪幾種方式,優缺點?

1、JDOM生成和解析XML
為減少DOM、SAX的編碼量,出現了JDOM。優點:20-80原則,極大減少了代碼量。使用場合:要實現的功能簡單,如解析、創建等,但在底層,JDOM還是使用SAX(最常用)、DOM、Xanan文檔。
2、SAX生成和解析XML文檔
為解決DOM的問題,出現了SAX,SAX事件驅動。當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,占用資源少。SAX解析器代碼比DOM解析器代碼小,適于Applet下載。缺點:不是持久的,事件過后若沒保存數據,那么數據就丟了。無狀態性,從事件中只能得到文本,但不知該文本屬于哪個元素。使用場合:Applet。只需XML文檔的少量內容,很少回頭訪問,機器內存少。
3、DOM生成和解析XML文檔
為XML文檔的已解析版本定義了一組接口。解析器讀入整個文檔,然后構建一個駐留內存的樹結構,然后代碼就可以使用DOM 接口來操作這個樹結構。優點:整個文檔樹在內存中,便于操作,支持刪除、修改、重新排列等多種功能。缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間。使用場合:一旦解析了文檔還需多次訪問這些數據,硬件資源充足(內存、CPU)。

4、DOM4J生成和解析XML文檔

DOM4J是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的Java 軟件都在使用DOM4J來讀寫XML,特別值得一提的是連 Sun 的JAXM也在用DOM4J。

題目補充

1、靜態include和動態include的區別

<% @ include file="include.html" %>靜態include主要是對靜態頁面的引入,不會檢查所包含文件的變化

<jsp:include>動態include主要是對動態頁面的引入,它總是會檢查所引入的頁面的變化,如果所包含的資源在請求間發生變化,則下一次請求包含<jsp:include>動作的jsp時,將包含資源的新內容。

<jsp:include>動作包含的屬性:
page:指定所包含資源的相對url路徑,該資源必須時同一web應用程序的組成部分。
flush:指定在執行include動作后是否應刷新緩沖區,在jsp1.1中,該屬性必須設置為真。
使用動態include動作時,根據jsp1.1規范,jsp容器允許判斷通過include指令包含的資源是否發生變化。如果發生變化。則容器可以重新編譯包含該資源的jsp,然而,該規范并沒有提供向容器表明某個包含的資源發生變化的機制。

動態include的優點和不足:

優點:
1:引入和同步一個動態的頁面,使jsp頁面更具靈活性
2:能和不同頁面之間進行信息的交互和快捷的實現方式。
3:改變了原始的所有頁面編碼都放在一個jsp上,使不同的功能分別寫在不同頁里,通過動態include方式引用到頁面,更易于編碼,更易于管理。

不足:
動態的引入時需要頻繁的變化和頁面信息的更新和交互,要占用大量的資源開銷。降低頁面的訪問速度。如果在沒必要動態引入的情況下,不要使用動態include
應該注意事項:

1:<jsp:include>動作的flush屬性必須要定義,不定義會出現轉換錯誤。而且設置的flush必須要為true
2:在<jsp:include>動作中指定的頁面必須是同一web應用程序的一部分。如果引入的是非同一web應用的頁面將導致請求時錯誤。

16、jsp頁面是在服務器端運行還是在客戶端運行?
答案:服務器端。JSP與Java Servlet一樣

三、Spring/SpringMVC/mybatis/hibernate

22、什么是ORM框架?
答案:ORM(Object Relational Mapping)框架采用元數據來描述對象一關系映射細節,元數據一般采用XML格式,并且存放在專門的對象一映射文件中。通過某種關系來維持實體對象和數據庫之間的關系,然后通過實體對象的操作來實現數據庫的操作。也就是對象關系映射。

23、你了解哪幾種orm框架?
答案:Hibernate/myBatis 等。myBatis不完全是orm,需要手動寫sql。

24、你用過哪幾個版本控制工具?
答案:GIT等。

未完待續...
四、數據庫
五、編程題
六、編程題

webservice是什么?
一言以蔽之:WebService是一種跨編程語言和跨操作系統平臺的遠程調用技術。
所謂跨編程語言和跨操作平臺,就是說服務端程序采用java編寫,客戶端程序則可以采用其他編程語言編寫,反之亦然!跨操作系統平臺則是指服務端程序和客戶端程序可以在不同的操作系統上運行。

所謂遠程調用,就是一臺計算機a上的一個程序可以調用到另外一臺計算機b上的一個對象的方法,譬如,銀聯提供給商場的pos刷卡系統,商場的POS機轉賬調用的轉賬方法的代碼其實是跑在銀行服務器上。再比如,amazon,天氣預報系統,淘寶網,校內網,百度等把自己的系統服務以webservice服務的形式暴露出來,讓第三方網站和程序可以調用這些服務功能,這樣擴展了自己系統的市場占有率,往大的概念上吹,就是所謂的SOA應用。

其實可以從多個角度來理解WebService,從表面上看,WebService就是一個應用程序向外界暴露出一個能通過Web進行調用的API,也就是說能用編程的方法通過Web來調用這個應用程序。我們把調用這個WebService的應用程序叫做客戶端,而把提供這個WebService的應用程序叫做服務端。從深層次看,WebService是建立可互操作的分布式應用程序的新平臺,是一個平臺,是一套標準。它定義了應用程序如何在Web上實現互操作性,你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫Web service ,只要我們可以通過Web service標準對這些服務進行查詢和訪問。

WebService平臺需要一套協議來實現分布式應用程序的創建。任何平臺都有它的數據表示方法和類型系統。要實現互操作性,WebService平臺必須提供一套標準的類型系統,用于溝通不同平臺、編程語言和組件模型中的不同類型系統。Web service平臺必須提供一種標準來描述Web service,讓客戶可以得到足夠的信息來調用這個Web service。最后,我們還必須有一種方法來對這個Web service進行遠程調用,這種方法實際是一種遠程過程調用協議(RPC)。為了達到互操作性,這種RPC協議還必須與平臺和編程語言無

WebService平臺技術
XML+XSD,SOAP和WSDL就是構成WebService平臺的三大技術。
XML+XSD:
WebService采用HTTP協議傳輸數據,采用XML格式封裝數據(即XML中說明調用遠程服務對象的哪個方法,傳遞的參數是什么,以及服務對象的返回結果是什么)。XML是WebService平臺中表示數據的格式。除了易于建立和易于分析外,XML主要的優點在于它既是平臺無關的,又是廠商無關的。無關性是比技術優越性更重要的:軟件廠商是不會選擇一個由競爭對手所發明的技術的。
XML解決了數據表示的問題,但它沒有定義一套標準的數據類型,更沒有說怎么去擴展這套數據類型。例如,整形數到底代表什么?16位,32位,64位?這些細節對實現互操作性很重要。XML Schema(XSD)就是專門解決這個問題的一套標準。它定義了一套標準的數據類型,并給出了一種語言來擴展這套數據類型。WebService平臺就是用XSD來作為其數據類型系統的。當你用某種語言(如VB.NET或C#)來構造一個Web service時,為了符合WebService標準,所有你使用的數據類型都必須被轉換為XSD類型。你用的工具可能已經自動幫你完成了這個轉換,但你很可能會根據你的需要修改一下轉換過程。
SOAP:
WebService通過HTTP協議發送請求和接收結果時,發送的請求內容和結果內容都采用XML格式封裝,并增加了一些特定的HTTP消息頭,以說明HTTP消息的內容格式,這些特定的HTTP消息頭和XML內容格式就是SOAP協議。SOAP提供了標準的RPC方法來調用Web Service。
SOAP協議 = HTTP協議 + XML數據格式
SOAP協議定義了SOAP消息的格式,SOAP協議是基于HTTP協議的,SOAP也是基于XML和XSD的,XML是SOAP的數據編碼方式。打個比喻:HTTP就是普通公路,XML就是中間的綠色隔離帶和兩邊的防護欄,SOAP就是普通公路經過加隔離帶和防護欄改造過的高速公路。
WSDL:
好比我們去商店買東西,首先要知道商店里有什么東西可買,然后再來購買,商家的做法就是張貼廣告海報。 WebService也一樣,WebService客戶端要調用一個WebService服務,首先要有知道這個服務的地址在哪,以及這個服務里有什么方法可以調用,所以,WebService務器端首先要通過一個WSDL文件來說明自己家里有啥服務可以對外調用,服務是什么(服務中有哪些方法,方法接受的參數是什么,返回值是什么),服務的網絡地址用哪個url地址表示,服務通過什么方式來調用。
WSDL(Web Services Description Language)就是這樣一個基于XML的語言,用于描述Web Service及其函數、參數和返回值。它是WebService客戶端和服務器端都能理解的標準格式。因為是基于XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應WebService的代理類代碼。
WSDL文件保存在Web服務器上,通過一個url地址就可以訪問到它。客戶端要調用一個WebService服務之前,要知道該服務的WSDL文件的地址。WebService服務提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊到UDDI服務器,以便被人查找;2.直接告訴給客戶端調用者。

webservice有幾種實現方式?
1.Axis2
  Axis是apache下一個開源的webservice開發組件,出現的算是比較早了,也比較成熟。這里主要介紹Axis+eclipse開發webservice,當然不用eclipse也可以開發和發布webservice,只是用eclipse會比較方便。
2.Apche CXF
  CXF開發webservice也是比較方便和簡單的,它和spring的集成可以說是非常地好。
3.JDK開發webservice(jdk自帶的jaxws)

webservice配置步驟?

施用Spring+CXF開發WebService,使用注解方式

Webservice如何控制事務?

WebService入門詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容