java學習筆記2

1. JDK、JRE和JVM分別是什麼,區別是什麼?javascript

答:html

 

①、JDK 是整個Java的核心,包括了Java運行環境、Java工具和Java基礎類庫。前端

 

②、JRE(Java Runtime Environment,Java運行環境),運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。java

 

③、JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是經過在實際的計算機上仿真模擬各類計算機功能來實現的。mysql

 

2. 寫一個冒泡法程序,給10個雜亂無章的數字,按照從小到大的順序排列出來。git

Java程序爲:程序員

 

 

class Java_Demo2 { web

    public static void main(String[] args) { 面試

        int[] a = {5,6,4,3,2,1,8,7,9,0}; ajax

        maoPao(a); 

    } 

    //冒泡排序法 

    public static void maoPao(int[] a){ 

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

            for(int j=i;j<a.length;j++){ 

                if(a[i]>a[j]){ 

                    int s = a[i]; 

                    a[i] = a[j]; 

                    a[j] = s; 

                } 

            } 

            System.out.print(a[i] + "\t"); 

        } 

        System.out.println(); 

    } 

3. JDK1.7的新特性。

答:

 

1,switch中能夠使用字串

 

Java代碼:

 

 

String s = "test";    

switch (s) {    

  case "test" :    

     System.out.println("test");   

  case "test1" :    

    System.out.println("test1");  

    break ;    

  default :    

    System.out.println("break");  

    break ;    

 }  <span style="font-family: Arial, Helvetica, sans-serif;"> </span> 

2,"<>"這個玩意兒的運用List<String> tempList = new ArrayList<>(); 即泛型實例化類型自動推斷。

 

3. 語法上支持集合,而不必定是數組

 

Java代碼:

 

 

final List<Integer> piDigits = [ 1,2,3,4,5,8 ];  

4. 新增一些取環境信息的工具方法

 

Java代碼:

 

 

File System.getJavaIoTempDir() // IO臨時文件夾  

File System.getJavaHomeDir() // JRE的安裝目錄  

File System.getUserHomeDir() // 當前用戶目錄  

File System.getUserDir() // 啓動java進程時所在的目錄  

....... <span style="font-family: Arial, Helvetica, sans-serif;"> </span> 

5. Boolean類型反轉,空指針安全,參與位運算

 

Java代碼:

 

 

Boolean Booleans.negate(Boolean booleanObj)  

True => False , False => True, Null => Null  

boolean Booleans.and(boolean[] array)  

boolean Booleans.or(boolean[] array)  

boolean Booleans.xor(boolean[] array)  

boolean Booleans.and(Boolean[] array)  

boolean Booleans.or(Boolean[] array)  

boolean Booleans.xor(Boolean[] array)  

6. 兩個char間的equals

 

Java代碼:

 

 

boolean Character.equalsIgnoreCase(char ch1, char ch2)  

7,安全的加減乘除

 

Java代碼:

 

 

int Math.safeToInt(long value) 

int Math.safeNegate(int value) 

long Math.safeSubtract(long value1, int value2) 

long Math.safeSubtract(long value1, long value2) 

int Math.safeMultiply(int value1, int value2)  

long Math.safeMultiply(long value1, int value2) 

long Math.safeMultiply(long value1, long value2) 

long Math.safeNegate(long value) 

int Math.safeAdd(int value1, int value2) 

long Math.safeAdd(long value1, int value2) 

long Math.safeAdd(long value1, long value2) 

int Math.safeSubtract(int value1, int value2) 

4. switch語句可否做用在byte上,可否做用在long上,可否做用在String上。

答:在JDK1.6的版本中,switch後面的括號裏面只能放int類型的值,注意是隻能放int類型,可是放byte,short,char類型的也能夠是由於byte,short,shar能夠自動提高(自動類型轉換)爲int。而不能放long型和String型。

 

而在JDK1.7的版本中,switch中能夠使用字串String。但仍不支持long型。

 

Example1:

 

 

String name = "b";    

switch(name) {   

    case "a":   

     System.out.println("String能夠用於switch語句");   

        break;   

} //能夠運行 

Example2:

 

 

long long_s = 22222;    

 switch (long_s) {    

 case 22222:    

 System.out.println("String能夠用於switch語句");    

 break;    

 }    //報錯!!! 

5. short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

答:對於short s1 = 1; s1 = s1 + 1; 中s1 = s1 + 1;默認是int型的。

 

若是想繼續計算,必須增強制轉換

 

         short s1 = 1;

 

         s1 = (short) (s1 + 1);

 

對於short s1 = 1; s1 += 1;  該段程序是沒有錯誤的。

 

6. 說說&和&&的區別;

答:&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)。

if(expression1 & expression2){}中expression1 和expression2 不管expression1返回true仍是false,都會繼續判斷expression2的返回值

if(expression1 && expression2){}中若是expression1 返回false,那麼expression2 不執行,跳出if語句,若是expression1 返回true,繼續判斷expression2

 

7. char可否表達一箇中文漢字。

答:能夠的。

 

Example:

 

         char cc = '說';

 

         System.out.println(cc); 

 

能夠執行並輸出「說」

 

 

2013-07-16

1. 靜態變量和實例變量的區別?

答:在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。

 

在程序運行時的區別:實例變量屬於某個對象的屬性,必須建立了實例對象,其中的實例變量纔會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對 象,而是屬於類,因此也稱爲類變量,只要程序加載了類的字節碼,不用建立任何實例對象,靜態變量就會被分配空間,靜態變量就能夠被使用了。總之,實例變量 必須建立對象後才能夠經過這個對象來使用,靜態變量則能夠直接使用類名來引用。

 

2. 可否從static方法內部訪問非static方法?

答:不能夠。

 

static修飾的方法能夠直接用類名調用,非static修飾的方法必須用類new出對象才能調用。當咱們用類名直接調用時,可能這個類的對象並無new,若是這時候static方法裏調用非static的方法就會出現異常。

 

3. Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:Math.round() 函數是向上取整。

 

因此Math.round(11.5)等於 12;Math.round(-11.5)等於 - 11。

 

4. 數組長度和字符串長度如何獲取。

答:數組長度的獲取:數組名.length。Eg:arr.length。

 

字符串長度的獲取:字符串名.length()。Eg:string.length()。

 

字符串是length() 方法,數組是length 屬性。

 

5. 知足重載的條件是什麼,構造方法和普通方法均可以重載嗎?

答:函數重載要求方法名一致,參數列表不同(包括參數的個數、順序、數據結構)。

 

構造方法和普通方法都是能夠重載的。

 

6. 如何把一段逗號分割的字符串轉換成一個數組;

答:拆分字符串能夠運行split函數。

 

Example://將字符串str1按照逗號拆分並輸出的程序以下所示

 

 

System.out.println("拆分"); 

String[] strarr = str1.split(","); 

for(String s : strarr){ 

    System.out.print(s+"\t"); 

7. Integer和int的區別?什麼是自動裝箱、自動拆箱?

答:int 是基本數據類型,Integer是其包裝類。

 

Java爲每一個原始類型提供了封裝類,Integer是java爲int提供的封裝類。int的默認值爲0,而Integer的默認值爲null,即Integer能夠區分出未賦值和值爲0的區別,int則沒法表達出未賦值的狀況,例如,要想表達出沒有參加考試和考試成績爲0的區別,則只能使用Integer。

 

自動裝箱:Java編譯器將基本數據類型自動轉換爲包裝類的過程。

 

例如:Integer i = 100;

 

    至關於編譯器自動做如下的語法編譯:Integer i = new Integer(100);

 

自動拆箱:Java編譯器將包裝類自動轉換爲基本數據類型的過程。

 

例如:

 

Integer i = 100;

 

int x = i;

 

至關於編譯器自動做如下的語法編譯:int x = i.intValue();

 

 

2013-07-17

1.  "=="和equals方法究竟有什麼區別?

答:==和equals的區別

 

1. ==能夠用來比較基本類型和引用類型,判斷內容和內存地址

 

2. equals只能用來比較引用類型,它只判斷內容。該函數存在於老祖宗類 java.lang.Object

 

對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的狀況下,他們之間的比較仍是基於他們在內存中的存放位置的地址值的,由於Object的equals方法也是用雙等號(==)進行比較的,因此比較後的結果跟雙等號(==)的結果相同。

 

2. Overload和Override的區別。Overloaded的方法是否能夠改變返回值的類型?

答:Overload表示方法重載,針對的是單一類。Overload要求方法名同樣,而參數列表要不同(包括參數的個數、順序、數據類型)。

 

Override表示方法覆蓋,針對的是有繼承關係的類。當子類的某一方法與父類的方法名同樣,而且參數列表徹底同樣(包括參數的個數、順序、數據類型)的時候,咱們稱之爲方法覆蓋。

 

3. 接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承具體類(concrete class)? 抽象類中是否能夠有靜態的main方法?

答:接口能夠繼承接口。而且,接口之間的繼承也容許多重繼承的狀況。

 

Example1:

 

interface A {}

 

interface AA {}

 

interface AAA extends A,AA{}

 

抽象類也能夠實現接口。

 

Example2:

 

interface A {}

 

interface AA {}

 

interface AAA extends A,AA{}

 

abstract class D implements AAA {}

 

抽象類能夠繼承具體類。

 

Example3:

 

class E{}

 

abstract class F extends E{}

 

抽象類中能夠有靜態的main方法:

 

Example4:

 

abstract class TestDemo_InterfaceTest{

 

public static void main(String[] args) {

 

System.out.println("Hello World!");

 

}

 

}

 

4. abstract class和interface有什麼區別?

答:聲明方法的存在而不去實現它的類被叫作抽象類(abstract class),它用於要建立一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的狀況。不能建立abstract 類的實例。

 

接口(interface)是抽象類的變體。在接口中,全部方法都是抽象的。多繼承性可經過實現這樣的接口而得到。接口中的全部方法都是抽象的,沒有一個有程序體。接口只能夠定義static final成員變量。

 

 

2013-07-18

1. 簡述OOP三大特徵。

答:①、封裝

    所謂封裝,就是將某些東西包裝和隱藏起來,讓外界沒法直接使用,只能經過某些特定的方式才能訪問。OOP將萬物都視爲「對象」,任何對象都具備特性和行爲。咱們將其特性稱爲「成員變量」,將其行爲稱之爲「成員函數」,被封裝的特性只能經過特定的行爲去訪問。

 

②、繼承

   後代具備祖先的某些特色就叫繼承,固然後代還能夠具備本身獨有的特徵。繼承是一種聯結類的層次模型,而且容許和 鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類能夠從現有的類中派生,這個過程稱爲類繼承。新類繼承了原始類的特性,新類稱爲原始類的派 生類(子類),而原始類稱爲新類的基類(父類)。派生類能夠從它的基類那裏繼承方法和實例變量,而且類能夠修改或增長新的方法使之更適合特殊的須要。

 

③、多態

 

多態性是容許將父對象設置成爲和一個或更多的他的子對象相等的技術,賦值以後,父對象就能夠根據當前賦值給它的子對象的特性以不一樣的方式運做。即經過多態,相同類型的變量,調用相同的方法,卻可以產生不一樣的結果。

 

2. Java中實現多態的機制是什麼?什麼是造型,爲何要造型?

答:Java中實現多態的機制靠的是父類或者接口定義的引用變量能夠指向子類或者具體的實現類的實例對象,而程序調的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。

 

具體來講,就是父類A有一個方法function(),子類B,C分別繼承A而且重寫function(),當建立一個對象A b = new B(); b.function()就調用B的funciotn,假如你new C(),那調用的就是C重寫的function。怎麼判斷使用那個類的function就是動態綁定,這個現象就是多態。

 

造型是將父類類型引用變量的值直接賦給聲明爲子類類型的變量。

 

造型的做用:在多態中,因爲對象以其父類的身份出現,因此對子類中新添加的成員的訪問受到限制,若想實現這些受限制的方法,就須要經過造型來恢復一個對象的原本面目。

 

 

2013-07-19

1. 如何把一段逗號分割的字符串轉換成一個數組?

答:拆分字符串能夠運行split函數。

 

Example://將字符串str1按照逗號拆分並輸出的程序以下所示

 

 

System.out.println("拆分"); 

String[] strarr = str1.split(","); 

for(String s : strarr){ 

System.out.print(s+"\t"); 

2. 運行時異常和聲明型異常有什麼區別?舉出常見的幾個RuntimeException

異常表示程序運行過程當中可能出現的非正常狀態,運行時異常表示虛擬機的一般操做中可能遇到的異常,是一種常見運行錯誤。

 

java編譯器要求方法必須聲明拋出可能發生的非運行時異常,可是並不要求必須聲明拋出未被捕獲的運行時異常。

 

3. String和StringBuffer、StringBuilder的區別。

String類提供了數值不可改變的字符串。

 

StringBuffer類提供的字符串進行修改。而且它是線程安全的。

 

StringBuilder 和StringBuffer類同樣,只是他的字符串變量是非線程安全的。

 

4. String s = "Hello";s = s + " world!";這兩行代碼執行後,原始的String對象中的內容到底變了沒有?

答:沒有。由於String是不可變類,因此它的全部對象都是不可變對象。執行代碼後,s不指向原來那個對象了,而指向了另外一個 String對象,內容爲"Hello world!",原來那個對象還存在於內存之中,只是s這個引用變量再也不指向它了。

 

5. 什麼是內部類?Static Nested Class 和 Inner Class的不一樣。

答:內部類能夠說是外部類的一個普通成員。

 

靜態的Static nested class是不能夠直接調用它的外部類enclosing class的,可是能夠經過外部類的引用來調用,就像你在一個類中寫了main方法同樣。

 

非靜態類inner class 能夠自由的引用外部類的屬性和方法,可是它與一個實例綁定在了一塊兒,不能夠定義靜態的屬性、方法 。

 

Inner Class(內部類)定義在類中的類。

 

Nested Class(嵌套類)是靜態(static)內部類。1. 要建立嵌套類的對象,並不須要其外圍類的對象。 2. 不能從嵌套類的對象中訪問非靜態的外圍類對象。

 

 

2013-07-20

1. 介紹Collection框架的結構. Collection和Collections的區別?

答:Collection框架的完整結構

 

1.類集框架最大的接口:Collection、Map、Iterator、Enumeration

 

2.Collection:存放單值

 

   |- List:容許有重複內容,有序

 

       |- ArrayList:異步處理,新的操做類,非線程安全。

 

       |- Vector:同步處理,舊的操做類,線程安全。支持Enumeration輸出

 

   |- Set:不容許有重複內容,無序,靠hashCoke()和equals()進行重複的嚴重

 

       |- HashSet:無序存放

 

       |- TreeSet:有序存放,安Comparable排序

 

3.Map:存放一對值

 

   |- HashMap:新的類,異步處理,非線程安全,容許有null

 

   |- Hashtable:舊的類,同步處理,線程安全,不容許有null

 

        |- Properties:屬性操做類

 

   |- TreeMap:有序排列,按key排序,根據Comparable指定排序規則

 

4.Iterator:

 

   |- 迭代輸出,依靠Collection接口中的iterator方法輸出,是新的輸出標準

 

5.Enumeration:舊的輸出標準

 

  Collection和Collections的區別:

 

Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.

Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。

 

2. List、Set和Map的區別,Map是不是Collection子接口?說出它的主要方法,及各類類型的存儲性能區別。

答:List、Set和Map的區別:

 

List是有序的Collection,使用此接口可以精確的控制每一個元素插入的位置。用戶可以使用索引(元素在List中的位置,相似於數組下標)來訪問List中的元素,這相似於Java的數組。 和Set不一樣,List容許有相同的元素。

 

Set是一種不包含重複的元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。 Set的構造函數有一個約束條件,傳入的Collection參數不能包含重複的元素。

 

Map提供key到value的映射。一個Map中不能包含相同的key,每一個key只能映射一個value。Map接口提供3種集合的視圖,Map的內容能夠被看成一組key集合,一組value集合,或者一組key-value映射。

 

Map不是Collection的子接口。

 

實現List接口的經常使用類有LinkedList,ArrayList,Vector和Stack。

LinkedList類:

LinkedList實現了List接口,容許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操做使LinkedList可被用做堆棧(stack),隊列(queue)或雙向隊列(deque)。 LinkedList沒有同步方法。若是多個線程同時訪問一個List,則必須本身實現訪問同步。一種解決方法是在建立List時構造一個同步的List:

List list = Collections.synchronizedList(new LinkedList(...));

ArrayList類:

ArrayList實現了可變大小的數組。它容許全部元素,包括null。ArrayList沒有同步。

size,isEmpty,get,set方法運行時間爲常數。可是add方法開銷爲分攤的常數,添加n個元素須要O(n)的時間。其餘的方法運行時間爲線性。每一個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增長,可是增加算法並無定義。當須要插入大量元素時,在插入前能夠調用ensureCapacity方法來增長ArrayList的容量以提升插入效率。和LinkedList同樣,ArrayList也是非同步的(unsynchronized)。

Vector類:

Vector很是相似ArrayList,可是Vector是同步的。由Vector建立的Iterator,雖然和ArrayList建立的Iterator是同一接口,可是,由於Vector是同步的,當一個Iterator被建立並且正在被使用,另外一個線程改變了Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出ConcurrentModificationException,所以必須捕獲該異常。

Stack 類:

Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被看成堆棧使用。基本的push和pop方法,還有peek方法獲得棧頂的元素,empty方法測試堆棧是否爲空,search方法檢測一個元素在堆棧中的位置。Stack剛建立後是空棧。

 

實現Set接口的經常使用類有HashSet,TreeSet。

 

HashSet是Set接口的一個子類,主要的特色是:裏面不能存放重複元素,並且採用散列的存儲方式,因此沒有順序。

 

TreeSet的主要特色是:可對輸入的數據進行有序排列。

 

實現Map接口的經常使用類有Hashtable,HashMap,Treemap。

 

Hashtable類:

 

Hashtable繼承Map接口,實現一個key-value映射的哈希表。任何非空(non-null)的對象均可做爲key或者value。 添加數據使用put(key, value),取出數據使用get(key),這兩個基本操做的時間開銷爲常數。 Hashtable經過initial capacity和load factor兩個參數調整性能。一般缺省的load factor 0.75較好地實現了時間和空間的均衡。增大load factor能夠節省空間但相應的查找時間將增大,這會影響像get和put這樣的操做。 Hashtable是同步的。

HashMap類:

HashMap和Hashtable相似,不一樣之處在於HashMap是非同步的,而且容許null,即null value和null key。,可是將HashMap視爲Collection時(values()方法可返回Collection),其迭代子操做時間開銷和HashMap的容量成比例。所以,若是迭代操做的性能至關重要的話,不要將HashMap的初始化容量設得太高,或者load factor太低。

WeakHashMap類:

Treemap:適用於按天然順序或自定義順序遍歷鍵(key)。

1. AWT和Swing的區別,如何設置look and feel?如何往JFrame添加組件。

答:AWT 是抽象窗口組件工具包,是 java 最先的用於編寫圖形節目應用程序的開發包。

Swing 是爲了解決 AWT 存在的問題而新開發的包,它以 AWT 爲基礎的。

 

設置look and feel:

 

try{

    UIManager.setLookAndFeel(外觀名稱);

   }catch(Exception e){}

 

方法setLookAndFeel的一些參數:

 

UIManager.getCrossPlatformLookAndFeelClassName()

 

--Java的界面外觀, 全部平臺均一致.

 

UIManager.getSystemLookAndFeelClassName()

 

--指定爲當前平臺的界面外觀.在32位Windows平臺, 爲Windows界面外觀; 在Mac OS平臺, 爲Mac OS界面外觀; 在Sun平臺, 爲CDE/Motif界面外觀.

 

"javax.swing.plaf.metal.MetalLookAndFeel"

 

--指定爲Java的界面外觀, 也就是方法UIManager.getCrossPlatformLookAndFeelClassName()的返回值.

 

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"

 

--指定爲Windows的界面外觀, 僅在Windows平臺起做用.

 

"com.sun.java.swing.plaf.motif.MotifLookAndFeel"

 

--指定爲CDE/Motif的界面外觀, 能夠在全部平臺起做用.

 

"javax.swing.plaf.mac.MacLookAndFeel"

 

--指定爲Mac OS的界面外觀, 僅在Mac OS平臺起做用。

 

 Swing 程序用JFrame 對象實現了它們的窗口。JFrame 類是AWT Frame 類的一個子類。它還加入了一些Swing 所獨有的特性。與 Frame 的使用十分類似。惟一的區別在於,不能將組件加入到JFrame中。能夠或者將組件加入到JFrame 的content pane(內容面板) 中,或者提供一個新的content pane(內容面板)。

 

對JFrame添加組件有兩種方式:

  1)用 getContentPane ()方法得到JFrame的內容面板,再對其加入組件:frame. getContentPane ().add(childComponent)

  2)創建一個Jpanel或JDesktopPane之類的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置爲JFrame的內容面板:

    JPanel contentPane = new JPanel();

    ……//把其它組件添加到Jpanel中;

    frame.setContentPane(contentPane);

    //把contentPane對象設置成爲frame的內容面板

 

