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.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出來
Singleton分為:飽漢模式、飢漢模式、雙重鎖模式 |
//飽漢模式:類載入時完成初始化,創建出例項物件(不管用不用,先建立)。 public class SingleTon { //例項化物件放到靜態程式碼塊中,可提高執行效率,但是可能更佔用空間 private final static SingleTon instence=new SingleTon(); private SingleTon(){};//私有的建構函式 //獲取方法 public static SingleTon getinstance(){ return instence; }; } |
//飢漢模式:延遲載入,在第一次用的時候才創建出物件,存線上程安全問題。 public class SingleTon { private static SingleTon instence=null; private SingleTon(){};//私有的建構函式 //獲取方法 public static synchronized SingleTon getinstance(){ if(instence==null){ //第一次使用的時候建立物件 instence=new SingleTon(); } return instence; }; } |
19.程式設計氣泡排序:用java實現氣泡排序?快速排序的方法。
氣泡排序:
int temp = 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.HashMap和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的整數個數?
import java.util.Random; public class RandomTest { public static void main(String args[]) { int max = 0; int min = 0; String sum=""; int num=0; for (int i = 0; i <= 100; i++) { Random rand = new Random(); int r = 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(); int r = 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.Socket和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 程式由於整體性, 必須整體考