匯總題

一、Java基礎(chǔ)

1.寫出下面代碼的執(zhí)行結(jié)果

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.寫出下面代碼的執(zhí)行結(jié)果

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結(jié)果為int類型不兼容

3.寫出下面代碼的執(zhí)行結(jié)果 (此題需寫出分析過程,沒有分析過程不得分,分值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捕獲相應(yīng)的異常類型,finally始終會執(zhí)行

4.寫出下面代碼執(zhí)行的結(jié)果(此題需寫出分析過程,沒有分析過程不得分,分值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

||具有“短路功能”當(dāng)左邊為真后 右邊不在執(zhí)行

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

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();調(diào)用 MyThread 的run()方法,當(dāng)前線程為主線程main睡眠3s
t.start();啟動一個新的線程,先的線程睡眠3s所以Thread Test會先打印

6.執(zhí)行B.main的結(jié)果是什么?(此題需寫出分析過程,沒有分析過程不得分,分值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調(diào)用的是當(dāng)前對象,a = b a指向new B();

7.執(zhí)行ListTest.main的結(jié)果是什么?(此題需寫出分析過程,沒有分析過程不得分,分值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循環(huán)當(dāng)中每次改變的都是同一個date對象中的值,應(yīng)該在for循環(huán)內(nèi)創(chuàng)建(new)對象

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

1. 
abstract class Name {
private String name;
// 抽象類中的抽象方法,不應(yīng)該有方法體
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 ();// 抽象方法不應(yīng)該是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();
         
        // 靜態(tài)方法main中調(diào)用doSomething, 但是doSomething不是static修飾的
        System.out.println("s.doSomething() returns " + doSomething());
    }
    public String doSomething() {
        return "Do something ...";
    }
}

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

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

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

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

或者
/**
 * 將字符串變成數(shù)組
 * 對數(shù)組反轉(zhuǎn),將數(shù)組變成字符串
 */
public static String reverseString(String s, int start, int end) {
    //字符串變數(shù)組。
    char[] chs = s.toCharArray();
    //反轉(zhuǎn)數(shù)組。
    reverse(chs, start, end);
    //將數(shù)組變成字符串。
    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();
   }

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

題目補充

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

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

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

4、面向?qū)ο缶幊痰脑瓌t是什么?
答案:主要有三點,多態(tài),繼承和封裝。

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

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

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

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

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

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

11、進程和線程的區(qū)別是什么?
答案:進程是執(zhí)行著的應(yīng)用程序,而線程是進程內(nèi)部的一個執(zhí)行序列。一個進程可以有多個線程。線程又叫做輕量級進程。

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

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

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

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

19、在JAVA中,如何跳出當(dāng)前的循環(huán)?
答案:用break; return方法。

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

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

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

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

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

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

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

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

32、不通過構(gòu)造函數(shù)也能創(chuàng)建對象嗎(A)
A 是 B 否
(1)用new語句創(chuàng)建對象,這是最常見的創(chuàng)建對象的方法。
(2) 運用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。
(3) 調(diào)用對象的clone()方法。
(4) 運用反序列化手段,調(diào)用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、當(dāng)一個對象被當(dāng)作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?
答:是值傳遞。Java編程語言只有值傳遞參數(shù)。當(dāng)一個對象實例作為一個參數(shù)被傳遞到方法中時,參數(shù)的值就是對該對象的引用。對象的屬性可以在被調(diào)用過程中被改變,但對象的引用是永遠(yuǎn)不會改變的。

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

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

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

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

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

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

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

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

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

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

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

46、Error和Exception有什么區(qū)別?
答:Error 表示系統(tǒng)級的錯誤和程序不必處理的異常,是恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題;比如內(nèi)存溢出,不可能指望程序能處理這樣的情 況;Exception表示需要捕捉或者需要程序進行處理的異常,是一種設(shè)計或?qū)崿F(xiàn)問題;也就是說,它表示如果程序運行正常,從不會發(fā)生的情況。

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

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

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

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

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

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

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

1、談?wù)勀銓γ嫦驅(qū)ο蟮睦斫?br> 答:
面向?qū)ο竦某绦蚴怯深惤M成的,每個類包含對用戶公開的特定功能部分和隱藏的實現(xiàn)部分。傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計通過設(shè)計一系列的過程(即算法)來求解問題。這一些過程一旦被確定,就要開始考考慮存儲數(shù)據(jù)的方式,這就明確的表述了程序員的工作方式。但面相對像卻調(diào)換了這個順序,它不必關(guān)心數(shù)據(jù)對象的具體實現(xiàn),只要能滿足用戶的需求即可。面向?qū)ο笥腥齻€最基本的特性,即:封裝,繼承,多態(tài)。

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

3、如何實現(xiàn)線程通訊

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

二、jsp/servlet/jquery/ajax

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

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

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

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

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

答:
JSP中九大內(nèi)置對象為:

對象 含義 類型 作用域
request 請求對象 javax.servlet.ServletRequest Request
response 響應(yīng)對 javax.servlet.SrvletResponse Page
pageContext 頁面上下文對象 javax.servlet.jsp.PageContext Page
session 會話對象 javax.servlet.http.HttpSession Session
application 應(yīng)用程序?qū)ο?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
相關(guān)方法:

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

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

答:request,session,application,cookie等。

6、J2EE是技術(shù)還是平臺還是框架? 什么是J2EE

答:J2EE本身是一個標(biāo)準(zhǔn),一個為企業(yè)分布式應(yīng)用的開發(fā)提供的標(biāo)準(zhǔn)平臺。 J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術(shù)。

7、什么是MVC模式?

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

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

8、解析xml有哪幾種方式,優(yōu)缺點?

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

4、DOM4J生成和解析XML文檔

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

題目補充

1、靜態(tài)include和動態(tài)include的區(qū)別

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

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

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

動態(tài)include的優(yōu)點和不足:

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

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

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

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

三、Spring/SpringMVC/mybatis/hibernate

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

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

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

未完待續(xù)...
四、數(shù)據(jù)庫
五、編程題
六、編程題

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

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

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

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

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

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

webservice配置步驟?

施用Spring+CXF開發(fā)WebService,使用注解方式

Webservice如何控制事務(wù)?

WebService入門詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容