2. 說出經常使用的幾個佈局管理器和其特色。

答:經常使用的幾個佈局管理器和其特色:

 

包---類---特色

java.awt ---CardLayout--- 將組件象卡片同樣放置在容器中,在某一時刻只有一個組件可見。

java.awt--- FlowLayout--- 將組件按從左到右然後從上到下的順序依次排列,一行不能放完則折到下一行繼續放置。

java.awt ---GridLayout ---形似一個無框線的表格,每一個單元格中放一個組件。

java.awt ---BorderLayout ---將組件按東、南、西、北、中五個區域放置,每一個方向最多隻能放置一個組件。

java.awt--- GridBagLayout--- 很是靈活,可指定組件放置的具體位置及佔用單元格數目。

 

3. Frame和Dialog默認的佈局管理器是什麼,Panel的又是什麼?

答:Frame默認的佈局管理器是:BorderLayout

 

Dialog默認的佈局管理器是:BorderLayout

 

Panel默認的佈局管理器是:FlowLayout

 

 

2013-07-23

IO寫入和複製文件

 

//package com.app; 

 

import java.io.*; 

 

public class Test_IODemo { 

    public static void main(String[] args) { 

        ForFileWriter("用FileWriter寫入文件", "以FileWriter寫入.txt"); 

        ForBufferedWriter("用BufferedWriter寫入文件", "以BufferedWriter寫入.txt"); 

        FileCopy1("我.txt", "字符流複製.txt"); 

        FileCopy2("我.txt", "字節流複製.txt"); 

        FileCopy3("我.txt", "處理流複製.txt"); 

    } 

    //用FileWriter寫入文件 

    public  static void ForFileWriter(String string,String fileName) { 

        File file = new File(fileName); 

        try { 

            FileWriter fWriter = new FileWriter(file); 

            fWriter.write(string); 

            fWriter.close(); 

        } catch (Exception e) { 

            // TODO: handle exception 

            e.printStackTrace(); 

        } 

    } 

    //用BufferedWriter寫入文件 

    public static void ForBufferedWriter(String string,String desFile) { 

        BufferedWriter bWriter = null; 

        try { 

            bWriter = new BufferedWriter(new FileWriter(new File(desFile))); 

            bWriter.write(string.toString()); 

            bWriter.close(); 

        } catch (Exception e) { 

            e.printStackTrace(); 

        } 

    } 

    //字符流複製 

    public static void FileCopy1(String readfile,String writeFile) { 

        try { 

            FileReader input = new FileReader(readfile); 

            FileWriter output = new FileWriter(writeFile); 

            int read = input.read();         

            while ( read != -1 ) { 

                output.write(read);  

                read = input.read(); 

            }            

            input.close(); 

            output.close(); 

        } catch (IOException e) { 

            System.out.println(e); 

        } 

    } 

    //字節流複製 

    public static void FileCopy2(String readfile,String writeFile) { 

        try { 

            FileInputStream input = new FileInputStream(readfile); 

            FileOutputStream output = new FileOutputStream(writeFile); 

            int read = input.read();         

            while ( read != -1 ) { 

                output.write(read);  

                read = input.read(); 

            }            

            input.close(); 

            output.close(); 

        } catch (IOException e) { 

            System.out.println(e); 

        } 

    } 

    //處理流複製 

    public static void FileCopy3(String readfile,String writeFile) { 

        BufferedReader bReader = null; 

        BufferedWriter bWriter = null; 

        String line = null;  

        try { 

            bReader = new BufferedReader(new FileReader(new File(readfile))); 

            bWriter = new BufferedWriter(new FileWriter(new File(writeFile))); 

            while ((line = bReader.readLine())!=null) { 

                bWriter.write(line); 

                bWriter.newLine(); 

            } 

            bWriter.close(); 

            bReader.close(); 

        } catch (Exception e) { 

            // TODO: handle exception 

            e.printStackTrace(); 

        } 

    } 

2013-07-24

1. 使用Swing和IO設計一個記事本程序。

答:java文件見Test_Notepad.java

 

http://blog.csdn.net/jueblog/article/details/9457517

 

可執行文件見notepad.exe

 

2. 什麼是對象序列化和反序列化?說一下具體實現的核心代碼;Serializable接口有什麼做用。

答:把Java對象轉換爲字節序列的過程稱爲對象的序列化。

  把字節序列恢復爲Java對象的過程稱爲對象的反序列化。

  對象的序列化主要有兩種用途:

  1) 把對象的字節序列永久地保存到硬盤上,一般存放在一個文件中;

  2) 在網絡上傳送對象的字節序列。

 

對象序列化:

 

 

public static void ser(Person p, String fileName){ 

    ObjectOutputStream oos = null; 

    try { 

        oos = new ObjectOutputStream(new FileOutputStream(new File(fileName))); 

        oos.writeObject(p); 

    } catch (Exception e) { 

        // TODO Auto-generated catch block 

        e.printStackTrace(); 

    } 

對象的反序列化:

 

 

public static void unSer(String fileName){ 

    try { 

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(fileName))); 

        Person p = (Person)ois.readObject(); 

        System.out.println(p.getAge() + p.getName());  

        } catch (Exception e) { 

        // TODO Auto-generated catch block 

        e.printStackTrace(); 

    } 

3. 給定一個目錄,輸出其中的子目錄或者文件名。

答:Java文件見 Text_IO_File.java

 

 

 

import java.io.*; 

 

//給定一個目錄,輸出其中的子目錄或者文件名。 

//並按條件篩選輸出含有指定字符串的文件 

 

public class Text_IO_File { 

    public static void main(String[] args) { 

        File directory = new File(""); 

        String pathString = null; 

        try{ 

            pathString = directory.getCanonicalPath();//獲取標準的路徑 

        }catch(Exception e){} 

        System.out.println("當前目錄下的全部文件:"); 

        FileTest_List(pathString); 

        System.out.println("當前目錄下的全部Java文件:"); 

        FileTest_List_Choice(pathString, ".java"); 

    } 

    //返回路徑名下目錄中的文件和目錄。 

    public static void FileTest_List(String fileName) { 

        try { 

            File f=new File(fileName); 

            String[] arrStrings = f.list(); 

            for(String string : arrStrings){ 

                System.out.println(string); 

            } 

        } catch (Exception e) { 

            // TODO: handle exception 

            e.printStackTrace(); 

        } 

    } 

    //返回路徑名下目錄中含choice的文件名 

    public static void FileTest_List_Choice(String fileName,final String choice) { 

        try { 

            File f=new File(fileName); 

            String[] arrStrings = f.list(new FilenameFilter() { 

                @Override 

                public boolean accept(File dir, String name) { 

                    // TODO Auto-generated method stub 

                    return name.indexOf(choice) != -1; 

                } 

            }); 

            for(String string : arrStrings){ 

                System.out.println(string); 

            } 

        } catch (Exception e) { 

            // TODO: handle exception 

            e.printStackTrace(); 

        } 

    } 

4. 編寫一個程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合併到c.txt文件中,a.txt文件中的單詞用回車符分隔,b.txt文件中用回車或空格進行分隔。

答: Java文件見 Test_Merge.java

 

 

//package com.app; 

 

import java.io.*; 

 

public class Test_Merge { 

    public static void main(String[] args) { 

        WordMarge("Word1.txt", "Word2.txt", "WordMarge.txt"); 

    } 

    //將readfile1文件中的單詞與readfile2文件中的單詞交替合併到writeFile文件中 

    public static void WordMarge(String readfile1,String readfile2,String writeFile) {   

        BufferedReader bReader1 = null;   

        BufferedReader bReader2 = null;   

        BufferedWriter bWriter = null;   

        String line1 = null;    

        String line2 = null;    

        try {   

            bReader1 = new BufferedReader(new FileReader(new File(readfile1)));  

            bReader2 = new BufferedReader(new FileReader(new File(readfile2)));  

            bWriter = new BufferedWriter(new FileWriter(new File(writeFile)));   

            while ((line1 = bReader1.readLine())!=null | (line2 = bReader2.readLine())!=null) { 

                if(line1 != null) {   

                    bWriter.write(line1);   

                    bWriter.newLine();   

                }   

                if(line2 !=null) {   

                    bWriter.write(line2);   

                    bWriter.newLine();   

                } 

            } 

            bWriter.close();   

            bReader1.close();   

            bReader2.close();   

        } catch (Exception e) {   

            // TODO: handle exception   

            e.printStackTrace();   

        }   

    }   

2013-07-25

線程的同步

 

//1package com.app; 

/**

 * Java線程:線程的同步

 */ 

 

import java.util.concurrent.*; 

 

public class Test0725_Thread_Syn4 { 

    public static void main(String[] args) { 

        final ExecutorService exec = Executors.newFixedThreadPool(1); 

        Callable<String> call = new Callable<String>() { 

            public String call() throws Exception { 

                // 開始執行耗時操做 

                int cash = 300; 

                String name = "張三"; 

                System.out.println(name + "如今有" + cash + "元存款"); 

                User u = new User(name, cash); 

                String[] arr = { "線程A", "線程B", "線程C", "線程D", "線程E", "線程F", 

                        "線程G", "線程H", "線程I", "線程J" }; 

                for (int i = 0; i < 10; i++) { 

                    MyThread th = new MyThread(arr[i], u, 

                            (int) (Math.random() * 1000 - 500)); 

                    th.start(); 

                } 

                Thread.sleep(1000 * 5); 

                return "線程執行完成."; 

            } 

        }; 

        try { 

            Future<String> future = exec.submit(call); 

            String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); // 任務處理超時時間設爲1 秒 

            System.out.println("任務成功返回:" + obj); 

        } catch (TimeoutException ex) { 

            System.out.println("\n處理超時啦...."); 

            System.exit(0); 

        } catch (Exception e) { 

            System.out.println("處理失敗."); 

            e.printStackTrace(); 

        }    

        try {     

            Future<String> future = exec.submit(call);     

            String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); //任務處理超時時間設爲 1 秒     

            System.out.println("任務成功返回:" + obj);     

        } catch (TimeoutException ex) {     

            System.out.println("處理超時啦....");     

            ex.printStackTrace();     

        } catch (Exception e) {     

            System.out.println("處理失敗.");     

            e.printStackTrace();     

        } 

         exec.shutdown();     // 關閉線程池  

         /*     int cash2 = 100;

        String name2 = "李四";

        System.out.println(name2 + "如今有" + cash2 + "元存款");

        User u2 = new User(name, cash);

        String[] arr2 = {"線程A","線程B","線程C","線程D","線程E","線程F"};

        for (int i = 0; i < 6; i++) {

            MyThread th2 = new MyThread(name2+arr2[i], u2, (int)(Math.random()*1000-500));

            th2.start();

        }*/ 

    } 

class MyThread extends Thread { 

    private User u; 

    private int x = 0; 

    MyThread(String name, User u, int x) { 

        super(name); 

        this.u = u; 

        this.x = x; 

    } 

    public void run() { 

        u.oper(x); 

    } 

class User { 

    private String code; 

    private int cash; 

    private int time = 0; 

    User(String code, int cash) { 

        this.code = code; 

        this.cash = cash; 

    } 

    public String getCode() { 

        return code; 

    } 

    public void setCode(String code) { 

        this.code = code; 

    } 

    public int getCash() { 

        return cash; 

    } 

    public void setCode(int cash) { 

        this.cash = cash; 

    } 

    /**

     * 業務方法

     *            添加x萬元

     */ 

    public synchronized void oper(int x) { 

        if ((this.cash +x >= 1000) && x > 0 ) { 

            System.out.println(Thread.currentThread().getName() + "暫停!"+"當前帳戶餘額爲:" + this.cash + ",您還想存" +x + ",太多了!"); 

            try { 

                Thread.yield(); 

        //      Thread.sleep(100); 

                this.wait(); 

            } catch (Exception e) { 

                // TODO Auto-generated catch block 

                e.printStackTrace(); 

            } 

             

        }else if (this.cash + x <0) { 

            System.out.println(Thread.currentThread().getName() + "暫停!"+"當前帳戶餘額爲:" + this.cash + ",小於所取額 " +x +",餘額不足!"); 

            try { 

                Thread.yield(); 

        //      Thread.sleep(100); 

                this.wait(); 

            } catch (Exception e) { 

                // TODO Auto-generated catch block 

                e.printStackTrace(); 

            } 

        } 

         if(this.cash < 1000 && this.cash > 0 && (this.cash + x >= 0) && (this.cash + x <= 1000)){ 

                this.cash += x; 

                System.out.println(Thread.currentThread().getName() + "運行結束,增長「 " 

                        + x + " 」,當前用戶帳戶餘額爲:" + this.cash); 

                time++; 

                this.notifyAll(); 

        } 

        this.notifyAll(); 

    } 

    @Override 

