java基礎知識點整理
1.&和 && 的區別?
&:邏輯與( and ) , 運算子兩邊的表示式均為 true 時,整個結果才為 true 。
&&:短路與,如果第一個表示式為 false 時,第二個表示式就不會計算了。
2.在 java 中如何跳出當前的多重迴圈?
在迴圈語句外前面定義一個標號,然後在裡層迴圈體的程式碼中使用帶有標號的 break語句,即可跳出迴圈。
比如:
ok:
for(int i = 0; i < 10; i++) {
{
for(int j = 0; j < 10;j++ ) {
break ok;
}
}
}
3.最有效率的方法算出 2X8 等於幾?
使用位運算,效率最高: 2<<3,表示 2 向右移動了 3 位,就相當於 2 乘以 2 的 3 次方 , 結果: 16 。
4.”==” 和 equals方法究竟有什麼區別?
==:表示兩個變數的值是否相等,比較兩個基本資料型別的資料或者引用變數,用 == 。
equals:用於比較兩個獨立物件的內容是否相同。字串的比較也用 equals 。
5. Int和 integer 的區別?
Int是 Java 的 8 中基本資料型別之一, integer 是 int 的封裝類。 Int型別的預設值為 0 , integer 預設值為 null ,所以區別在於, integer 能區分出 null 值和 0 的區別。
6.三個與取整有關的方法:
Math.ceil():表示向上取整; Math.ceil(11.3)=12;Math.ceil(-11.3)=-12 。
Math.floor():表示向下取整; Math.floor(11.6)=12;Math.floor(-11.6)=-12 。
Math.round():表示四捨五入; Math.round(11.5)=12;Math.round(-11.5)=-11;
Marh.round(11.3)=11;Math.round(-11.3)=--11;
7.過載和重寫的區別?
過載( Overload):函式名相同,引數不同。可以改變返回值型別,引數的個數和型別。
重寫( Override):和父類的的方法名稱、引數完全相同。
8.面向物件的特徵?
封裝:將物件屬性和方法的程式碼封裝到一個模組中,也就是一個類中,保證軟體內部具有優良的模組性的基礎,實現 “高內聚,低耦合”。
抽象:找出一些事物的相似和共性之處,然後歸為一個類,該類只考慮事物的相似和共性之處。抽象包括行為抽象和狀態抽象。
繼承:在已經存在的類的基礎上進行,將其定義的內容作為自己的內容,並可以加入新的內容或者修改原來的方法適合特殊的需要。
多型:同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果,就是多型,簡單點說:就是用父類的引用指向子類的物件。目的:提高程式碼複用性,解決專案中緊耦合問題,提高可擴充套件性。
多型的機制:靠的是父類的或者介面的引用變數可以指向子類或者具體實現類的例項物件。
9.String和 StringBuffuer 、 StringBuilder 的區別?
String:字串數值不可變;
StringBuffer:字串可修改,可以動態構造字元資料。 StringBuffer 類是可以通過 Append() 來修改值。執行緒安全。
StringBuilder: 執行緒不安全。
三者在執行速度方面的比較:StringBuilder > StringBuffer > String
對於三者使用的總結:
1.如果要操作少量的資料用 = String
2.單執行緒操作字串緩衝區下操作大量資料 = StringBuilder
3.多執行緒操作字串緩衝區下操作大量資料 = StringBuffer
10.java中有幾種方法實現一個執行緒?用什麼關鍵字修飾同步方法? stop() 和 suspend() 方法為何不推薦使用?
第一種:繼承 Thread類。 New Thread(){}.start():表示呼叫子類物件的 run 方法。
第二種:實現 Runable介面。
第三種:執行緒池建立多執行緒。
第四種:實現 Callable介面,重寫 call 函式 (
繼承 Thread類實現多執行緒 , 重寫 run方法時沒有返回值也不能丟擲異常 , 使用 Callable介面就可以解決這個問題 。
Callable介面和 Runnable 介面的不同之處:
1.Callable規定的方法是 call ,而 Runnable 是 run
2.call方法可以丟擲異常,但是 run 方法不行
3.Callable物件執行後可以有返回值,執行 Callable 任務可以得到一個 Future 物件,通過 Future 物件可以瞭解任務執行情況,可以取消任務的執行,而 Runnable 不可有返回值
)
用 synchronized關鍵字修飾同步方法。
反對使用 stop(),是因為它不安全。它會解除由執行緒獲取的所有鎖定,而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們,結果很難檢查出真正的問題所在。
suspend()方法容易發生死鎖。呼叫 suspend() 的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被 " 掛起 " 的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用 suspend() ,而應在自己的 Thread 類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用 wait() 命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個 notify() 重新啟動執行緒。
11.sleep()和 wait() 有什麼區別?
sleep是執行緒被呼叫時,佔著 cpu 休眠,其他執行緒不能佔用 cpu , os 認為該執行緒正在工作,不會讓出系統資源, wait 是進入等待池等待,讓出系統資源,其他執行緒可以佔用 cpu 。
sleep()和wait()方法的區別可從兩個角度闡述:
1.cpu的搶佔權;2.鎖旗標是否釋放
兩者都會釋放cpu的搶佔權;
wait()方法執行完即可釋放鎖旗標,進入執行緒的等待佇列;
sleep()執行完,不會釋放,進入等待佇列;
12.同步和非同步的區別?同步的實現方法?
同步 :傳送一個請求 , 等待返回 , 然後再發送下一個請求。實現: 1. Synchronized修飾; 2.wait 和 notify 。
非同步 :傳送一個請求 , 不等待返回 ,隨時可以再發送下一個請求
。
同步可以避免出現死鎖 ,讀髒資料的發生,一般共享某一資源的時候用,如果每個人都有修改許可權,同時修改一個檔案,有可能使一個人讀取另一個人已經刪除的內容,就會出錯,同步就會按順序來修改。
同步和非同步最大的區別就在於,一個需要等待,一個不需要等待。
比如廣播,就是一個非同步例子。發起者不關心接收者的狀態。不需要等待接收者的返回資訊。
電話,就是一個同步例子。發起者需要等待接收者,接通電話後,通訊才開始。需要等待接收者的返回資訊。
13. 請對比 synchronized與 java.util.concurrent.locks.Lock 的異同 ?
主要相同點: Lock能完成 synchronized 所實現的所有功能
主要不同點: Lock有比 synchronized 更精確的執行緒語義和更好的效能。 synchronized 會自動釋放鎖,而 Lock 一定要求程式員手工釋放,並且必須在 finally從句中釋放。
14.String s =new String (“syz” );建立了幾個 String Object?
1.如果 String 常理池 ( 常量緩衝區 ) 中,已經建立 "xyz" ,則不會繼續建立,此時只建立了一個物件 new String("xyz") ;
2.如果 String 常理池中,沒有建立 "xyz" ,則會建立兩個物件,一個物件的值是 "xyz" ,一個物件 new String("xyz") 。
15.作用域 public 、 private 、 protected 以及不寫時的區別?
private修飾的成員變數和函式只能在類本身和內部類中被訪問。
protected修飾的成員變數和函式能被類本身、子類及同一個包中的類訪問。
public修飾的成員變數和函式可以被類、子類、同一個包中的類以及任意其他類訪問。
預設情況(不寫)下,屬於一種包 訪問,即能被類本身以及同一個包中的類 訪問。
作用域 |
當前類 |
同一package |
子孫類 |
其他package |
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
× |
friendly |
√ |
√ |
× |
× |
private |
√ |
× |
× |
× |
16.forward和 redirect 兩種跳轉方式的區別?
1.從位址列顯示來說
forward是伺服器請求資源 , 伺服器直接訪問目標地址的 URL, 把那個 URL 的響應內容讀取過來 , 然後把這些內容再發給瀏覽器 . 瀏覽器根本不知道伺服器傳送的內容從哪裡來的 , 所以它的位址列還是原來的地址 .
redirect是服務端根據邏輯 , 傳送一個狀態碼 , 告訴瀏覽器重新去請求那個地址 . 所以位址列顯示的是新的 URL.
2.從資料共享來說
forward:轉發頁面和轉發到的頁面可以共享 request 裡面的資料 .
redirect:不能共享資料 .
3.從運用地方來說
forward:一般用於使用者登陸的時候 , 根據角色轉發到相應的模組 .
redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等 .
4.從效率來說
forward:高 .
redirect:低 .
本質上說 , 轉發是伺服器行為,重定向是客戶端行為。其工作流程如下:
轉發過程:客戶瀏覽器傳送 http請求 ---- 》 web 伺服器接受此請求 -- 》呼叫內部的一個方法在容器內部完成請求處理和轉發動作 ---- 》將目標資源傳送給客戶;在這裡,轉發的路徑必須是同一個 web 容器下的 url ,其不能轉向到其他的 web 路徑上去,中間傳遞的是自己的容器內的 request 。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
重定向過程:客戶瀏覽器傳送 http請求 ---- 》 web 伺服器接受後傳送 302 狀態碼響應及對應新的 location 給客戶瀏覽器 -- 》客戶瀏覽器發現是 302 響應,則自動再發送一個新的 http 請求,請求 url 是新的 location 地址 ---- 》伺服器根據此請求尋找資源併發送給客戶。在這裡 location 可以重定向到任意 URL ,既然是瀏覽器重新發出了請求,則就沒有什麼 request 傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。
18.程式設計單例模式:寫一個 singleton 出來
S ingleton分為:飽漢模式、飢漢模式、雙重鎖模式 |
//飽漢模式: 類載入時完成初始化,創建出例項物件(不管用不用,先建立)。 publicclass SingleTon { //例項化物件放到靜態程式碼塊中,可提高執行效率,但是可能更佔用空間 privatefinal static SingleToninstence =new SingleTon(); private SingleTon(){};//私有的建構函式 //獲取方法 publicstatic SingleTon getinstance(){ return instence ; }; } |
//飢漢模式: 延遲載入,在第一次用的時候才創建出物件,存線上程安全問題。 publicclass SingleTon { privatestatic SingleToninstence =null ; private SingleTon(){};//私有的建構函式 //獲取方法 publicstatic synchronized SingleTon getinstance(){ if(instence ==null ){ //第一次使用的時候建立物件 instence =new SingleTon(); } returninstence ; }; } |
19.程式設計氣泡排序:用 java 實現氣泡排序?快速排序的方法。
氣泡排序:
inttemp = 0;
int[] sortNum = {12,33,28,86,15,62,9,38};
for(int i = 0; i < sortNum.length-1; i++) { //第一個 for 迴圈控制排序要走多少趟,最多做 n-1 趟排序
for(int j = 0; j < sortNum.length-1-i; j++) { //第 2 個 for 迴圈控制每趟比較多少次
if(sortNum[j+1]<sortNum[j]){ //大的 往後面排
temp = sortNum[j];
sortNum[j] = sortNum[j+1];
sortNum[j+1] = temp;
}
}
}
System.out .println(Arrays.toString (sortNum));
1.對基本資料型別陣列的排序
1>數字排序:
int[] intArray =new int []{1,56,-5,33};
Arrays.sort (intArray);
System.out .println(Arrays.toString (intArray));
2>字串排序 ( 先大寫後小寫 ) :
String[] strArray =new String[]{"Z", "a", "D"};
Arrays.sort (strArray);
System.out .println(Arrays.toString (strArray));
20.H ashMap和 Hashtable 的區別?
HashMap:實現了 Map 介面,允許空 (null) 鍵值 (key), 由於非執行緒安全,在只有一個執行緒訪問的情況下,效率高於 Hashtable 。
Hashtable:不能將 null 作為 key 或者 value 。方法是同步的,執行緒安全。
21.List、 Set 和 Map 的區別?
List:是儲存單列資料的集合,儲存有順序,允許重複。繼承 Collection 介面。
Set:是儲存單列資料的集合。繼承 Collection 介面。不允許重複。
Map:儲存鍵和值這樣的雙列資料的集合,儲存資料無順序,鍵 (key) 不能重複,值 (value) 。可以重複。
22.什麼時候用 assert ?
在除錯程式時使用,對一個 boolean表示式進行檢查。為 true ,則程式正確,如果為 false ,系統則給出警告或者退出。
23.使用 java.lang.Math, 生成 100 個 0 到 99 之間的隨機整數,找出最大和最小,並統計大於 50 的整數個數?
importjava.util.Random; publicclass RandomTest { publicstatic void main(String args[]) { intmax = 0; intmin = 0; String sum=""; intnum=0; for(int i = 0; i <= 100; i++) { Random rand =new Random(); intr = rand.nextInt(99); if(r >= max) { max = r; }else if (r < min) { min = r; } String s= ""+r; if(r > 50) { sum=sum+s+","; ++num; } } System.out .println("最大數 max=" + max + "\n" + "最小數 min=" + min); System.out .println("大於 50 的個數: " +num); } } |
備註:Random rand =new Random(); intr = rand.nextInt(99); 表示產生的隨機數為0- 99的整數, 不包括 99。 |
24.java建立物件的方式有哪些?
1.使用 new 關鍵字
2.使用反射機制建立物件:
(1)使用 Class 類的 newInstance 方法
(2)java.lang.reflect.Constructor類裡也有一個 newInstance 方法可以建立物件。
3.使用 clone 方法:先實現 Cloneable 介面並實現其定義的 clone 方法
4.使用反序列化
25.java垃圾回收機制
GC是垃圾回收機制,是用來釋放記憶體中的資源的。
垃圾回收可以有效的防止記憶體洩露,有效的使用空閒的記憶體。
26.error和 exception 有什麼區別 ?
Error(錯誤)表示系統級的錯誤和程式不必處理的異常,是 java 執行環境中的內部錯誤或者硬體問題。比如:記憶體資源不足等。對於這種錯誤,程式基本無能為力,除了退出執行外別無選擇,它是由 Java 虛擬機器丟擲的。
Exception(違例)表示需要捕捉或者需要程式進行處理的異搜尋常,它處理的是因為程式設計的瑕疵而引起的問題或者在外的輸入等引起的一般性問題,是程式必須處理的。
Exception又分為執行時異常,受檢查異常。
執行時異常,表示無法讓程式恢復的異常,導致的原因通常是因為執行了錯誤的操作,建議終止程式,因此,編譯器不檢查這些異常。
受檢查異常,是表示程式可以處理的異常,也即表示程式可以修復(由程式自己接受異常並且做出處理), 所以稱之為受檢查異常。
27.Int如何去重複?
1.For迴圈
2.Set集合
28.JDBC使用步驟過程?
1、載入 JDBC 驅動程式:
2、提供 JDBC 連線的 URL
3、建立資料庫的連線
4、建立一個 Statement
5、執行 SQL 語句
6、處理結果
7、關閉 JDBC 物件
29.執行時異常與一般異常有何異同?
Java提供了兩類主要的異常 : 執行時異常 runtime exception 和一般異常 checked exception 。對於後者這種一般異常, JAVA 要求程式設計師對其進行 catch 處理。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆 catch 塊去處理可能的異常。
執行時異常我們可以不處理。這樣的異常由虛擬機器接管。出現執行時異常後,系統會把異常一直往上層拋,一直遇到處理程式碼。如果不對執行時異常進行處理,那麼出現執行時異常之後,要麼是執行緒中止,要麼是主程式終止。
30.抽象類和介面區別 ?
抽象類:用 abstract修飾,抽象類不能建立例項物件。抽象方法必須在子類中實現,不能有 抽象構造方法 或者抽象靜態方法 。
介面:抽象類的一種特例,介面中的方法必須是抽象的。
兩者的區別:
- 抽象類可以有構造方法,介面沒有構造方法
- 抽象類可以有普通成員變數,介面沒有普通成員變數。
- 抽象類可以有非抽象的普通方法,介面中的方法必須是抽象的。
- 抽象類中的抽象方法訪問型別可以是 public, protected ,介面中抽閒方法必須是 public 型別的。
- 抽象類可以包含靜態方法,介面中不能包含靜態方法。
- 一個類可以實現多個介面,但是隻能繼承一個抽象類。
7.介面中基本資料型別的資料成員,都預設為 static 和 final ,抽象類則不是。
31.如何獲取 map 集合中的資料?
//方法一: for each + map.keySet(); Set<Integer> set = map.keySet(); for (Integer key : set) { System.out.println("key:" + key + ", value:" + map.get(key)); } |
//方法二: while 迴圈 (Iterator + map.keySet();) Set<Integer> set = map.keySet(); Iterator<Integer> it = set.iterator(); while(it.hasNext()){ Integer key = it.next(); System.out.println("key:" + key + ", value:" + map.get(key)); } |
//方法三: while 迴圈 (Iterator +Map.Entry<Key, Value>) Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<Integer, String> entry = it.next(); System.out.println("key:"+entry.getKey() + ", value:"+entry.getValue()); } |
//方法四: for 迴圈 (Iterator + Map.Entry<Key, Value>) for(Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); it.hasNext();){ Map.Entry<Integer, String> entry = it.next(); System.out.println("key:" + entry.getKey() + ", value:" +entry.getValue()); } |
//方法五: for each + Map.Entry<Key, Value> for(Map.Entry<Integer, String> entry : map.entrySet()){ System.out.println("key:" + entry.getKey() + ", value:" +entry.getValue()); } |
32.hashCode與 equals 的區別與聯絡?
一、 equals方法的作用
1、預設情況(沒有覆蓋 equals 方法)下 equals 方法都是呼叫 Object 類的 equals 方法,而 Object 的 equals 方法主要用於判斷物件的記憶體地址引用是不是同一個地址(是不是同一個物件)。
2、要是類中覆蓋了 equals 方法,那麼就要根據具體的程式碼來確定 equals 方法的作用了,覆蓋後一般都是通過物件的內容是否相等來判斷物件是否相等。
二、Hashcode()方法:
1、 我們並沒有覆蓋 equals方法只覆蓋了 hashCode 方法,兩個物件雖然 hashCode 一樣,但在將 stu1 和 stu2 放入 set 集合時由於 equals 方法比較的兩個物件是 false ,所以就沒有在比較兩個物件的 hashcode 值。
2、 覆蓋一下 equals方法和 hashCode 方法 , stu1和 stu2 通過 equals 方法比較相等,而且返回的 hashCode 值一樣,所以放入 set 集合中時只放入了一個物件。
3、 我們讓兩個物件 equals方法比較相等,但 hashCode 值不相等試試 , 雖然 stu1和 stu2 通過 equals 方法比較相等,但兩個物件的 hashcode 的值並不相等,所以在將 stu1 和 stu2 放入 set 集合中時認為是兩個不同的物件。
總結:
1、 equals 方法用於比較物件的內容是否相等(覆蓋以後)
2、 hashcode 方法只有在集合中用到
3、當覆蓋了 equals 方法時,比較物件是否相等將通過覆蓋後的 equals 方法進行比較(判斷物件的內容是否相等)。
4、將物件放入到集合中時,首先判斷要放入物件的 hashcode 值與集合中的任意一個元素的 hashcode 值是否相等,如果不相等直接將該物件放入集合中。如果 hashcode 值相等,然後再通過 equals 方法判斷要放入物件與集合中的任意一個物件是否相等,如果 equals 判斷不相等,直接將該元素放入到集合中,否則不放入。
33.Java中什麼是競態條件 ?
當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的程式碼區稱作臨界區。在臨界區中使用適當的同步就可以避免競態條件。 界區實現方法有兩種,一種是用 synchronized,一種是用 Lock 顯式鎖實現。
34.執行緒死鎖及解決辦法
1)、 讓所有的執行緒按照同樣的順序獲得一組鎖。 這種方法消除了 X和 Y 的擁有者分別等待對方的資源的問題。
2)、 將多個鎖組成一組並放到同一個鎖下。 前面 Java執行緒死鎖的例子中,可以建立一個銀器物件的鎖。於是在獲得刀或叉之前都必須獲得這個銀器的鎖。
3)、 將那些不會阻塞的可獲得資源用變數標誌出來。當某個執行緒獲得銀器物件的鎖時,就可以通過檢查變數來判斷是否整個銀器集合中的物件鎖都可獲得。如果是,它就可以獲得相關的鎖,否則,就要釋放掉銀器這個鎖並稍後再嘗試。
35.ArrayList和 LinkList 的區別
1.ArrayList是實現了基於動態陣列的資料結構, LinkedList 基於連結串列的資料結構。
2.對於隨機訪問 get 和 set , ArrayList 覺得優於 LinkedList ,因為 LinkedList 要移動指標。
3.對於新增和刪除操作 add 和 remove , LinedList 比較佔優勢,因為 ArrayList 要移動資料,而查詢和修改 ArrayList 佔優勢。
36.S ocket和 HTTP 區別?
socket則是對 TCP/IP 協議的封裝和應用 ( 程式設計師層面上 ) , Socket本身並不是協議,而是一個呼叫介面 (API) 。也可以說, TPC/IP 協議是傳輸層協議,主要解決資料如何在網路中傳輸,而 HTTP 是應用層協議,主要解決如何包裝資料。
37.BS與 CS 的聯絡與區別?
C/S與 B/S 區別:
( bs面向龐大、不同群體、不同平臺的客戶 ;cs 面向比較單一的客戶)
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 2000 Exchange 2000 等 , 全面支援網路的構件搭建的系統 . SUN 和 IBM 推的 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 等資訊、流向的變化 , 更像交易中心。
38.多執行緒中 thread 的 start ()和 run() 的區別?
1) start :
用 start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待 run 方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫 Thread 類的 start() 方法來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到 cpu 時間片,就開始執行 run() 方法,這裡方法 run() 稱為執行緒體,它包含了要執行的這個執行緒的內容, Run 方法執行結束,此執行緒隨即終止。
2) run :
run()方法只是類的一個普通方法而已,如果直接呼叫 Run 方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待 run 方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。總結:呼叫 start 方法方可啟動執行緒,而 run 方法只是 thread 的一個普通方法呼叫,還是在主執行緒裡執行。這兩個方法應該都比較熟悉,把需要並行處理的程式碼放在 run() 方法中, start() 方法啟動執行緒將自動呼叫 run() 方法,這是由 jvm 的記憶體機制規定的。並且 run() 方法必須是 public 訪問許可權,返回值 型別為 void。
39.final關鍵字的用法
一、 final修飾類:
被 final修飾的類,是不可以被繼承的,這樣做的目的可以保證該類不被修改, Java 的一些核心的 API 都是 final 類,例如 String 、 Integer 、 Math 等。
二、 final修飾方法:
子類不可以重寫父類中被 final修飾的方法。
三、 final修飾例項變數 ( 類的屬性,定義在類內,但是在類內的方法之外 )
final修飾例項變數時必須初始化,且不可再修改。 //
四、 final修飾區域性變數 ( 方法體內的變數 )
final修飾區域性變數時只能初始化 ( 賦值 ) 一次,但也可以不初始化。
五、 final修飾方法引數
final修飾方法引數時,是在呼叫方法傳遞引數時候初始化的。