    public String toString() { 

        return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}'; 

    } 

2013-07-26

1. 同步有幾種實現方法。

答:Java的同步能夠用synchronized關鍵字來實現。

主要有兩種方法:

sychronized同步代碼,須要綁定一個對象,如synchronized(obj){}

sychronized同步一個方法,是對方法進行線程同步。如public void synchronized methodA(){}

 

2. 線程的基本狀態(生命週期)。

答:java中,每一個線程都需經歷建立、就緒、運行、阻塞和終止五種狀態,線程從建立到終止的狀態變化稱爲生命週期。

 

用new運算符和Thread類或其子類創建一個線程對象後,該線程就處於建立狀態。

 

建立--->就緒:經過調用start()方法

 

就緒--->運行:處於就緒狀態的線程一旦獲得CPU,就進入運行狀態並自動調用本身的run()方法

 

運行--->阻塞:處於運行狀態的線程,執行sleep()方法,或等待I/O設備資源,讓出CPU並暫時停止本身運行,進入阻塞狀態

 

阻塞--->就緒:睡眠時間已到,或等待的I/O設備空閒下來,線程便進入就緒狀態,從新到就緒隊列中等待CPU。當再次得到CPU時,便從原來停止位置開始繼續運行。

 

運行--->終止:(1)(正常狀況下)線程任務完成

                 (2)(非正常情況)線程被強制性的停止,如經過執行stop()或destroy()方法來終止一個線程

 

3. 簡述synchronized和java.util.concurrent.locks.Lock的異同。

答:主要相同點:

 

  Lock能完成synchronized所實現的全部功能。

 

主要不一樣點:

 

1)Lock有比synchronized更精確的線程語義和更好的性能。

 

2)synchronized會自動釋放鎖,而Lock必定要求程序員手工釋放,而且必須在finally從句中釋放。

 

4. 設計4個線程,其中兩個線程每次對j增長1,另外兩個線程對j每次減小1。寫出程序。

答:Java代碼見ThreadTest.java

 

 

//package com.app; 

 

 

public class ThreadTest { 

    static int t = 10; 

    static final int TIME = 5; 

    public static void main(String[] args) { 

        ThreadTest test = new ThreadTest(); 

         

        AddTest thread1 = test.new AddTest(); 

        MinusTest thread2 = test.new MinusTest(); 

        for (int i = 0; i < 2; i++) { 

            new Thread(thread1).start(); 

            new Thread(thread2).start(); 

        } 

    } 

     

    private synchronized void Add() { 

        t++; 

        System.out.println(Thread.currentThread().getName() + "--加法--" +t); 

    } 

    class AddTest implements Runnable{ 

        @Override 

        public void run() { 

            // TODO Auto-generated method stub 

            for (int i = 0; i < TIME; i++) { 

                Add(); 

            } 

        } 

    } 

     

    private synchronized void Minus() { 

        t--; 

        System.out.println(Thread.currentThread().getName() + "--減法--" +t); 

    } 

    class MinusTest implements Runnable{ 

        @Override 

        public void run() { 

            // TODO Auto-generated method stub 

            for (int i = 0; i < TIME; i++) { 

                Minus(); 

            } 

        } 

    } 

1. Socket是什麼?如何開發基於C/S結構下的Socket程序,請說出步驟。

答:SOCKET用於在兩個基於TCP/IP協議的應用程序之間相互通訊。最先出如今UNIX系統中,是UNIX系統主要的信息傳遞方式。在WINDOWS系統中,SOCKET稱爲WINSOCK。

兩個基本概念:客戶方和服務方。當兩個應用之間須要採用SOCKET通訊時,首先須要在兩個應用之間(可能位於同一臺機器,也可能位於不一樣的機器)創建SOCKET鏈接,發起呼叫鏈接請求的一方爲客戶方,接受呼叫鏈接請求的一方成爲服務方。客戶方和服務方是相對的,同一個應用能夠是客戶方,也能夠是服務方。

在客戶方呼叫鏈接請求以前,它必須知道服務方在哪裏。因此須要知道服務方所在機器的IP地址或機器名稱,若是客戶方和服務方事前有一個約定就行了,這個約定就是PORT(端口號)。也就是說,客戶方能夠經過服務方所在機器的IP地址或機器名稱和端口號惟一的肯定方式來呼叫服務方。在客戶方呼叫以前,服務方必須處於偵聽狀態,偵聽是否有客戶要求創建鏈接。一旦接到鏈接請求,服務方能夠根據狀況創建或拒絕鏈接。鏈接方式有兩種,同步方式(Blocking)和(noBlocking).

 

開發基於C/S結構下的Socket程序的步驟:

 

1)Server端(建立ServerSocket的實例);Client端(建立Socket);

 

2)打開鏈接到socket的輸入/輸出流;

 

3)按照必定的協議對socket進行讀/寫操做;

 

4)關閉socket。

 

2. 如何遍歷集合類下的ArrayList、Vector、HashSet。如何遍歷HashMap。寫出核心代碼。

答:遍歷ArrayList:

 

 

//輸出集合collection中的全部元素 

public static void Shuchu(Collection collection) { 

    Iterator iterator = collection.iterator(); 

    while (iterator.hasNext()) { 

        System.out.println(iterator.next()); 

    } 

遍歷ArrayList:

 

 

Vector v = new Vector(); 

for (int index = 0; index < v.size(); index++) { 

    String str = (String) v.elementAt(index); 

遍歷 HashSet:

 

 

Set set = new HashSet(); 

for (int i = 0; i < 100; i++) { 

    set.add("123"); 

for (Iterator it = set.iterator(); it.hasNext();) { 

    System.out.println(it.next()); 

遍歷HashMap:

 

 

Map<Integer, String> map = new HashMap<Integer, String>(); 

  for(int i=0;i<100;i++) 

  { 

   map.put(i, "123"); 

  } 

for(Entry<Integer, String> entry:map.entrySet()) 

  { 

   System.out.println(entry.getKey()+"="+entry.getValue()); 

  } 

2013-07-30

SQL的增刪改查

[sql] view plaincopy

#增 

INSERT INTO t_userr(username,password,sex) values('jj','11','n'); 

#刪 

DELETE FROM t_userr WHERE username = 'jj'; 

#改 

UPDATE t_userr SET ruxueYear='2000',note="水電費" WHERE username='jj'; 

#查 

SELECT id,username FROM t_userr WHERE sex='男'; 

SELECT username FROM t_userr; 

SELECT realName FROM t_userr WHERE sex='男' AND school='中國計量學院'; 

SELECT * FROM t_userr;#所有信息 

SELECT * FROM t_userr WHERE sex='女'; 

用Java向數據庫中增長多條記錄

 

package com.app; 

 

public class GrilFriend { 

    public static void main(String[] args) { 

        BaseDAO bDao = new BaseDAO(); 

        String[] secondclassify = {"面部護理","眼脣護理","精油SPA","彩妝","香氛","化妝工具"}; 

        String[][] thirdclassify = new String[secondclassify.length][2]; 

        String[][][] project = new String[secondclassify.length][thirdclassify.length][10]; 

        int ss = 1; 

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

            for (int j = 0; j < thirdclassify[i].length; j++) { 

                thirdclassify[i][j]=(j==0)?"分類":"功效"; 

                for (int j2 = 0; j2 < 10; j2++) { 

                    project[i][j][j2] = secondclassify[i] + thirdclassify[i][j] + j2; 

                    Object[] s3 = {ss++,"化妝品",secondclassify[i],thirdclassify[i][j],project[i][j][j2]}; 

                    bDao.Update("insert into girlfriend(id,firstclassify,secondclassify,thirdclassify,project) values(?,?,?,?,?)",s3); 

                } 

            } 

        } 

    }  

分類別查詢最小的生日

[sql] view plaincopy

SELECT * FROM t_userr WHERE birthdate in(SELECT MAX(birthdate) FROM t_userr GROUP BY sex); 

 

2013-07-31

in和exists區別

in

 

in能夠分爲三類:

  一、形如select * from t1 where f1 in ( &apos;a &apos;, &apos;b &apos;),應該和如下兩種比較效率

  select * from t1 where f1= &apos;a &apos; or f1= &apos;b &apos;

  或者 select * from t1 where f1 = &apos;a &apos; union all select * from t1 f1= &apos;b &apos;

  你可能指的不是這一類,這裏不作討論。

  二、形如select * from t1 where f1 in (select f1 from t2 where t2.fx= &apos;x &apos;),

  其中子查詢的where裏的條件不受外層查詢的影響,這類查詢通常狀況下,自動優化會轉成exist語句,也就是效率和exist同樣。

  三、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),

  其中子查詢的where裏的條件受外層查詢的影響,這類查詢的效率要看相關條件涉及的字段的索引狀況和數據量多少,通常認爲效率不如exists.

  除了第一類in語句都是能夠轉化成exists 語句的,通常編程習慣應該是用exists而不用in.

  A,B兩個表,

  (1)當只顯示一個表的數據如A,關係條件只一個如ID時,使用IN更快:

  select * from A where id in (select id from B)

  (2)當只顯示一個表的數據如A,關係條件不僅一個如ID,col1時,使用IN就不方便了,能夠使用EXISTS:

  select * from A

  where exists (select 1 from B where id = A.id and col1 = A.col1)

  (3)當只顯示兩個表的數據時,使用IN,EXISTS都不合適,要使用鏈接:

  select * from A left join B on id = A.id

  因此使用何種方式,要根據要求來定。

exists

 

exists是用來判斷是否存在的,當exists(查詢)中的查詢存在結果時則返回真,不然返回假。not exists則相反。

exists作爲where 條件時,是先對where前的主查詢詢進行查詢,而後用主查詢的結果一個一個的代入exists的查詢進行判斷,若是爲真則輸出當前這一條主查詢的結果,不然不輸出。

in和exists區別

 

in 是把外表和內表做hash 鏈接,而exists是對外表做loop循環,每次loop循環再對內表進行查詢。

一直以來認爲exists比in效率高的說法是不許確的。

若是查詢的兩個表大小至關,那麼用in和exists差異不大。

若是兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。

NOT EXISTS,exists的用法跟in不同,通常都須要和子表進行關聯,並且關聯時,須要用索引,這樣就能夠加快速度。

 

exists 至關於存在量詞:表示集合存在,也就是集合不爲空只做用一個集合。

例如 exist P 表示P不空時爲真; not exist P表示p爲空時爲真。

in表示一個標量和一元關係的關係。

例如:s in P表示當s與P中的某個值相等時 爲真; s not in P 表示s與P中的每個值都不相等時爲真:

 

not in 和not exists

若是查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;

而not extsts 的子查詢依然能用到表上的索引。

因此不管那個表大,用not exists都比not in要快。

 

2013-08-01

MySQL性能優化

 

2013-08-02

以Java代碼實現自增加並向數據庫中一次性增添多條記錄

 

package com.dao; 

import java.util.*; 

public class Test_Oracle { 

    static int id = new Oracle_DAO().MaxID("SELECT MAX(id)  FROM Oracle_Test")+1; 

//  static int id = 1; 

    /** 產生一個隨機的字符串,適用於JDK 1.7 */ 

//  public static String random(int length) { 

//      StringBuilder builder = new StringBuilder(length); 

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

//          builder.append((char) (ThreadLocalRandom.current().nextInt(33, 128))); 

//      } 

//      return builder.toString(); 

//  } 

    /** 產生一個隨機的字符串*/ 

    public static String RandomString(int length) { 

        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 

        Random random = new Random(); 

        StringBuffer buf = new StringBuffer(); 

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

            int num = random.nextInt(62); 

            buf.append(str.charAt(num)); 

        } 

        return buf.toString(); 

    } 

    /** 獲得 id 的下標 */ 

    public static int IDNumber() { 

        return id++; 

    } 

    public static void main(String[] args) { 

        Oracle_DAO bDao = new Oracle_DAO(); 

        String sql = "insert into Oracle_Test(id,username,password) select ?,?,? from dual"; 

        String sqlString = " union select ?,?,? from dual "; 

        ArrayList<Object> aList= new ArrayList<Object>(); 

        aList.add(IDNumber()); 

        aList.add(RandomString(10)); 

        aList.add(RandomString(6));      

        for (int i = 0; i < 19; i++) { 

            sql = sql +sqlString; 

            aList.add(IDNumber()); 

            aList.add(RandomString(10)); 

            aList.add(RandomString(6)); 

        } 

        Object[] objects=new Object[aList.size()];  

        for(int i=0;i<aList.size();i++){  

            objects[i]=aList.get(i);  

        }  

        bDao.Update(sql, objects); 

        System.out.println(bDao.MaxID("SELECT MAX(id)  FROM Oracle_Test")); 

    } 

 

2013-08-03

1. Java鏈接Oracle有哪幾種方式,說出區別,並寫出各自的url。

答:第一種方式:經過數據庫自己的JDBC Driver鏈接到數據庫

 

  Classs.forName("oracle.jdbc.driver.OracleDriver");

 

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.33:1521

 

:huihoo","scott","tiger");

 

  第二種方式:經過JDBC-ODBC橋鏈接到數據庫

 

  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

 

  Connection conn = DriverManager.getConnection("jdbc:odbc:192.168.1.33","scott","tiger");

 

2. 爲tom用戶授予表emp的select、insert權限,寫出對應的SQL語句。

答:grant select,update,insert ,dellete on scott.emp to tom;

 

3. 說出SQL注入漏洞的代碼,並說出解決辦法。

http://blog.csdn.net/jueblog/article/details/9750737

2013-08-04

1. 找出浙江出生的年紀最小的前5名學生。

答:Oracle代碼:

 

[sql] view plaincopy

SELECT * FROM (SELECT * FROM T_USER WHERE HOME LIKE '%浙江%' ORDER BY BIRTHDATE desc) WHERE ROWNUM<6; 

2. Oracle分頁程序的SQL。

答:

 

(1)採用僞列 rownum範例代碼:

 

[sql] view plaincopy

SELECT * FROM (SELECT ROWNUM rn,id,realname FROM (SELECT id,realname FROM T_USER)WHERE ROWNUM<=20) t2 WHERE T2.rn >=10; 

(2)用分析函數row_number()over(ORDER BY 字段):

 

按ID排序後,從第10條記錄開始,提取10條記錄。

 

[sql] view plaincopy

SELECT * FROM(SELECT id,realname,row_number()over(ORDER BY id asc) rn FROM T_USER)WHERE rn BETWEEN 10 AND 20; 

(3)minus的寫法:

 

按ID排序後,從第10條記錄開始,提取10條記錄。

 

[sql] view plaincopy

(SELECT * FROM (SELECT * FROM T_USER ORDER BY id asc) WHERE ROWNUM<20)  MINUS( SELECT * FROM (SELECT * FROM T_USER ORDER BY id asc) WHERE ROWNUM<10); 

3. 存儲過程和函數的區別,以及在控制檯和Java語言中的調用方式。

答:存儲過程和函數的區別:

 

存儲過程

 

函數

 

用於在數據庫中完成特定的操做或者任務(如插入、刪除等)

 

用於特定的數據(如選擇)

 

程序頭部聲明用procedure

 

程序頭部聲明用function

 

程序頭部聲明時不須要描述返回類型

 

函數頭部聲明時須要描述返回類型,並且PL/SQL塊中至少 要包括一個有效的return語句

 

能夠使用in/out/in out 三種模式的參數

 

能夠使用in/out/in out 三種模式的參數

 

能夠做爲一個獨立的PL/SQL語句來執行

 

不能獨立執行,必須做爲表達式的一部分調用

 

能夠經過out/in out 返回零個或多個值

 

經過return語句返回一個值,且該值要與聲明的部分一致,也能夠是經過out類型的參數帶出的變量

 

SQL語句(DDL或者select)中不能夠調用存儲過程

 

SQL語句(DDL或者select)中能夠調用函數

 

在控制檯中調用存儲過程:用 exec 過程名() 執行存儲過程。

 

在控制檯中調用函數:直接寫 SQL 語句,調用此函數。

 

Java中調用存儲過程模板:

 

CallableStatement cs = conn.prepareCall(「{call 過程(?, ?, ?)} 「);

 

cs.setXXX(1, 值1);

 

cs.setXXX(2, 值2);

 

cs.registerOutParameter(3, Types.NUMERIC);

 

cs.execute();

 

System.out.println(cs.getInt(3));

 

Java中調用函數:經過SQL語句調用。


 

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

      如何用腳本判斷用戶輸入的的字符串是下面的時間格式2004-11-21必需要保證用戶的輸入是此格式,而且是時間,好比說月份不大於12等等,另外我須要用戶輸入兩個,而且後一個要比前一個晚,只容許用JAVASCRIPT,請詳細幫助做答,,

//這裏可用正則表達式判斷提早判斷一下格式,而後按下提取各時間字段內容

<scripttype="text/javascript">

   window.onload=function()

   {

        //這麼寫是爲了實現js代碼與html代碼的分離,當我修改js時,不能影響html代碼。

        document.getElementById("frm1").onsubmit=

               function(){

                      vard1= this.d1.value;

                      vard2= this.d2.value;

                      if(!verifyDate(d1)){alert("第一個日期格式不對");return false;}

                      if(!verifyDate(d2)){alert("第二個日期格式不對");return false;}

                      if(!compareDate(d1,d2)){alert("第二個日期比第一日期小");returnfalse;}                

               };

        }

      

        functioncompareDate(d1,d2)

        {

               vararrayD1= d1.split("-");

               vardate1 =new Date(arrayD1[0],arrayD1[1],arrayD1[2]);

               vararrayD2= d2.split("-");

               vardate2 =new Date(arrayD2[0],arrayD2[1],arrayD2[2]);

               if(date1>date2) returnfalse;            

               returntrue;

        }

      

        functionverifyDate(d)

        {

               vardatePattern= /^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\d|3[0-1])$/;

               returndatePattern.test(d);

        }

</script>

<formid="frm1" action="xxx.html">

<inputtype="text" name="d1" />

<inputtype="text" name="d2" />

<inputtype="submit"/>

</form>

2. table顯示n條記錄,每3行換一次顏色,即123用紅色字體,456用綠色字體,789用紅顏色字體。

<body>

<tableid="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>

<scripttype="text/javascript">

   window.onload=function()

        {

               vartbl =document.getElementById("tbl");

               rows=tbl.getElementsByTagName("tr");

               for(i=0;i<rows.length;i++)

               {

                      varj= parseInt(i/3);

                      if(j%2==0)rows[i].style.backgroundColor="#f00";

                      else rows[i].style.backgroundColor="#0f0";

               }

        }

</script>

3HTML的 form提交以前如何驗證數值文本框的內容所有爲數字?不然的話提示用戶並終止提交?

<formonsubmit=return chkForm(this)>

<inputtype="text" name="d1"/>

<inputtype="submit"/>

</form>

<script type=text/javascript」 />  

functionchkForm(this)

       {

              varvalue = thist.d1.value;

              varlen =value.length;

              for(vari=0;i<len;i++)

              {

                     if(value.charAt(i)>"9"||value.charAt(i)<"0")

                     {

                            alert("含有非數字字符");

                            returnfalse;

                     }

              }

              returntrue;

       }

</script>

4、請寫出用於校驗HTML文本框中輸入的內容所有爲數字的javascript代碼

<inputtype="text" id="d1" onblur="chkNumber(this)"/>

<script type=text/javascript」 />  

functionchkNumber(eleText)

       {

              varvalue =eleText.value;

              varlen =value.length;

              for(vari=0;i<len;i++)

              {

                     if(value.charAt(i)>"9"||value.charAt(i)<"0")

                     {

                            alert("含有非數字字符");

                            eleText.focus();

                            break;

                     }

              }

       }

</script>

除了寫完代碼,還應該在網頁上寫出實驗步驟和在代碼中加入實現思路,讓面試官一看就明白你的意圖和檢查你的結果。

5、說說你用過那些ajax技術和框架,說說它們的區別

. Java web部分

1Tomcat的優化經驗

:去掉對web.xml的監視,把jsp提早編輯成Servlet

有富餘物理內存的狀況,加大tomcat使用的jvm的內存

2HTTP請求的GETPOST方式的區別

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

3、解釋一下什麼是servlet;

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

4、說一說Servlet的生命週期?

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

Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGetdoPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。

web容器加載servlet,生命週期開始。經過調用servletinit()方法進行servlet的初始化。經過調用service()方法實現,根據請求的不一樣調用不一樣的do***()方法。結束服務,web容器調用servletdestroy()方法。

5Servlet的基本架構

public classServletName extends HttpServlet {

public voiddoPost(HttpServletRequest request,HttpServletResponse response) throws

ServletException,IOException {

}

public voiddoGet(HttpServletRequest request,HttpServletResponse response) throws

ServletException,IOException {

}

}

6SERVLET APIforward()redirect()的區別?

:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;後者則是徹底的跳轉,瀏覽器將會獲得跳轉的地址,並從新發送請求連接。這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。因此,前者更加高效,在前者能夠知足須要時,儘可能使用forward()方法,而且,這樣也有助於隱藏實際的連接。在有些狀況下,好比,須要跳轉到一個其它服務器上的資源,則必須使用

sendRedirect()方法。

7、什麼狀況下調用doGet()doPost()

Jsp頁面中的FORM標籤裏的method屬性爲get時調用doGet(),爲post時調用doPost()

8Request對象的主要方法:

setAttribute(Stringname,Object):設置名字爲namerequest的參數值

getAttribute(Stringname):返回由name指定的屬性值

getAttributeNames():返回request對象全部屬性的名字集合,結果是一個枚舉的實例

getCookies():返回客戶端的全部Cookie對象,結果是一個Cookie數組

getCharacterEncoding():返回請求中的字符編碼方式

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

getHeader(Stringname):得到HTTP協議定義的文件頭信息

getHeaders(Stringname):返回指定名字的request Header的全部值,結果是一個枚舉的實例

getHeaderNames():返回因此request Header的名字,結果是一個枚舉的實例

getInputStream():返回請求的輸入流,用於得到請求中的數據

getMethod():得到客戶端向服務器端傳送數據的方法

getParameter(Stringname):得到客戶端傳送給服務器端的有name指定的參數值

getParameterNames():得到客戶端傳送給服務器端的全部參數的名字,結果是一個枚舉的實例

getParametervalues(Stringname):得到有name指定的參數的全部值

getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱

getQueryString():得到查詢字符串

getRequestURI():獲取發出請求字符串的客戶端地址

getRemoteAddr():獲取客戶端的IP地址

getRemoteHost():獲取客戶端的名字

getSession([Booleancreate]):返回和請求相關Session

getServerName():獲取服務器的名字

getServletPath():獲取客戶端所請求的腳本文件的路徑

getServerPort():獲取服務器的端口號

removeAttribute(Stringname):刪除請求中的一個屬性

9forwardredirect的區別

forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。

   redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求,因此session,request參數均可以獲取。

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

11. jsp有哪些內置對象?做用分別是什麼?分別有什麼方法?

:JSP共有如下9個內置的對象:

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

response 網頁傳回用戶端的迴應

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

session 與請求有關的會話期

applicationservlet 正在執行的內容

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實例

12. jsp有哪些動做?做用分別是什麼?

(這個問題彷佛不重要,不明白爲什麼有此題)

:JSP共有如下6種基本動做

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

jsp:useBean:尋找或者實例化一個JavaBean

jsp:setProperty:設置JavaBean的屬性。

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

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

jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECTEMBED標記

13JSP的經常使用指令

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

14. JSP中動態INCLUDE與靜態INCLUDE的區別?

答:動態INCLUDEjsp:include動做實現

<jsp:includepage=included.jsp flush=true />它老是會檢查所含文件中的變化,適合用於包含動態頁面,而且能夠帶參數靜態INCLUDEinclude僞碼實現,定不會檢查所含文件的變化,適用於包含靜態頁面 <%@includefile=included.htm %>

15、兩種跳轉方式分別是什麼?有什麼區別?

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

答:有兩種,分別爲:

<jsp:includepage=included.jsp flush=true>

<jsp:forwardpage= nextpage.jsp/>

前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面仍是原來的頁面。執行完後還會回來,至關於函數調用。而且能夠帶參數.後者徹底轉向新頁面,不會再回來。至關於go to 語句。

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

requestsessionapplicationcookie

17JSPServlet有哪些相同點和不一樣點,他們之間的聯繫是什麼?

JSPServlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"servlet"ServletJSP最主要的不一樣點在於,Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML裏分離開來。而JSP的狀況是JavaHTML能夠組合成一個擴展名爲.jsp的文件。JSP側重於視圖,Servlet主要用於控制邏輯。

18MVC的各個部分都有那些技術來實現?如何實現?

:MVCModelViewController的簡寫。Model表明的是應用的業務邏輯(經過JavaBeanEJB組件實現),View是應用的表示面(由JSP頁面產生),Controller是提供應用的處理過程控制(通常是一個Servlet),經過這種設計模型把應用邏輯,處理過程和顯示邏輯分紅不一樣的組件實現。這些組件能夠進行交互和重用。

19、咱們在web應用開發過程當中常常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?

Public Stringtranslate(String str) {

   StringtempStr ="";

   try{

     tempStr= newString(str.getBytes("ISO-8859-1"), "GBK");

     tempStr=tempStr.trim();

   }

   catch(Exception e) {

    System.err.println(e.getMessage());

   }

   returntempStr;

}

20.如今輸入n個數字,以逗號,分開;而後可選擇升或者降序排序;按提交鍵就在另外一頁面顯示按什麼排序,結果爲,提供reset

.數據庫部分

1、用兩種方式根據部門號從高到低,工資從低到高列出每一個員工的信息。

employee:

    eid,ename,salary,deptid;

select * fromemployeeorder by deptid desc,salary

2、列出各個部門中工資高於本部門的平均工資的員工數和部門號,並按部門號排序

建立表:

       mysql>createtable employee921(id int primary key auto_increment,name varchar(5

0),salarybigint,deptid int);

插入實驗數據:

mysql> insertinto employee921values(null,'zs',1000,1),(null,'ls',1100,1),(null

,'ww',1100,1),(null,'zl',900,1),(null,'zl',1000,2), (null,'zl',900,2),(null,'z

l',1000,2) ,(null,'zl',1100,2);

編寫sql語句:

()select avg(salary) from employee921 group by deptid;

()mysql>selectemployee921.id,employee921.name,employee921.salary,employee921.dep

tid tidfrom  employee921where salary > (select avg(salary) fromemployee921 where  deptid = tid);

   效率低的一個語句,僅供學習參考使用(在group by以後不能使用where,只能使用having,在group by以前能夠使用where,即表示對過濾後的結果分組):

mysql>selectemployee921.id,employee921.name,employee921.salary,employee921.dep

tid tidfrom  employee921where salary > (select avg(salary) fromemployee921 group by deptid havingdeptid = tid);

()select count(*) ,tid

       from(

              selectemployee921.id,employee921.name,employee921.salary,employee921.deptidtid

              from     employee921

              wheresalary>

                   (selectavg(salary) from employee921 where deptid = tid)

       )as t

       groupby tid ;

另一種方式:關聯查詢

selecta.ename,a.salary,a.deptid

from emp a,

    (selectdeptd,avg(salary)avgsal from emp group by deptid ) b

wherea.deptid=b.deptidand a.salary>b.avgsal;

3、存儲過程與觸發器必須講,常常被面試到?

create procedureinsert_Student (_name varchar(50),_age int ,out_id int)

begin

       insertinto studentvalue(null,_name,_age);

       selectmax(stuId)into _id from student;

end;

callinsert_Student('wfz',23,@id);

select @id;

mysql> createtrigger update_Student BEFORE update on studentFOR EACH ROW

-> select *from student;

觸發器不容許返回結果

create triggerupdate_StudentBEFORE update on student FOR EACH ROW

insertinto  student value(null,'zxx',28);

mysql的觸發器目前不能對當前表進行操做

create triggerupdate_StudentBEFORE update on student FOR EACH ROW

delete fromarticles  where id=8;

這個例子不是很好,最好是用刪除一個用戶時,順帶刪除該用戶的全部帖子

這裏要注意使用OLD.id

觸發器用處仍是不少的,好比校內網、開心網、Facebook,你發一個日誌,自動通知好友,其實就是在增長日誌時作一個後觸發,再向通知表中寫入條目。由於觸發器效率高。而UCH沒有用觸發器,效率和數據處理能力都很低。

存儲過程的實驗步驟:

mysql>delimiter |

mysql> createprocedureinsertArticle_Procedure (pTitle varchar(50),pBid int,out

pId int)

    ->begin

    ->insert into article1value(null,pTitle,pBid);

    ->select max(id) into pId fromarticle1;

    ->end;

    ->|

Query OK, 0 rowsaffected (0.05sec)

mysql>callinsertArticle_Procedure('傳智播客',1,@pid);

    ->|

Query OK, 0 rowsaffected (0.00sec)

mysql>delimiter ;

mysql> select@pid;

+------+

| @pid |

+------+

|3    |

+------+

1 row in set(0.00 sec)

mysql> select* fromarticle1;

+----+--------------+------+

| id |title        | bid |

+----+--------------+------+

| 1  |test        | 1    |

| 2  |chuanzhiboke | 1    |

|3  | 傳智播客    |1    |

+----+--------------+------+

3 rows in set(0.00 sec)

觸發器的實驗步驟:

create tableboard1(id intprimary key auto_increment,name varchar(50),ar

ticleCount int);

create tablearticle1(id intprimary key auto_increment,title varchar(50)

,bid intreferencesboard1(id));

delimiter |

createtriggerinsertArticle_Trigger after insert on article1 for each ro

w begin

    ->update board1 setarticleCount=articleCount+1 where id= NEW.bid;

    ->end;

    ->|

delimiter ;

insert intoboard1 value(null,'test',0);

insert intoarticle1value(null,'test',1);

還有,每插入一個帖子,都但願將版面表中的最後發帖時間,帖子總數字段進行同步更新,用觸發器作效率就很高。下次課設計這樣一個案例,寫觸發器時,對於最後發帖時間可能須要用declare方式聲明一個變量,或者是用NEW.posttime來生成。

4、數據庫三範式是什麼?

第一範式(1NF):字段具備原子性,不可再分。全部關係型數據庫系統都知足第一範式)

      數據庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須做爲一個總體,沒法區分哪部分是姓,哪部分是名,若是要區分出姓和名,必須設計成兩個獨立的字段。

  第二範式(2NF):

第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。

要求數據庫表中的每一個實例或行必須能夠被唯一地區分。一般須要爲表加上一個列,以存儲各個實例的唯一標識。這個唯一屬性列被稱爲主關鍵字或主鍵。

第二範式(2NF) 要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成 一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二範式就是非主屬性非部分 依賴於主關鍵字。

 

第三範式的要求以下:

知足第三範式(3NF)必須先知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。

因此第三範式具備以下特徵:
         1,每一列只有一個值
         2,每一行都能區分。
         3,每個表都不包含其餘表已經包含的非主關鍵字信息。

例如,帖子表中只能出現發帖人的id,而不能出現發帖人的id,還同時出現發帖人姓名,不然,只要出現同一發帖人id的全部記錄,它們中的姓名部分都必須嚴格保持一致,這就是數據冗餘。

5、說出一些數據庫優化方面的經驗?

PreparedStatement通常來講比Statement性能高:一個sql發給服務器去執行,涉及步驟:語法檢查、語義分析,編譯,緩存

「inert into uservalues(1,1,1)-à二進制

「inert into uservalues(2,2,2)-à二進制

「inert into uservalues(?,?,?)-à二進制

有外鍵約束會影響插入和刪除性能,若是程序可以保證數據的完整性,那在設計數據庫時就去掉外鍵。(比喻:就比如免檢產品,就是爲了提升效率,充分相信產品的製造商)

(對於hibernate來講,就應該有一個變化:empleyee->Deptment對象,如今設計時就成了employeeàdeptid

mysql幫助文檔子查詢章節的最後部分,例如,根據掃描的原理,下面的子查詢語句要比第二條關聯查詢的效率高:

1.  selecte.name,e.salarywhere e.managerid=(select id from employee where name='zxx');

2.  selecte.name,e.salary,m.name,m.salary fromemployees e,employees m where

e.managerid =m.id andm.name='zxx';

表中容許適當冗餘,譬如,主題帖的回覆數量和最後回覆時間等

將姓名和密碼單獨從用戶表中獨立出來。這能夠是很是好的一對一的案例喲!

sql語句所有大寫,特別是列名和表名都大寫。特別是sql命令的緩存功能,更加須要統一大小寫,sql語句à發給oracle服務器à語法檢查和編譯成爲內部指令à緩存和執行指令。根據緩存的特色,不要拼湊條件,而是用?PreparedStatment

還有索引對查詢性能的改進也是值得關注的。

備註:下面是關於性能的討論舉例

4航班 3個城市

m*n

select * fromflight,city where flight.startcityid=city.cityidand city.name='beijing';

m + n

select * fromflight where startcityid = (select cityid fromcity where cityname='beijing');

selectflight.id,'beijing',flight.flightTime from flight wherestartcityid = (selectcityid from city where cityname='beijing')

6unionunion all有什麼不一樣?

假設咱們有一個表Student,包括如下字段與數據:

drop tablestudent;

create table student
(
id int primary key,
name nvarchar2(50) not null,
score number not null
);

insert intostudent values(1,'Aaron',78);
insert into student values(2,'Bill',76);
insert into student values(3,'Cindy',89);
insert into student values(4,'Damon',90);
insert into student values(5,'Ella',73);
insert into student values(6,'Frado',61);
insert into student values(7,'Gill',99);
insert into student values(8,'Hellen',56);
insert into student values(9,'Ivan',93);
insert into student values(10,'Jay',90);

commit;

UnionUnion All的區別。

select *
from student
where id < 4

union

select *
from student
where id > 2 and id < 6

結果將是

1   Aaron    78
2    Bill    76
3    Cindy    89
4    Damon    90
5    Ella    73

若是換成Union All鏈接兩個結果集,則返回結果是:

1   Aaron    78
2    Bill    76
3    Cindy    89
3    Cindy    89
4    Damon    90
5    Ella    73

能夠看到,UnionUnion All的區別之一在於對重複結果的處理。

UNION在進行表連接後會篩選掉重複的記錄,因此在表連接後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最多見的是過程表與歷史表UNION。如:
select * from gc_dfys
union
select * from ls_jg_dfys
  這個SQL在運行時先取出兩個表的結果,再用排序空間進行排序刪除重複的記錄,最後返回結果集,若是表數據量大的話可能會致使用磁盤進行排序。
 而UNION ALL只是簡單的將兩個結果合併後就返回。這樣,若是返回的兩個結果集中有重複的數據,那麼返回的結果集就會包含重複的數據了。
 從效率上說,UNION ALL要比UNION快不少,因此,若是能夠確認合併的兩個結果集中不包含重複的數據的話,那麼就使用UNION ALL

7.分頁語句

取出sql表中第3140的記錄(以自動增加ID爲主鍵)

sql server方案1

    selecttop10 * from t where id not in (select top 30 id from t order by id ) orde byid

sql server方案2

    selecttop10 * from t where id in (select top 40 id from t order by id) order by iddesc

mysql方案:select * from t order by idlimit 30,10

oracle方案:select * from (select rownum r,* from twhere r<=40) wherer>30

--------------------待整理進去的內容-------------------------------------

pageSize=20;

pageNo = 5;

1.分頁技術1(直接利用sql語句進行分頁,效率最高和最推薦的)

mysql:sql ="select * from articles limit " +(pageNo-1)*pageSize + ","+ pageSize;

oracle: sql ="select * from " +

                                                       "(selectrownumr,* from " +

                                                              "(select*from articles order by postime desc)" +

                                                       "whererownum<=" + pageNo*pageSize +") tmp " +

                                                 "wherer>"+ (pageNo-1)*pageSize;

註釋:第7行保證rownum的順序是肯定的,由於oracle的索引會形成rownum返回不一樣的值

簡洋提示:沒有order by時,rownum按順序輸出,一旦有了order byrownum不按順序輸出了,這說明rownum是排序前的編號。若是對order by從句中的字段創建了索引,那麼,rownum也是按順序輸出的,由於這時候生成原始的查詢結果集時會參照索引表的順序來構建。

sqlserver:sql ="select top 10 * from id not id(select top" + (pageNo-1)*pageSize +"id from articles)"

DataSource ds =new InitialContext().lookup(jndiurl);

Connection cn =ds.getConnection();

//"select *from user where id=?"  --->binary directive

PreparedStatementpstmt = cn.prepareSatement(sql);

ResultSet rs =pstmt.executeQuery()

while(rs.next())

{

       out.println(rs.getString(1));

}

2.不可滾動的遊標

pageSize=20;

pageNo = 5;

cn = null

stmt = null;

rs = null;

try

{

sqlserver:sql ="select * from articles";

DataSource ds =new InitialContext().lookup(jndiurl);

Connection cn =ds.getConnection();

//"select *from user where id=?"  --->binary directive

PreparedStatementpstmt = cn.prepareSatement(sql);

ResultSet rs =pstmt.executeQuery()

for(intj=0;j<(pageNo-1)*pageSize;j++)

{

       rs.next();

}

int i=0;

while(rs.next()&& i<10)

{

       i++;

       out.println(rs.getString(1));

}

}

cacth(){}

finnaly

{

       if(rs!=null)try{rs.close();}catch(Exceptione){}

       if(stm.........

       if(cn............

}

3.可滾動的遊標

pageSize=20;

pageNo = 5;

cn = null

stmt = null;

rs = null;

try

{

sqlserver:sql ="select * from articles";

DataSource ds =new InitialContext().lookup(jndiurl);

Connection cn =ds.getConnection();

//"select *from user where id=?"  --->binary directive

PreparedStatementpstmt = cn.prepareSatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,...);

//根據上面這行代碼的異常SQLFeatureNotSupportedException,就可判斷驅動是否支持可滾動遊標

ResultSet rs =pstmt.executeQuery()

rs.absolute((pageNo-1)*pageSize)

int i=0;

while(rs.next()&& i<10)

{

       i++;

       out.println(rs.getString(1));

}

}

cacth(){}

finnaly

{

       if(rs!=null)try{rs.close();}catch(Exceptione){}

       if(stm.........

       if(cn............

}

8.用一條SQL語句查詢出每門課都大於80分的學生姓名

name  kecheng   fenshu 
張三    語文      81
張三    數學      75
李四    語文      76
李四    數學      90
王五    語文      81
王五    數學      100
王五    英語      90

準備數據的sql代碼:

create tablescore(id int primary key auto_increment,namevarchar(20),subjectvarchar(20),score int);

insert intoscore values

(null,'張三','語文',81),

(null,'張三','數學',75),

(null,'李四','語文',76),

(null,'李四','數學',90),

(null,'王五','語文',81),

(null,'王五','數學',100),

(null,'王五 ','英語',90);

提示:當百思不得其解時,請理想思惟,把小變成大作,把大變成小作,

答案:
A: select distinct name from score  where  name not in(selectdistinct name from score where score<=80)

B:selectdistince name t1 from score where 80< all (selectscore from score wherename=t1);

9.全部部門之間的比賽組合

一個叫department的表,裏面只有一個字段name,一共有4條紀錄,分別是a,b,c,d,對應四個球對,如今四個球對進行比賽,用一條sql語句顯示全部可能的比賽組合.

答:select a.name,b.name 
from team a, team b 
where a.name < b.name

10.每月份的發生額都比101科目多的科目

請用SQL語句實現:從TestDB數據表中查詢出全部月份的發生額都比101科目相應月份的發生額高的科目。請注意:TestDB中有不少科目,都有112月份的發生額。
AccID:科目代碼,Occmonth:發生額月份,DebitOccur:發生額。
數據庫名:JcyAudit,數據集:Select * fromTestDB

準備數據的sql代碼:

drop table ifexists TestDB;

create tableTestDB(id int primary key auto_increment,AccIDvarchar(20), Occmonth date,DebitOccur bigint);

insert intoTestDB values

(null,'101','1988-1-1',100),

(null,'101','1988-2-1',110),

(null,'101','1988-3-1',120),

(null,'101','1988-4-1',100),

(null,'101','1988-5-1',100),

(null,'101','1988-6-1',100),

(null,'101','1988-7-1',100),

(null,'101','1988-8-1',100);

--複製上面的數據,故意把第一個月份的發生額數字改小一點

insert intoTestDB values

(null,'102','1988-1-1',90),

(null,'102','1988-2-1',110),

(null,'102','1988-3-1',120),

(null,'102','1988-4-1',100),

(null,'102','1988-5-1',100),

(null,'102','1988-6-1',100),

(null,'102','1988-7-1',100),

(null,'102','1988-8-1',100);

--複製最上面的數據,故意把全部發生額數字改大一點

insert intoTestDB values

(null,'103','1988-1-1',150),

(null,'103','1988-2-1',160),

(null,'103','1988-3-1',180),

(null,'103','1988-4-1',120),

(null,'103','1988-5-1',120),

(null,'103','1988-6-1',120),

(null,'103','1988-7-1',120),

(null,'103','1988-8-1',120);

--複製最上面的數據,故意把全部發生額數字改大一點

insert intoTestDB values

(null,'104','1988-1-1',130),

(null,'104','1988-2-1',130),

(null,'104','1988-3-1',140),

(null,'104','1988-4-1',150),

(null,'104','1988-5-1',160),

(null,'104','1988-6-1',170),

(null,'104','1988-7-1',180),

(null,'104','1988-8-1',140);

--複製最上面的數據,故意把第二個月份的發生額數字改小一點

insert intoTestDB values

(null,'105','1988-1-1',100),

(null,'105','1988-2-1',80),

(null,'105','1988-3-1',120),

(null,'105','1988-4-1',100),

(null,'105','1988-5-1',100),

(null,'105','1988-6-1',100),

(null,'105','1988-7-1',100),

(null,'105','1988-8-1',100);

答案:
select distinct AccID from TestDB

where AccID notin

       (selectTestDB.AccIDfromTestDB,

              (select* from TestDB where AccID='101') asdb101

       whereTestDB.Occmonth=db101.Occmonthand TestDB.DebitOccur<=db101.DebitOccur

       );

11.統計每一年每個月的信息

year  monthamount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4
查成這樣一個結果
year m1  m2  m3  m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4 

提示:這個與工資條很是相似,與學生的科目成績也很類似。

準備sql語句:

drop table ifexistssales;

create tablesales(idint auto_increment primary key,year varchar(10), month varchar(10),amountfloat(2,1));

insert intosalesvalues

(null,'1991','1',1.1),

(null,'1991','2',1.2),

(null,'1991','3',1.3),

(null,'1991','4',1.4),

(null,'1992','1',2.1),

(null,'1992','2',2.2),

(null,'1992','3',2.3),

(null,'1992','4',2.4);


答案1、
select sales.year ,

(select t.amountfromsales t where t.month='1' and t.year= sales.year) '1',

(select t.amountfromsales t where t.month='1' and t.year= sales.year) '2',

(select t.amountfromsales t where t.month='1' and t.year= sales.year) '3',

(select t.amountfromsales t where t.month='1' and t.year= sales.year) as '4'

fromsales  group by year;

12.顯示文章標題,發帖人、最後回覆時間

表:id,title,postuser,postdate,parentid

準備sql語句:

drop table ifexists articles;

create tablearticles(id int auto_increment primary key,titlevarchar(50), postuser varchar(10),postdate datetime,parentid int referencesarticles(id));

insert intoarticles values

(null,'第一條','張三','1998-10-10 12:32:32',null),

(null,'第二條','張三','1998-10-10 12:34:32',null),

(null,'第一條回覆1','李四','1998-10-10 12:35:32',1),

(null,'第二條回覆1','李四','1998-10-10 12:36:32',2),

(null,'第一條回覆2','王五','1998-10-10 12:37:32',1),

(null,'第一條回覆3','李四','1998-10-10 12:38:32',1),

(null,'第二條回覆2','李四','1998-10-10 12:39:32',2),

(null,'第一條回覆4','王五','1998-10-10 12:39:40',1);

答案:

selecta.title,a.postuser,

       (selectmax(postdate)from articles where parentid=a.id) reply

from articles awhere a.parentid is null;

註釋:子查詢能夠用在選擇列中,也可用於where的比較條件中,還能夠用於from從句中。

13.刪除除了id號不一樣,其餘都相同的學生冗餘信息

2.學生表以下:
id號   學號   姓名課程編號課程名稱分數
1        2005001  張三 0001     數學    69
2        2005002  李四 0001     數學    89
3        2005001  張三 0001     數學    69
A: delete from tablename where id號 not in(select min(id) from tablename group by學號,姓名,課程編號,課程名稱,分數)

實驗:

create tablestudent2(id int auto_increment primary key,codevarchar(20),name varchar(20));

insert intostudent2 values(null,'2005001','張三'),(null,'2005002','李四'),(null,'2005001','張三');

//以下語句,mysql報告錯誤,可能刪除依賴後面統計語句,而刪除又致使統計語句結果不一致。

delete fromstudent2 where id not in(select min(id) fromstudent2 group by name);

//可是,以下語句沒有問題:

select*  from student2where id not in(select min(id) from student2 group byname);

//因而,我想先把分組的結果作成虛表,而後從虛表中選出結果,最後再將結果做爲刪除的條件數據。

delete fromstudent2 where id not in(select mid from (selectmin(id) mid

from student2group by name) as t);

或者:

delete from student2where id not in(select min(id) from (select* from s

tudent2) as tgroup by t.name);

14.航空網的幾個航班查詢題:

表結構以下:

flight{flightID,StartCityID,endCityID,StartTime}

city{cityID,CityName)

實驗環境:

create tablecity(cityID int auto_increment primary key,cityNamevarchar(20));

create tableflight (flightID int auto_increment primary key,

       StartCityIDintreferences city(cityID),

       endCityID int references city(cityID),

       StartTimetimestamp);

//航班原本應該沒有日期部分纔好,可是下面的題目當中涉及到了日期

insert into cityvalues(null,'北京'),(null,'上海'),(null,'廣州');

insert intoflight values

       (null,1,2,'9:37:23'),(null,1,3,'9:37:23'),(null,1,2,'10:37:23'),(null,2,3,'10:37:23');

1、查詢起飛城市是北京的全部航班,按到達城市的名字排序

參與運算的列是我起碼可以顯示出來的那些列,但最終我不必定把它們顯示出來。各個表組合出來的中間結果字段中必須包含全部運算的字段。

  select * from flight f,city c

       wheref.endcityid =c.cityid and startcityid =

       (selectc1.cityidfrom city c1 where c1.cityname = "北京")

       orderby c.citynameasc;

mysql> selectflight.flightid,'北京' startcity,e.cityname from flight,city e wh

ereflight.endcityid=e.cityid and flight.startcityid=(selectcityid from city wh

ere cityname='北京');

mysql> selectflight.flightid,s.cityname,e.cityname fromflight,city s,city e wh

ereflight.startcityid=s.cityid and s.cityname='北京' andflight.endCityId=e.cit

yID order bye.cityName desc;

2、查詢北京到上海的全部航班紀錄(起飛城市,到達城市,起飛時間,航班號)

selectc1.CityName,c2.CityName,f.StartTime,f.flightID

from cityc1,city c2,flight f

wheref.StartCityID=c1.cityID

andf.endCityID=c2.cityID

andc1.cityName='北京'

andc2.cityName='上海'

3、查詢具體某一天(2005-5-8)的北京到上海的的航班次數

select count(*)from

(selectc1.CityName,c2.CityName,f.StartTime,f.flightID

from cityc1,city c2,flight f

wheref.StartCityID=c1.cityID

andf.endCityID=c2.cityID

andc1.cityName='北京'

andc2.cityName='上海'

and 查幫助得到的某個日期處理函數(startTime) like '2005-5-8%'

mysql中提取日期部分進行比較的示例代碼以下:

select * fromflight wheredate_format(starttime,'%Y-%m-%d')='1998-01-02'

15.查出比經理薪水還高的員工信息:

Drop table ifnot exists employees;

create tableemployees(id int primary key auto_increment,namevarchar(50)

,salaryint,managerid intreferences employees(id));

insert intoemployees values (null,' lhm',10000,null), (null,'zxx',15000,1

),(null,'flx',9000,1),(null,'tg',10000,2),(null,'wzg',10000,3);

Wzg大於flx,lhm大於zxx

解題思路:

    根據sql語句的查詢特色,是逐行進行運算,不可能兩行同時參與運算。

涉及了員工薪水和經理薪水,全部,一行記錄要同時包含兩個薪水,全部想到要把這個表自關聯組合一下。

    首先要組合出一個包含有各個員工及該員工的經理信息的長記錄,譬如,左半部分是員工,右半部分是經理。而迪卡爾積會組合出不少垃圾信息,先去除這些垃圾信息。

select e.* fromemployees e,employees m where e.managerid=m.idand e.sala

ry>m.salary;

16、求出小於45歲的各個老師所帶的大於12歲的學生人數

數據庫中有3個表 teacher表,student表,tea_stu關係表。
teacher 表 teaID name age
student 表 stuID name age
teacher_student表 teaID stuID
要求用一條sql查詢出這樣的結果
1.顯示的字段要有老師name, age每一個老師所帶的學生人數
只列出老師age40如下,學生age12以上的記錄

預備知識:

      1.sql語句是對每一條記錄依次處理,條件爲真則執行動做(select,insert,delete,update

       2.只要是迪卡爾積,就會產生垃圾信息,因此,只要迪卡爾積了,咱們首先就要想到清除垃圾信息

實驗準備:

      droptable if exists tea_stu;

      droptable if exists teacher;

      droptable if exists student;

      createtable teacher(teaID int primarykey,name varchar(50),age int);

      createtable student(stuID int primarykey,name varchar(50),age int);

      createtable tea_stu(teaID int referencesteacher(teaID),stuID int referencesstudent(stuID));

insertintoteacher values(1,'zxx',45), (2,'lhm',25) , (3,'wzg',26) , (4,'tg',27);

insertintostudent values(1,'wy',11), (2,'dh',25) , (3,'ysq',26) , (4,'mxc',27);

insertintotea_stu values(1,1), (1,2), (1,3);

insertintotea_stu values(2,2), (2,3), (2,4);

insert intotea_stu values(3,3), (3,4), (3,1);

insertintotea_stu values(4,4), (4,1), (4,2) , (4,3);

結果:2à3,3à2,4à3

解題思路:(真實面試答題時,也要寫出每一個分析步驟,若是紙張不夠,就找別人要)

1要會統計分組信息,統計信息放在中間表中:

selectteaid,count(*)from tea_stu group by teaid;

2接着其實應該是篩除掉小於12歲的學生,而後再進行統計,中間表必須與student關聯才能獲得12歲如下學生和把該學生記錄從中間表中剔除,代碼是:

selecttea_stu.teaid,count(*)total from student,tea_stu

wherestudent.stuid=tea_stu.stuidand student.age>12 group by tea_stu.teaid

3.接着把上面的結果作成虛表與teacher進行關聯,並篩除大於45的老師

selectteacher.teaid,teacher.name,totalfrom teacher ,(select tea_stu.tea

id,count(*)totalfrom student,tea_stu where student.stuid=tea_stu.stuid and stu

dent.age>12groupby tea_stu.teaid) as tea_stu2where teacher.teaid=tea_stu2.tea

idandteacher.age<45;

17.求出發帖最多的人:

selectauthorid,count(*) total from articles

group byauthorid

having total=

(selectmax(total2) from(select count(*) total2 from articles group by authorid) as t);

selectt.authorid,max(t.total) from

select authorid,count(*) total from articlesas t

這條語句不行,由於max只有一列,不能與其餘列混淆。

selectauthorid,count(*) total from articles

group byauthorid having total=max(total)也不行。

18、一個用戶表中有一個積分字段,假如數據庫中有100多萬個用戶,若要在每一年第一天凌晨將積分清零,你將考慮什麼,你將想什麼辦法解決?

alter table dropcolumn score;

alter table addcolunm score int;

可能會很快,可是須要試驗,試驗不能拿真實的環境來操刀,而且要注意,

這樣的操做時沒法回滾的,在個人印象中,只有inert update deleteDML語句才能回滾,

對於create table,drop table ,alter tableDDL語句是不能回滾。

解決方案一,update user set score=0;

解決方案二,假設上面的代碼要執行好長時間,超出咱們的容忍範圍,那我就alter table userdrop columnscore;alter table user add column score int

下面代碼實現每一年的那個凌晨時刻進行清零。

Runnablerunnable =

       newRunnable(){

              publicvoidrun(){

                     clearDb();

                     schedule(this,newDate(newDate().getYear()+1,0,0));

                     }          

                     };

schedule(runnable,

       newDate(newDate().getYear()+1,0,1));

19、一個用戶具備多個角色,請查詢出該表中具備該用戶的全部角色的其餘用戶。

select count(*)as num,tb.id

from

tb,

(select rolefrom tbwhere id=xxx) as t1

where

tb.role =t1.role andtb.id != t1.id

group by tb.id

having

       num= select count(role)from tb where id=xxx;

20. xxx公司的sql面試

Table EMPLOYEES Structure:

EMPLOYEE_ID      NUMBER       Primary Key,

FIRST_NAME      VARCHAR2(25),

LAST_NAME       VARCHAR2(25),

Salarynumber(8,2),

HiredDate DATE,

Departmentidnumber(2)

TableDepartments Structure:

Departmentidnumber(2)        Primary Key,

DepartmentName  VARCHAR2(25).

(2)基於上述EMPLOYEES表寫出查詢:寫出僱用日期在今年的,或者工資在[1000,2000]之間的,或者員工姓名(last_name)以Obama打頭的全部員工,列出這些員工的所有我的信息。(4分)

select* fromemployees

whereYear(hiredDate)= Year(date())

       or(salary between 1000 and 200)

       orleft(last_name,3)='abc';

(3) 基於上述EMPLOYEES表寫出查詢:查出部門平均工資大於1800元的部門的全部員工,列出這些員工的所有我的信息。(4分)

mysql>selectid,name,salary,deptid did from employee1 where (select avg(salary)

from employee1where deptid = did) > 1800;

(4) 基於上述EMPLOYEES表寫出查詢:查出我的工資高於其所在部門平均工資的員工,列出這些員工的所有我的信息及該員工工資高出部門平均工資百分比。(5分)

selectemployee1.*,(employee1.salary-t.avgSalary)*100/employee1.salary

fromemployee1,

       (selectdeptid,avg(salary) avgSalary fromemployee1 group by deptid) as t

whereemployee1.deptid= t.deptid and employee1.salary>t.avgSalary;

21、註冊Jdbc驅動程序的三種方式

22、用JDBC如何調用存儲過程

代碼以下:

package com.huawei.interview.lym;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Types;

publicclass JdbcTest{

    /**

    * @paramargs

    */

    publicstatic voidmain(String[] args) {

       // TODO Auto-generatedmethod stub

       Connectioncn = null;

       CallableStatementcstmt =null;  

       try {

           //這裏最好不要這麼幹,由於驅動名寫死在程序中了

           Class.forName("com.mysql.jdbc.Driver");

           //實際項目中,這裏應用DataSource數據,若是用框架,

           //這個數據源不須要咱們編碼建立,咱們只需Datasource ds =context.lookup()

           //cn= ds.getConnection();       

           cn= DriverManager.getConnection("jdbc:mysql:///test","root","root");

           cstmt= cn.prepareCall("{callinsert_Student(?,?,?)}");

           cstmt.registerOutParameter(3,Types.INTEGER);

           cstmt.setString(1,"wangwu");

           cstmt.setInt(2,25);

           cstmt.execute();

           //get第幾個,不一樣的數據庫不同,建議不寫

           System.out.println(cstmt.getString(3));

       } catch (Exceptione) {

           // TODO Auto-generatedcatchblock

           e.printStackTrace();

       }

       finally

       {

           /*try{cstmt.close();}catch(Exceptione){}

           try{cn.close();}catch(Exceptione){}*/

           try {

              if(cstmt!=null)

                  cstmt.close();

              if(cn!=null)            

                  cn.close();

           } catch (SQLExceptione) {

              // TODO Auto-generatedcatchblock

              e.printStackTrace();

           }

       }

    }

23JDBC中的PreparedStatement相比Statement的好處

答:一個sql命令發給服務器去執行的步驟爲:語法檢查,語義分析,編譯成內部指令,緩存指令,執行指令等過程。

select * fromstudent where id =3----緩存--àxxxxx二進制命令

select * fromstudent where id =3----直接取-àxxxxx二進制命令

select * fromstudent where id =4--- -à會怎麼幹?

若是當初是select * from student where id =?--- -à又會怎麼幹?

上面說的是性能提升

能夠防止sql注入。

24. 寫一個用jdbc鏈接並訪問oracle數據的程序代碼

25Class.forName的做用?爲何要用?

答:按參數中指定的字符串形式的類名去搜索並加載相應的類,若是該類字節碼已經被加載過,則返回表明該字節碼的Class實例對象,不然,按類加載器的委託機制去搜索和加載該類,若是全部的類加載器都沒法加載到該類,則拋出ClassNotFoundException。加載完這個Class字節碼後,接着就能夠使用Class字節碼的newInstance方法去建立該類的實例對象了。

有時候,咱們程序中全部使用的具體類名在設計時(即開發時)沒法肯定,只有程序運行時才能肯定,這時候就須要使用Class.forName去動態加載該類,這個類名一般是在配置文件中配置的,例如,springioc中每次依賴注入的具體類就是這樣配置的,jdbc的驅動類名一般也是經過配置文件來配置的,以便在產品交付使用後不用修改源程序就能夠更換驅動類名。

26、大數據量下的分頁解決方法。

答:最好的辦法是利用sql語句進行分頁,這樣每次查詢出的結果集中就只包含某頁的數據內容。再sql語句沒法實現分頁的狀況下,能夠考慮對大的結果集經過遊標定位方式來獲取某頁的數據。

sql語句分頁,不一樣的數據庫下的分頁方案各不同,下面是主流的三種數據庫的分頁sql

sql server:

       Stringsql =

       "selecttop" + pageSize + " * from students where id not in" +

"(selecttop "+ pageSize * (pageNumber-1) + " id from students order byid)" +

"order byid";

mysql:

       Stringsql =

       "select* fromstudents order by id limit " + pageSize*(pageNumber-1) +"," +pageSize;

     

oracle:

       Stringsql =

       "select* from " +

       (select*,rownum rid from (select * fromstudents order by postime desc) whererid<=" + pagesize*pagenumber +") as t" +

       "wheret>" +pageSize*(pageNumber-1);

27、用 JDBC查詢學生成績單,把主要代碼寫出來(考試機率極大).

Connection cn =null;

PreparedStatementpstmt =null;

Resultset rs =null;

try

{

       Class.forname(driveClassName);

       cn=  DriverManager.getConnection(url,username,password);

       pstmt=cn.prepareStatement(select  score.* fromscore ,student 「 +

              「wherescore.stuId= student.id and student.name = ?);

       pstmt.setString(1,studentName);

       Resultsetrs =pstmt.executeQuery();

       while(rs.next())

       {

              system.out.println(rs.getInt(subject) +  「    」 + rs.getFloat(score) );

       }

}catch(Exceptione){e.printStackTrace();}

finally

{

       if(rs!= null) try{rs.close() }catch(exception e){}

       if(pstmt!= null)try{pstmt.close()}catch(exception e){}

       if(cn!= null) try{cn.close() }catch(exception e){}

}

28、這段代碼有什麼不足之處?

try {
Connection conn = ...;
Statement stmt = ...;

ResultSet rs=stmt.executeQuery("select * from table1");

while(rs.next()){

}
} catch(Exception ex) {
}

答:沒有finally語句來關閉各個對象,另外,使用finally以後,要把變量的定義放在try語句塊的外面,以便在try語句塊以外的finally塊中仍能夠訪問這些變量。

29、說出數據鏈接池的工做機制是什麼?

J2EE服 務器啓動時會創建必定數量的池鏈接,並一直維持很多於此數目的池鏈接。客戶端程序須要鏈接時,池驅動程序會返回一個未使用的池鏈接並將其表記爲忙。若是當 前沒有空閒鏈接,池驅動程序就新建必定數量的鏈接,新建鏈接的數量有配置參數決定。當使用的池鏈接調用完成後,池驅動程序將此鏈接表記爲空閒,其餘調用就 能夠使用這個鏈接。

實現方式,返回的Connection是原始Connection的代理,代理Connectionclose方法不是真正關鏈接,而是把它代理的Connection對象還回到鏈接池中。

30、爲何要用 ORM? 和 JDBC有何不同?

orm是一種思想,就是把object轉變成數據庫中的記錄,或者把數據庫中的記錄轉變成objecdt,咱們能夠用jdbc來實現這種思想,其實,若是咱們的項目是嚴格按照oop方式編寫的話,咱們的jdbc程序無論是有意仍是無心,就已經在實現orm的工做了。

如今有許多orm工具,它們底層調用jdbc來實現了orm工做,咱們直接使用這些工具,就省去了直接使用jdbc的繁瑣細節,提升了開發效率,如今用的較多的orm工具是hibernate。也據說一些其餘orm工具,如toplink,ojb等。

. XML部分

1xml有哪些解析技術?區別是什麼?

:DOM,SAX,STAX

DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問

STAX:StreamingAPI for XML (StAX)

講解這些區別是不須要特別去比較,就像說傳智播客與其餘培訓機構的區別時,咱們只需說清楚傳智播客有什麼特色和優勢就好了,這就已經間接回答了彼此的區別。

2、你在項目中用到了xml技術的哪些方面?如何實現的?

:用到了數據存貯,信息配置兩方面。在作數據交換平臺時,將不能數據源的數據組裝成XML文件,而後將XML文件壓縮打包加密後經過網絡傳送給接收者,接收解密與解壓縮後再同XML文件中還原相關信息進行處理。在作軟件配置時,利用XML能夠很方便的進行,軟件的各類配置參數都存貯在XML文件中。

3、用jdom解析xml文件時如何解決中文問題?如何解析?

:看以下代碼,用編碼方式加以解決
package test; 
import java.io.*; 
public class DOMTest 

private String inFile = "c:\\people.xml" 
private String outFile = "c:\\people.xml" 
public static void main(String args[]) 

new DOMTest(); 

public DOMTest() 

try 

javax.xml.parsers.DocumentBuilder builder =

javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document doc = builder.newDocument(); 
org.w3c.dom.Element root = doc.createElement("老師");
org.w3c.dom.Element wang = doc.createElement("");
org.w3c.dom.Element liu = doc.createElement("");
wang.appendChild(doc.createTextNode("我是王老師"));
root.appendChild(wang); 
doc.appendChild(root); 
javax.xml.transform.Transformer transformer = 
javax.xml.transform.TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,"gb2312"); 
transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,"yes");

transformer.transform(newjavax.xml.transform.dom.DOMSource(doc),
new

javax.xml.transform.stream.StreamResult(outFile));

catch (Exception e) 

System.out.println (e.getMessage()); 


}

4、編程用JAVA解析XML的方式.

:SAX方式解析XMLXML文件以下:

<?xmlversion=1.0 encoding=gb2312?>

<person>

<name>王小明</name>

<college>信息學院</college>

<telephone>6258113</telephone>

<notes>,1955年生,博士,95年調入海南大學</notes>

</person>

事件回調類SAXHandler.java

importjava.io.*;

importjava.util.Hashtable;

importorg.xml.sax.*;

public classSAXHandler extends HandlerBase

{

privateHashtable table = new Hashtable();

private StringcurrentElement = null;

private StringcurrentValue = null;

public voidsetTable(Hashtable table)

{

this.table =table;

}

public HashtablegetTable()

{

return table;

}

public voidstartElement(String tag, AttributeList attrs)

throwsSAXException

{

currentElement =tag;

}

public voidcharacters(char[] ch, int start, int length)

throwsSAXException

{

currentValue =new String(ch, start, length);

}

public voidendElement(String name) throws SAXException

{

if(currentElement.equals(name))

table.put(currentElement,currentValue);

}

}

JSP內容顯示源碼,SaxXml.jsp:

<HTML>

<HEAD>

<TITLE>剖析XML文件people.xml</TITLE>

</HEAD>

<BODY>

<%@ pageerrorPage=ErrPage.jsp

contentType=text/html;charset=GB2312%>

<%@ page import=java.io.*%>

<%@ pageimport=java.util.Hashtable %>

<%@ pageimport=org.w3c.dom.* %>

<%@ pageimport=org.xml.sax.* %>

<%@ pageimport=javax.xml.parsers.SAXParserFactory %>

<%@ pageimport=javax.xml.parsers.SAXParser %>

<%@ pageimport=SAXHandler %>

<%

File file = newFile(c:\people.xml);

FileReaderreader = new FileReader(file);

Parser parser;

SAXParserFactoryspf = SAXParserFactory.newInstance();

SAXParser sp =spf.newSAXParser();

SAXHandlerhandler = new SAXHandler();

sp.parse(newInputSource(reader), handler);

HashtablehashTable = handler.getTable();

out.println(<TABLEBORDER=2><CAPTION>教師信息表</CAPTION>);

out.println(<TR><TD>姓名</TD> + <TD> +

(String)hashTable.get(newString(name)) +</TD></TR>);

out.println(<TR><TD>學院</TD> + <TD> +

(String)hashTable.get(newString(college))+</TD></TR>);

out.println(<TR><TD>電話</TD> + <TD> +

(String)hashTable.get(newString(telephone)) +</TD></TR>);

out.println(<TR><TD>備註</TD> + <TD> +

(String)hashTable.get(newString(notes)) +</TD></TR>);

out.println(</TABLE>);

%>

</BODY>

</HTML>

5XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?

a: 兩種形式 dtd schemab:本質區別:schema自己是xml的,能夠被XML解析器解析(這也是從DTD上發展schema的根本目的)c:DOM,SAX,STAX

   DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問

SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問

   STAX:StreamingAPI forXML (StAX)

.流行的框架與新技術

1、談談你對Struts的理解。

:

1. struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個Servlet名爲ActionServlet,或是ActionServlet的子類。咱們能夠在web.xml文件中將符合某種特徵的全部請求交給這個Servlet處理,這個Servlet再參照一個配置文件(一般爲/WEB-INF/struts-config.xml)將各個請求分別分配給不一樣的action去處理。

一個擴展知識點:struts的配置文件能夠有多個,能夠按模塊配置各自的配置文件,這樣能夠防止配置文件的過分膨脹;

2.ActionServlet把請求交給action去處理以前,會將請求參數封裝成一個formbean對象(就是一個java類,這個類中的每一個屬性對應一個請求參數),封裝成一個什麼樣的formbean對象呢?看配置文件。

3.要說明的是, ActionServletformbean對象傳遞給actionexecute方法以前,可能會調用formbeanvalidate方法進行校驗,只有校驗經過後纔將這個formbean對象傳遞給actionexecute方法,不然,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)做者爲何將這裏命名爲input屬性,而不是error屬性,咱們後面結合實際的運行效果進行分析。

4.action執行完後要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象經過struts-config.xml配置文件中的配置關聯到某個jsp頁面,由於程序中使用的是在struts-config.xml配置文件爲jsp頁面設置的邏輯名,這樣能夠實現action程序代碼與返回的jsp頁面名稱的解耦。

你對struts可能還有本身的應用方面的經驗,那也要一併說出來。

2、談談你對Hibernate的理解。

:

1. 面 向對象設計的軟件內部運行過程能夠理解成就是在不斷建立各類新對象、創建對象之間的關係,調用對象的方法來改變各個對象的狀態和對象消亡的過程,無論程序 運行的過程和操做怎麼樣,本質上都是要獲得一個結果,程序上一個時刻和下一個時刻的運行結果的差別就表如今內存中的對象狀態發生了變化。

2.爲了在關機和內存空間不夠的情況下,保持程序的運行狀態,須要將內存中的對象狀態保存到持久化設備和從持久化設備中恢復出對象的狀態,一般都是保存到關係數據庫來保存大量對象信息。從Java程序的運行功能上來說,保存對象狀態的功能相比系統運行的其餘功能來講,應該是一個很不起眼的附屬功能,java採用jdbc來實現這個功能,這個不起眼的功能卻要編寫大量的代碼,而作的事情僅僅是保存對象和恢復對象,而且那些大量的jdbc代碼並無什麼技術含量,基本上是採用一套例行公事的標準代碼模板來編寫,是一種苦活和重複性的工做。

3.經過數據庫保存java程序運行時產生的對象和恢復對象,其實就是實現了java對象與關係數據庫記錄的映射關係,稱爲ORM(即Object RelationMapping),人們能夠經過封裝JDBC代碼來實現了這種功能,封裝出來的產品稱之爲ORM框架,Hibernate就是其中的一種流行ORM框架。使用Hibernate框架,不用寫JDBC代碼,僅僅是調用一個save方法,就能夠將對象保存到關係數據庫中,僅僅是調用一個get方法,就能夠從數據庫中加載出一個對象。

4.使用Hibernate的基本流程是:配置Configuration對象、產生SessionFactory、建立session對象,啓動事務,完成CRUD操做,提交事務,關閉session

5.使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫鏈接信息和方言等,還要爲每一個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件中須要登記每一個hbm.xml文件。

6.在應用Hibernate時,重點要了解Session的緩存原理,級聯,延遲加載和hql查詢。

3AOP的做用。

4、你對Spring的理解。

1.Spring實現了工廠模式的工廠類(在這裏有必要解釋清楚什麼是工廠模式),這個類名爲BeanFactory(其實是一個接口),在程序中一般BeanFactory的子類ApplicationContextSpring至關於一個大的工廠類,在其配置文件中經過<bean>元素配置用於建立實例對象的類名和實例對象的屬性。

2. Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想能夠很好地實現模塊之間的解耦。IOC也稱爲DIDepency Injection),什麼叫依賴注入呢?

譬如,Class Programmer

{

       Computercomputer =null;

       publicvoid code()

       {

              //Computercomputer= new IBMComputer();

              //Computercomputer= beanfacotry.getComputer();

              computer.write();

       }

       publicvoidsetComputer(Computer computer)

       {

              this.computer=computer;

       }

}
另外兩種方式都由依賴,第一個直接依賴於目標類,第二個把依賴轉移到工廠上,第三個完全與目標和工廠解耦了。在spring的配置文件中配置片斷以下:

<bean id=computer」 class=cn.itcast.interview.Computer>

</bean>

<bean id=programmer」 class=cn.itcast.interview.Programmer>

       <propertyname=computer」  ref=computer></property>

</bean>

3. Spring提供了對AOP技術的良好封裝, AOP稱爲面向切面編程,就是系統中有不少各不相干的類的方法,在這些衆多方法中要加入某種系統功能的代碼,例如,加入日誌,加入權限判斷,加入異常處理,這種應用稱爲AOP。實現AOP功能採用的是代理技術,客戶端程序再也不調用目標,而調用代理類,代理類與目標類對外具備相同的方法聲明,有兩種方式能夠實現相同的方法聲明,一是實現相同的接口,二是做爲目標的子類在,JDK中採用Proxy類產生動態代理的方式爲某個接口生成實現類,若是要爲某個類生成子類,則能夠用CGLI B。在生成的代理類的方法中加入系統功能和調用目標類的相應方法,系統功能的代理以Advice對象進行提供,顯然要建立出代理對象,至少須要目標類和Advice類。spring提供了這種支持,只須要在spring配置文件中配置這兩個元素便可實現代理和aop功能,例如,

<bean id=proxy」 type=org.spring.framework.aop.ProxyBeanFactory>

       <propertyname=targetref=」」></property>

       <propertyname=advisorref=」」></property>

</bean>

5、談談Struts中的Action servlet

6Struts優缺點
優勢:
1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.

2.有豐富的tag能夠用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提升開發效率

3. 頁面導航

      使系統的脈絡更加清晰。經過一個配置文件,便可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。尤爲是當另外一批開發者接手這個項目時,這種優點體現得更加明顯。

4. 提供Exception處理機制 .

5. 數據庫連接池管理

6. 支持I18N

缺點

1、   轉到展現層時,須要配置forward,若是有十個展現層的jsp,須要配置十次struts,並且還不包括有時候目錄、文件變動,須要從新修改forward,注意,每次修改配置以後,要求從新部署整個項目,而tomcate這樣的服務器,還必須從新啓動服務器

2、   2、 StrutsAction必需是threadsafe方式,它僅僅容許一個實例去處理全部的請求。因此action用到的全部的資源都必需統一同步,這個就引發了線程安全的問題。

3、    測試不方便. Struts的每一個Action都同Web層耦合在一塊兒,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase能夠實現它的單元測試。

4、    類型的轉換. StrutsFormBean把全部的數據都做爲String類型,它能夠使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,並且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是很是困難的。

5、   Servlet的依賴性過強. Struts處理Action時必須要依賴ServletRequestServletResponse,全部它擺脫不了Servlet容器。

6、    前端表達式語言方面.Struts集成了JSTL,因此它主要使用JSTL的表達式語言來獲取數據。但是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。

7、    Action執行的控制困難. Struts建立一個Action,若是想控制它的執行順序將會很是困難。甚至你要從新去寫Servlet來實現你的這個功能需求。

8、    Action執行前和後的處理. Struts處理Action的時候是基於classhierarchies,很難在action處理前和後進行操做。

9、    對事件支持不夠.struts中,實際是一個表單Form對應一個Action(DispatchAction),換一句話說:在Struts中實際是一個表單只能對應一個事件,struts這種事件方式稱爲applicationeventapplication eventcomponent event相比是一種粗粒度的事件

7STRUTS的應用(STRUTS架構)

Struts是採用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的framework。採用Struts能開發出基於MVC(Model-View-Controller)設計模式的應用構架。 Struts有以下的主要功能:一.包含一個controller servlet,能將用戶的請求發送到相應的Action對象。二.JSP自由tag庫,而且在controllerservlet中提供關聯支持,幫助開發員建立交互式表單應用。三.提供了一系列實用對象:XML處理、經過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。

8、說說struts1struts2的區別。

1.都是MVCWEB框架,

2 struts1的老牌框架,應用很普遍,有很好的羣衆基礎,使用它開發風險很小,成本更低!struts2雖然基於這個框架,可是應用羣衆並多,相對不成熟,未知的風險和變化不少,開發人員相對很差招,使用它開發項目的風險係數更大,用人成本更高!

3.struts2畢竟是站在前輩的基礎設計出來,它會改善和完善struts1中的一些缺陷,struts1中一些懸而未決問題在struts2獲得瞭解決。

4.struts1的前端控制器是一個Servlet,名稱爲ActionServletstruts2的前端控制器是一個filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter

5.struts1action須要繼承Action類,struts2action能夠不繼承任何類;struts1對同一個路徑的全部請求共享一個Action實例,struts2對同一個路徑的每一個請求分別使用一個獨立Action實例對象,全部對於struts2Action不用考慮線程安全問題。

6.struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。

7.struts1中的多個業務方法放在一個Action中時(即繼承DispatchAction時),要麼都校驗,要麼都不校驗;對於struts2,能夠指定只對某個方法進行校驗,當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法,那麼則只對Xxx()方法進行校驗。

(一個請求來了的執行流程進行分析,struts2是自動支持分模塊開發,並能夠不一樣模塊設置不一樣的url前綴,這是經過packagenamespace來實現的;struts2是支持多種類型的視圖;struts2的視圖地址能夠是動態的,即視圖的名稱是支持變量方式的,舉例,論壇發帖失敗後回來還要傳遞boardid。視圖內容顯示方面:它的標籤用ognl,要el強大不少,在國際化方面支持分模塊管理,兩個模塊用到一樣的key,對應不一樣的消息;)

      

Struts1不一樣,Struts2對用戶的每一次請求都會建立一個Action,因此Struts2中的Action是線程安全的。

給我印象最深入的是:struts配置文件中的redirect視圖的url不能接受參數,而struts2配置文件中的redirect視圖能夠接受參數。

9hibernate中的update()saveOrUpdate()的區別,sessionload()get()的區別。

10、簡述 Hibernate和 JDBC的優缺點?如何書寫一個 one to many配置文件.

11iBatisHibernate有什麼不一樣?

相同點:屏蔽jdbc api的底層訪問細節,使用咱們不用與jdbc api打交道,就能夠訪問數據。

jdbc api編程流程固定,還將sql語句與java代碼混雜在了一塊兒,常常須要拼湊sql語句,細節很繁瑣。

ibatis的好處:屏蔽jdbc api的底層訪問細節;將sql語句與java代碼進行分離;提供了將結果集自動封裝稱爲實體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳遞給sql語句的參數。

Hibernate是一個全自動的orm映射工具,它能夠自動生成sql語句,ibatis須要咱們本身在xml配置文件中寫sql語句,hibernate要比ibatis功能負責和強大不少。由於hibernate自動生成sql語句,咱們沒法控制該語句,咱們就沒法去寫特定的高效率的sql。對於一些不太複雜的sql查詢,hibernate能夠很好幫咱們完成,可是,對於特別複雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,由於ibatis仍是由咱們本身寫sql語句。

12、寫Hibernate的一對多和多對一雙向關聯的orm配置?

9hibernateinverse屬性的做用?

解決方案一,按照Object[]數據取出數據,而後本身組bean

解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2

field2) ,而後在hql裏面就能夠直接生成這個bean了。

13、在DAO中如何體現DAO設計模式?

解決方案一,按照Object[]數據取出數據,而後本身組bean

解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2

field2) ,而後在hql裏面就能夠直接生成這個bean了。

14spring+Hibernate中委託方案怎麼配置?

解決方案一,按照Object[]數據取出數據,而後本身組bean

解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2

field2) ,而後在hql裏面就能夠直接生成這個bean了。

15spring+Hibernate中委託方案怎麼配置?

解決方案一,按照Object[]數據取出數據,而後本身組bean

解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2

field2) ,而後在hql裏面就能夠直接生成這個bean了。

16. hibernate進行多表查詢每一個表中各取幾個字段,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決;

解決方案一,按照Object[]數據取出數據,而後本身組bean

解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2

field2) ,而後在hql裏面就能夠直接生成這個bean了。

17.介紹一下Hibernate的二級緩存

按照如下思路來回答:(1)首先說清楚什麼是緩存,(2)再說有了hibernateSession就是一級緩存,即有了一級緩存,爲何還要有二級緩存,(3)最後再說如何配置Hibernate的二級緩存。

1)緩存就是把之前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中),這個數據結構一般是或相似Hashmap,當之後要使用某個對象時,先查詢緩存中是否有這個對象,若是有則使用緩存中的對象,若是沒有則去查詢數據庫,並將查詢出來的對象保存在緩存中,以便下次使用。下面是緩存的僞代碼:

引出hibernate的第二級緩存,用下面的僞代碼分析了Cache的實現原理

Dao

{

       hashmapmap = newmap();

       UsergetUser(integerid)

       {

              Useruser =map.get(id)

              if(user==null)

              {

                     user=session.get(id);

                     map.put(id,user);

              }

              returnuser;

       }

}

Dao

{

       Cachecache = null

       setCache(Cachecache)

       {

              this.cache=cache

       }

     

       UsergetUser(int id)

       {

              if(cache!=null)

              {

                     Useruser= cache.get(id);

                     if(user==null)

                     {

                            user=session.get(id);

                            cache.put(id,user);

                     }

                     returnuser;

              }

            

              returnsession.get(id);

       }

}

2HibernateSession就是一種緩存,咱們一般將之稱爲Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從本身內部查看是否存在這個對象,存在則直接返回,不存在纔去訪問數據庫,並將查詢的結果保存在本身內部。因爲Session表明一次會話過程,一個Session與一個數據庫鏈接相關連,因此Session最好不要長時間保持打開,一般僅用於一個事務當中,在事務結束時就應關閉。而且Session是線程不安全的,被多個線程共享時容易出現問題。一般只有那種全局意義上的緩存纔是真正的緩存應用,纔有較大的緩存價值,所以,HibernateSession這一級緩存的緩存做用並不明顯,應用價值不大。Hibernate的二級緩存就是要爲Hibernate配置一種全局緩存,讓多個線程和多個事務均可以共享這個緩存。咱們但願的是一我的使用過,其餘人也能夠使用,session沒有這種效果。

3)二級緩存是獨立於Hibernate的軟件部件,屬於第三方的產品,多個廠商和組織都提供有緩存產品,例如,EHCacheOSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一個廠家的緩存產品,接着須要配置該緩存產品本身的配置文件,最後要配置Hibernate中的哪些實體對象要歸入到二級緩存的管理中。明白了二級緩存原理和有了這個思路後,很容易配置起Hibernate的二級緩存。擴展知識:一個SessionFactory能夠關聯一個二級緩存,也即一個二級緩存只能負責緩存一個數據庫中的數據,當使用Hibernate的二級緩存後,注意不要有其餘的應用或SessionFactory來更改當前數據庫中的數據,這樣緩存的數據就會與數據庫中的實際數據不一致。

18Spring的依賴注入是什麼意思?給一個 Bean 的 message屬性,字符串類型,注入值爲"Hello"的 XML配置文件該怎麼寫?

19Jdo是什麼?

JDOJava對象持久化的新的規範,爲java data object的簡稱,也是一個用於存取某種數據倉庫中的對象的標準化APIJDO提供了透明的對象存儲,所以對開發人員來講,存儲數據對象徹底不須要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工做已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,由於它能夠在任何數據底層上運行。JDBC只是面向關係數據庫(RDBMSJDO更通用,提供到任何數據底層的存儲功能,好比關係數據庫、文件、XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。

20、什麼是springIOC AOP

21STRUTS的工做流程!

22springEJB的區別!!

.軟件工程與設計模式

1UML方面

標準建模語言UML。用例圖,靜態圖(包括類圖、對象圖和包圖),行爲圖,交互圖(順序圖,合做圖),實現圖。

2j2ee經常使用的設計模式?說明工廠模式。

總共23種,分爲三大類:建立型,結構型,行爲型

我只記得其中經常使用的67種,分別是:

建立型(工廠、工廠方法、抽象工廠、單例)

結構型(包裝、適配器,組合,代理)

行爲(觀察者,模版,策略)

而後再針對你熟悉的模式談談你的理解便可。 

Java中的23種設計模式:

Factory(工廠模式),     Builder(建造模式),      Factory Method(工廠方法模式),

Prototype(原始模型模式),Singleton(單例模式),   Facade(門面模式),

Adapter(適配器模式),   Bridge(橋樑模式),       Composite(合成模式),

Decorator(裝飾模式),   Flyweight(享元模式),    Proxy(代理模式),

Command(命令模式),     Interpreter(解釋器模式), Visitor(訪問者模式),

Iterator(迭代子模式),  Mediator(調停者模式),   Memento(備忘錄模式),

Observer(觀察者模式),  State(狀態模式),        Strategy(策略模式),

Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)

工 廠模式:工廠模式是一種常常被使用到的模式,根據工廠模式實現的類能夠根據提供的數據生成一組類中某一個類的實例,一般這一組類有一個公共的抽象父類而且 實現了相同的方法,可是這些方法針對不一樣的數據進行了不一樣的操做。首先須要定義一個基類,該類的子類經過不一樣的方法實現了基類中的方法。而後須要定義一個 工廠類,工廠類能夠根據條件生成不一樣的子類實例。當獲得子類的實例後,開發人員能夠調用基類中的方法而沒必要考慮到底返回的是哪個子類的實例。

3、開發中都用到了那些設計模式?用在什麼場合?

每一個模式都描述了一個在咱們的環境中不斷出現的問題,而後描述了該問題的解決方案的核心。經過這種方式,你能夠無數次地使用那些已有的解決方案,無需在重複相同的工做。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。

. j2ee部分

1BSCS的聯繫與區別。

C/SClient/Server的縮寫。服務器一般採用高性能的PC、工做站或小型機,並採用大型數據庫系統,如OracleSybaseInFORMix或 SQL Server。客戶端須要安裝專用的客戶端軟件。

B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器(Browser),如Netscape NavigatorInternet Explorer,服務器安裝OracleSybaseInFORMix或 SQL Server等數據庫。在這種結構下,用戶界面徹底經過WWW瀏覽器實現,一部分事務邏輯在前端實現,可是主要事務邏輯在服務器端實現。瀏覽器經過Web Server同數據庫進行數據交互。

C/S 與 B/S區別:

1.硬件環境不一樣:

C/S 通常創建在專用的網絡上,小範圍裏的網絡環境,局域網之間再經過專門服務器提供鏈接和數據交換服務.

B/S 創建在廣域網之上的,沒必要是專門的網絡硬件環境,例與電話上網,租用設備.信息本身管理.有比C/S更強的適應範圍,通常只要有操做系統和瀏覽器就行

2.對安全要求不一樣

C/S 通常面向相對固定的用戶羣,對信息安全的控制能力很強.通常高度機密的信息系統採用C/S結構適宜.能夠經過B/S發佈部分可公開信息.

B/S 創建在廣域網之上,對安全的控制能力相對弱,可能面向不可知的用戶。

3.對程序架構不一樣

C/S 程序能夠更加註重流程,能夠對權限多層次校驗,對系統運行速度能夠較少考慮.

B/S 對安全以及訪問速度的多重的考慮,創建在須要更加優化的基礎之上.C/S有更高的要求 B/S結構的程序架構是發展的趨勢,MS.Net系列的BizTalk 2000Exchange 2000,全面支持網絡的構件搭建的系統. SUNIBM推的JavaBean構件技術等,使 B/S更加成熟.

4.軟件重用不一樣

C/S 程序能夠不可避免的總體性考慮,構件的重用性不如在B/S要求下的構件的重用性好.

B/S 對的多重結構,要求構件相對獨立的功能.可以相對較好的重用.就入買來的餐桌能夠再利用,而不是作在牆上的石頭桌子

5.系統維護不一樣 

C/S 程序因爲總體性,必須總體考察,處理出現的問題以及系統升級.升級難.多是再作一個全新的系統

B/S 構件組成,方面構件個別的更換,實現系統的無縫升級.系統維護開銷減到最小.用戶從網上本身下載安裝就能夠實現升級.

6.處理問題不一樣

C/S 程序能夠處理用戶面固定,而且在相同區域,安全要求高需求,與操做系統相關.應該都是相同的系統

B/S 創建在廣域網上,面向不一樣的用戶羣,分散地域,這是C/S沒法做到的.與操做系統平臺關係最小.

7.用戶接口不一樣

C/S 可能是創建的Window平臺上,表現方法有限,對程序員廣泛要求較高

B/S 創建在瀏覽器上,有更加豐富和生動的表現方式與用戶交流.而且大部分難度減低,減低開發成本.

8.信息流不一樣

C/S 程序通常是典型的中央集權的機械式處理,交互性相對低

B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化,更像交易中心。

2、應用服務器與WEB SERVER的區別?

應用服務器:WeblogicTomcatJboss

WEB SERVERIIS、 Apache

3、應用服務器有那些?

BEA WebLogicServerIBM WebSphere Application ServerOracle9i ApplicationServerjBossTomcat

4J2EE是什麼?

:Je22Sun公司提出的多層(multi-diered),分佈式(distributed),基於組件(component-base)的企業級應用模型(enterpriese applicationmodel).在這樣的一個應用系統中,可按照功能劃分爲不一樣的組件,這些組件又可在不一樣計算機上,而且處於相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。

一個另類的回答:j2ee就是增刪改查。

5J2EE是技術仍是平臺仍是框架?什麼是J2EE

   J2EE自己是一個標準,一個爲企業分佈式應用的開發提供的標準平臺。

   J2EE也是一個框架,包括JDBCJNDIRMIJMSEJBJTA等技術。

6、請對如下在J2EE中經常使用的名詞進行解釋(或簡單描述)

web容器:給處於其中的應用程序組件(JSPSERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變量接口交互,沒必要關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵照J2EE規範中的WEB APPLICATION 標準。咱們把遵照以上標準的WEB服務器就叫作J2EE中的WEB容器。

EJB容器:Enterprise java bean容器。更具備行業領域特點。他提供給運行在其中的組件EJB各類管理功能。只要知足J2EE規範的EJB放入該容器,立刻就會被容器進行高效率的管理。而且能夠經過現成的接口來得到系統級別的服務。例如郵件服務、事務管理。

JNDI:(Java Naming & Directory InterfaceJAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下本身的索引,從而知足快速查找和定位分佈式應用程序的功能。

JMS:(Java Message ServiceJAVA消息服務。主要實現各個應用程序之間的通信。包括點對點和廣播。

JTA:(Java Transaction APIJAVA事務服務。提供各類分佈式事務服務。應用程序只需調用其提供的接口便可。

JAF:(Java Action FrameWorkJAVA安全認證框架。提供一些安全控制方面的框架。讓開發者經過各類部署和自定義實現本身的個性安全控制策略。

RMI/IIOP:Remote Method Invocation /internet對象請求中介協議)他們主要用於經過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,咱們能夠在本地計算機上實現對其直接調用。固然這是要經過必定的規範才能在異構的系統之間進行通訊。RMIJAVA特有的。

7、如何給weblogic指定大小的內存?

(這個問題不做具體回答,列出來只是告訴讀者可能會遇到什麼問題,你不須要面面俱到,什麼都精通。)

在啓動Weblogic的腳本中(位於所在Domian對應服務器目錄下的startServerName),增長set MEM_ARGS=-Xms32m-Xmx200m,能夠調整最小內存爲32M,最大200M

8、如何設定的weblogic的熱啓動模式(開發模式)與產品發佈模式?

能夠在管理控制檯中修改對應服務器的啓動模式爲開發或產品模式之一。或者修改服務的啓動文件或者commenv文件,增長setPRODUCTION_MODE=true

9、如何啓動時不需輸入用戶名與密碼?

修改服務啓動文件,增長 WLS_USERWLS_PW項。也能夠在boot.properties文件中增長加密過的用戶名和密碼.

10、在weblogic管理制臺中對一個應用域(或者說是一個網站,Domain)進行jmsejb或鏈接池等相關信息進行配置後,實際保存在什麼文件中?

保存在此Domainconfig.xml文件中,它是服務器的核心配置文件。

11、說說weblogic中一個Domain的缺省目錄結構?好比要將一個簡單的helloWorld.jsp放入何目錄下,然的在瀏覽器上就可打入http://主機:端口號//helloword.jsp就能夠看到運行結果了?又好比這其中用到了一個本身寫的javaBean該如何辦?

Domain目錄服務器目錄applications,將應用目錄放在此目錄下將能夠做爲應用訪問,若是是Web應用,應用目錄須要知足Web應用目錄要求,jsp文件能夠直接放在應用目錄中,Javabean須要放在應用目錄的WEB-INF目錄的classes目錄中,設置服務器的缺省應用將能夠實如今瀏覽器上無需輸入應用名。

12、在weblogic中發佈ejb需涉及到哪些配置文件

不一樣類型的EJB涉及的配置文件不一樣,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP實體Bean通常還須要weblogic-cmp-rdbms-jar.xml

13、如何在weblogic中進行ssl配置與客戶端的認證配置或說說j2ee(標準)進行ssl的配置?

缺省安裝中使用DemoIdentity.jksDemoTrust.jks KeyStore實現SSL,須要配置服務器使用Enable SSL,配置其端口,在產品模式下須要從CA獲取私有密鑰和數字證書,建立identitytrust keystore,裝載得到的密鑰和數字證書。能夠配置此SSL鏈接是單向仍是雙向的。

14、如何查看在weblogic中已經發布的EJB?

能夠使用管理控制檯,在它的Deployment中能夠查看全部已發佈的EJB

. EBJ部分

1EJB是基於哪些技術實現的?並說出SessionBeanEntityBean的區別,StatefulBeanStatelessBean的區別。

   EJB包括Session BeanEntity BeanMessage Driven Bean,基於JNDIRMIJAT等技術實現。

SessionBeanJ2EE應用程序中被用來完成一些服務器端的業務操做,例如訪問數據庫、調用其餘EJB組件。EntityBean被用來表明應用系統中用到的數據。

對於客戶機,SessionBean是一種非持久性對象,它實現某些在服務器上運行的業務邏輯。

對於客戶機,EntityBean是一種持久性對象,它表明一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現有企業應用程序實現的實體。

SessionBean 還能夠再細分爲 Stateful Session Bean與 Stateless SessionBean,這兩種的 Session Bean均可以將系統邏輯放在 method之中執行,不一樣的是 StatefulSessionBean能夠記錄呼叫者的狀態,所以一般來講,一個使用者會有一個相對應的 Stateful SessionBean的實體。Stateless SessionBean雖然也是邏輯組件,可是他卻不負責記錄使用者狀態,也就是說當使用者呼叫 Stateless SessionBean的時候,EJB Container並不會找尋特定的 Stateless SessionBean的實體來執行這個 method。換言之,極可能數個使用者在執行某個 Stateless SessionBean的 methods時,會是同一個 Bean的 Instance在執行。從內存方面來看, StatefulSessionBeanStatelessSessionBean比較, Stateful SessionBean會消耗 J2EE Server較多的內存,然而StatefulSessionBean的優點卻在於他能夠維持使用者的狀態。

2、簡要講一下 EJB的 7個 Transaction Level?

3EJBJAVA BEAN的區別?

Java Bean 是可複用的組件,對Java Bean並無嚴格的規範,理論上講,任何一個Java類均可以是一個Bean。但一般狀況下,因爲Java Bean是被容器所建立(如Tomcat)的,因此Java Bean應具備一個無參的構造器,另外,一般Java Bean還要實現Serializable接口用於實現Bean的持久性。Java Bean實際上至關於微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise Java Bean至關於DCOM,即分佈式組件。它是基於Java的遠程方法調用(RMI)技術的,因此EJB能夠被遠程訪問(跨進程、跨計算機)。但EJB必須被佈署在諸如WebspereWebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是經過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所建立和管理。客戶經過容器來訪問真正的EJB組件。

4EJB包括(SessionBean,EntityBean)說出他們的生命週期,及如何管理事務的?

SessionBeanStateless Session Bean的生命週期是由容器決定的,當客戶機發出請求要創建一個Bean的實例時,EJB容器不必定要建立一個新的Bean的實例供客戶機調用,而是隨便找一個現有的實例提供給客戶機。當客戶機第一次調用一個Stateful SessionBean 時,容器必須當即在服務器中建立一個新的Bean實例,並關聯到客戶機上,之後此客戶機調用Stateful SessionBean的方法時容器會把調用分派到與此客戶機相關聯的Bean實例。

EntityBeanEntity Beans能存活相對較長的時間,而且狀態是持續的。只要數據庫中的數據存在,Entity beans就一直存活。而不是按照應用程序或者服務進程來講的。即便EJB容器崩潰了,Entity beans也是存活的。Entity Beans生命週期可以被容器或者 Beans本身管理。

EJB經過如下技術管理實務:對象管理組織(OMG)的對象實務服務(OTS),Sun MicrosystemsTransaction ServiceJTS)、Java TransactionAPIJTA),開發組(X/Open)的XA接口。

5EJB容器提供的服務

主要提供聲明週期管理、代碼產生、持續性管理、安全、事務管理、鎖和併發行管理等服務。

6EJB的激活機制

Stateful Session Bean爲例:其Cache大小決定了內存中能夠同時存在的Bean實例的數量,根據MRUNRU算法,實例在激活和去激活狀態之間遷移,激活機制是當客戶端調用某個EJB實例業務方法時,若是對應EJB Object發現本身沒有綁定對應的Bean實例則從其去激活Bean存儲中(經過序列化機制存儲實例)回覆(激活)此實例。狀態變遷前會調用對應的ejbActiveejbPassivate方法。

7EJB的幾種類型

會話(SessionBean,實體(EntityBean消息驅動的(Message DrivenBean

會話Bean又可分爲有狀態(Stateful)和無狀態(Stateless)兩種

實體Bean可分爲Bean管理的持續性(BMP)和容器管理的持續性(CMP)兩種

8、客服端調用EJB對象的幾個基本步驟

設置JNDI服務工廠以及JNDI服務地址系統屬性,查找Home接口,從Home接口調用Create方法建立Remote接口,經過Remote接口調用其業務方法。

十一. webservice部分

1WEB SERVICE名詞解釋。JSWDL開發包的介紹。JAXPJAXM的解釋。SOAPUDDI,WSDL解釋。

Web ServiceWebService是基於網絡的、分佈式的模塊化組件,它執行特定的任務,遵照具體的技術規範,這些規範使得Web Service能與其餘兼容的組件進行互操做。

JAXP(Java APIfor XML Parsing) 定義了在Java中使用DOM, SAX, XSLT的通用的接口。這樣在你的程序中你只要使用這些通用的接口,當你須要改變具體的實現時候也不須要修改代碼。

JAXM(Java APIfor XML Messaging) 是爲SOAP通訊提供訪問方法和傳輸機制的API

WSDL是一種 XML格式,用於將網絡服務描述爲一組端點,這些端點對包含面向文檔信息或面向過程信息的消息進行操做。這種格式首先對操做和消息進行抽象描述,而後將其綁定到具體的網絡協議和消息格式上以定義端點。相關的具體端點即組合成爲抽象端點(服務)。

SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用於交換XML編碼信息的輕量級協議。

UDDI 的目的是爲電子商務創建標準;UDDI是一套基於Web的、分佈式的、爲Web Service提供的、信息註冊中心的實現標準規範,同時也包含一組使企業能將自身提供的Web Service註冊,以使別的企業可以發現的訪問協議的實現標準。

2CORBA是什麼?用途是什麼?

CORBA 標準是公共對象請求代理結構(Common Object Request BrokerArchitecture),由對象管理組織 (Object ManagementGroup,縮寫爲 OMG)標準化。它的組成是接口定義語言(IDL),語言綁定(binding:也譯爲聯編)和容許應用程序間互操做的協議。其目的爲:用不一樣的程序設計語言書寫在不一樣的進程中運行,爲不一樣的操做系統開發。

3. Linux

4LINUX下線程,GDI類的解釋。

LINUX實現的就是基於核心輕量級進程的"一對一"線程模型,一個線程實體對應一個核心輕量級進程,而線程之間的管理在覈外函數庫中實現。

GDI類爲圖像設備編程接口類庫。

5. 問得稀裏糊塗的題

6、四種會話跟蹤技術

會話做用域ServletsJSP頁面描述

page否是表明與一個頁面相關的對象和屬性。一個頁面由一個編譯好的 Java servlet類(能夠帶有任何的include指令,可是沒有 include動做)表示。這既包括 servlet又包括被編譯成 servlet的 JSP頁面

request是是表明與 Web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件(因爲 forward指令和 include動做的關係)

session是是表明與用於某個 Web客戶機的一個用戶體驗相關的對象和屬性。一個 Web會話能夠也常常會跨越多個客戶機請求

application是是表明與整個 Web應用程序相關的對象和屬性。這實質上是跨越整個 Web應用程序,包括多個頁面、請求和會話的一個全局做用域

7、簡述邏輯操做(&,|,^)與條件操做(&&,||)的區別。

區別主要答兩點:a.條件操做只能操做布爾型的,而邏輯操做不只能夠操做布爾型,並且能夠操做數值型

b.邏輯操做不會產生短路

十二.其餘

1、請用英文簡單介紹一下本身.

4WEB SERVICE名詞解釋。JSWDL開發包的介紹。JAXPJAXM的解釋。SOAPUDDI,WSDL解釋。

2、請把http://tomcat.apache.org/ 首頁的這一段話用中文翻譯一下?

Apache Tomcat isthe servlet container that is used in the officialReference Implementation fortheJava ServletandJavaServerPages technologies. The Java Servlet andJavaServer Pagesspecifications are developed by Sun under theJavaCommunity Process.

Apache Tomcat isdeveloped in an open andparticipatory environment and released under theApacheSoftware License. Apache Tomcat is intended to be acollaboration ofthe best-of-breed developers from around the world. We inviteyou toparticipate in this open development project. To learn more aboutgettinginvolved,click here.

ApacheTomcatpowers numerous large-scale, mission-critical web applications across adiverserange of industries and organizations. Some of these users and theirstories arelisted on thePoweredBy wiki page.

3美資軟件公司JAVA工程師電話面試題目

1. Talk aboutoverriding, overloading.
2. Talk about JAVA design patterns you known.
3. Talk about the difference between LinkList, ArrayList and Victor.
4. Talk about the difference between an Abstract class and an Interface.
5. Class a = new Class(); Class b = new Class();
if(a == b) returns true or false, why?
6. Why we use StringBuffer when concatenating strings?
7. Try to explain Singleton to us? Is it thread safe? If no, how to makeitthread safe?
8. Try to explain Ioc?
9. How to set many-to-many relationship in Hibernate?
10. Talk about the difference between INNER JOIN and LFET JOIN.
11. Why we use index in database? How many indexes is the maximum in onetableas your suggestion?
12. When Final’ is used in class, method and property,what dose it mean?
13. Do you have any experience on XML? Talk about any XML tool youused ,e.g.JAXB, JAXG.
14. Do you have any experience on Linux?
15. In OOD what is the reason when you create a Sequence diagram?

Administrator10:34:20

1,堆和棧的區別,有一個64k的字符串,是放到堆上,仍是放到棧上,爲何?

2,何時用到接口,何時用到抽象類,兩者區別

3,有一個100萬的數組,裏邊有兩個市重複的,如何設計算法找到。

4,設計數據庫時,n維,如何設計。

例如[省份][城市][網吧],這是三維關係,它的表也應該有三個,網吧有外鍵引用城市,城市有外鍵應用省份,這個規律就是下層的要有一外鍵去引用上層。javaipu ttyn

相關文章
相關標籤/搜索