一、小策略
1、說區別的時候,先單獨說出每一個的特性,再列出相同點即可。
2、當遇到自己不太擅長的問題的時候,一定不要慌張,想法設法的往自己熟悉的地方帶,比如說問到快速排序算法時,自己不是特別的懂,就可以說自己比較瞭解簡單的二分算法和冒泡排序算法。
二、基礎面試題
1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什麼限制?
可以有多個類,但只能有一個public的類,並且public的類名必須與文件名相一致。
2、Java有沒有goto?
java中的保留字,現在沒有在java中使用。
3、說說&和&&的區別?
- &和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,否則,只要有一方爲false,則結果爲false。
- &&還具有短路的功能,即如果第一個表達式爲false,則不再計算第二個表達式,例如,對於if(str != null && !str.equals(“”))表達式,當str爲null時,後面的表達式不會執行,所以不會出現NullPointerException如果將&&改爲&,則會拋出NullPointerException異常。If(x==33 & ++y>0) y會增長,If(x==33 && ++y>0)不會增長
- &還可以用作位運算符,當&操作符兩邊的表達式不是boolean類型時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果爲0x01。
備註:這道題先說兩者的共同點,再說出&&和&的特殊之處,並列舉一些經典的例子來表明自己理解透徹深入、實際經驗豐富。
4、啓動一個線程是用run()還是start()? .
啓動一個線程是調用start()方法,使線程就緒狀態,以後可以被調度爲運行狀態,一個線程必須關聯一些具體的執行代碼,run()方法是該線程所關聯的執行代碼。
5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一個整數表達式或者枚舉常量(更大字體),整數表達式可以是int基本類型或Integer包裝類型,由於,byte,short,char都可以隱含轉換爲int,所以,這些類型以及這些類型的包裝類型也是可以的。jdk1.7版本後switch可以作用再String上面,依舊不能作用在long上面。
6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
- 對於short s1 = 1; s1 = s1 + 1; 由於s1+1運算時會自動提升表達式的類型,所以結果是int型,再賦值給short類型s1時,編譯器將報告需要強制轉換類型的錯誤。正確爲s1=(short)(s1+1
- 對於short s1 = 1; s1 += 1;由於 += 是java語言規定的運算符,java編譯器會對它進行特殊處理,因此可以正確編譯。
7、char型變量中能不能存貯一箇中文漢字?爲什麼?
- 可以存儲,因爲java中使用的編碼是Unicode編碼,一個char類型佔2個字節(16bit),放一箇中文漢字是沒有問題的。
- Unicode編碼:不選擇任何特定的編碼,直接使用字符在字符集中的編碼,這是統一的唯一方法。
8、用最有效率的方法算出2乘以8等於幾?
2 << 3
因爲將一個數左移n位,就相當於乘以了2的n次方,那麼,一個數乘以8只要將其左移3位即可,而位運算cpu直接支持的,效率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。
9、使用final關鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變?
使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容還是可以改變的。
10、重載(Overloading)和重寫(Override)的區別
- 重載(Overloading):多個同名函數同時存在,參數類型和參數個數不通,返回值類型可同可不同,統一方式處理不同類型的數據。這也是java特性中多態性的一種體現,一個類中的多態性。
- 重寫(Override):子類中重新父類的方法,也叫做方法覆蓋,方法名與父類相同,參數返回類型相同,子類的修飾權限不能夠低於父類不同類之間多態的體現。
11、"=="和equals的區別
- “==”: 比較變量值是否相等(數值) 相當於比較的是地址
- “equals”: 兩個獨立對象的內容是否相同 比較的是內容
舉個例子
String a = new String(“abc”)
String b = new String(“abc”)
a==b false 不同對象地址不相同
a.equals(b) true 比較的是a、b兩個字符串中的內容
12、靜態變量和實例變量的區別?
- 靜態變量:靜態變量也叫做類變量,static修飾,在類中,爲類所有,只要程序加載啦字節碼文件,不用創建實例對象就會自動的爲靜態變量分配內存空間。所有對象共有,其中一個對象將其值改變,其他對象得到的就是改變後的結果。
- 實例變量:new了對象之後,纔會分配內存空間。當前對象私有,改變其值,不會影響其他對象。
例如,對於下面的程序,無論創建多少個實例對象,永遠都只分配了一個staticVar變量,並且每創建一個實例對象,這個staticVar就會加1;但是,每創建一個實例對象,就會分配一個instanceVar,即可能分配多個instanceVar,並且每個instanceVar的值都只自加了1次。
package com.fsj;
public class Test9 {
public static int staticVar = 0;
public int instanceVar = 0;
public Test9() {
staticVar++;
instanceVar++;
System.out.println("staticVar=" + staticVar);
System.out.println("instanceVar=" + instanceVar);
}
public static void main(String[] args) {
Test9 t1 = new Test9();//staticVar=1 instanceVar=1
Test9 t2 = new Test9();//staticVar=2 instanceVar=1
}
}
13、是否可以從一個static方法內部發出對非static方法的調用?
不可以。因爲static方法的調用可以直接通過類名.方法名()調用,不用創建對象。而非static方法要與對象關聯在一起的,必須要創建對象之後纔可以在該對象上進行方法的調用,所以是不可以的。
14、Integer與int的區別?
Integer:默認值爲null
int:默認值爲0
int是java提供的8種原始數據類型之一。Integer是java爲int提供的封裝類。
15、請說出作用域public,private,protected,以及不寫時的區別?
就相當於說出java的修飾權限的區別。
作用域 | 當前類 | 同一個包 | 子孫類 | 不同包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly | √ | √ | × | × |
private | √ | × | × | × |
16、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
- Math類中提供了三個與取整有關的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應。
- ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結果爲12,Math.ceil(-11.3)的結果是-11;
- floor的英文意義是地板,該方法就表示向下取整,Math.floor(11.6)的結果爲11,Math.floor(-11.6)的結果是-12;
- round方法,它表示“四捨五入”,算法爲Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,Math.round(11.5)=12 , Math.round(-11.5)=-11。
17、構造器Constructor是否可被重寫(override)?
構造器Constructor不能被繼承,因此不能重寫Override,但可以被重載Overload。
18、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承具體類(concrete class)? 抽象類中是否可以有靜態的main方法?
- 接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承具體類。抽象類中可以有靜態的main方法。
- 只要記住抽象類與普通類的唯一區別就是不能創建實例對象和允許有abstract方法和非abstract方法。
19、abstract class和interface有什麼區別?
abstract class:abstract 類不能創建的實例對象。允許有abstract方法和非abstract方法。
interface:抽象類的一種特例,接口中的所有方法都必須是抽象的。
主要區別:
- 抽象類可以有構造方法,接口中不能有構造方法。
- 抽象類中可以有普通成員變量,接口中沒有普通成員變量。
- 抽象類中的抽象方法的訪問類型可以是public,protected和默認類型,但接口中的抽象方法只能是public類型的,並且默認即爲public abstract類型。
- 抽象類中可以包含靜態方法,接口中不能包含靜態方法。
- 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,並且默認即爲public static final類型。
20、同步和異步
- 同步:所有操作都做完,才返回給用戶,例如:銀行轉賬
- 異步:不用等所有操作都做完,就返回結果,達到局部刷新。
21、error和exception有什麼區別?
- error:表示不是不可能恢復,但是很困難的一種嚴重問題,比如說內存溢出。不能夠指望程序處理這樣的情況。
- exception:表示一種設計或者實現問題,需要捕捉或者需要進行處理的異常,處理的是程序引起的問題,程序必須處理的。
22、多線程有幾種實現方法?同步有幾種實現方法?
- 多線程有兩種實現方法:繼承Thread類與實現Runnable接口
- 同步的實現方面有兩種:synchronized,wait與notify
- wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。
- sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
- notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。
- Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。
23、啓動一個線程是用run()還是start()?
啓動一個線程是調用start()方法,使線程就緒狀態,以後可以被調度爲運行狀態,一個線程必須關聯一些具體的執行代碼,run()方法是該線程所關聯的執行代碼。
24、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
分幾種情況:
- 其他方法前是否加了synchronized關鍵字,如果沒加,則能。
- 如果這個方法內部調用了wait,則可以進入其他synchronized方法。
- 如果其他個方法都加了synchronized關鍵字,並且內部沒有調用wait,則不能。
- 如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因爲非靜態的方法用的是this。
25、ArrayList和Vector的區別?
這兩個類都實現了List接口(List接口繼承了Collection接口),他們都是有序集合,即存儲在這兩個集合中的元素的位置都是有順序的,相當於一種動態的數組,我們以後可以按位置索引號取出某個元素,,並且其中的數據是允許重複的,這是HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重複的元素(本來題目問的與hashset沒有任何關係,但爲了說清楚ArrayList與Vector的功能,我們使用對比方式,更有利於說明問題)。
接着才說ArrayList與Vector的區別,這主要包括兩個方面:.
- 同步性:
Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用ArrayList,因爲它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用Vector,因爲不需要我們自己再去考慮和編寫線程安全的代碼。
備註:對於Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時才提供的,它們是線程不安全的。所以,我們講課時先講老的。 - 數據增長:
ArrayList與Vector都有一個初始的容量大小,當存儲進它們裏面的元素的個數超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是隻增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數在內存空間利用與程序效率之間要取得一定的平衡。Vector默認增長爲原來兩倍,而ArrayList的增長策略在文檔中沒有明確規定(從源代碼看到的是增長爲原來的1.5倍)。ArrayList與Vector都可以設置初始的空間大小,Vector還可以設置增長的空間大小,而ArrayList沒有提供設置增長空間的方法。
總結:即Vector增長原來的一倍,ArrayList增加原來的0.5倍。
26、HashMap和Hashtable的區別?
從三方面來說
- 歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現
- 同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
- 只有HashMap可以讓你將空值作爲一個表的條目的key或value
27、List 、Map、Set區別?
- List:存儲單列數據的集合,數據有序,並且允許重複。
- Map:數據無序,鍵值集合,鍵不可以重複,值是可以重複的。
- Set:數據無序,無重複對象。
28、Collection 和 Collections的區別?
- Collection:集合類的上級接口,繼承與他的接口主要有Set 和List.
- Collections:針對集合類的一個幫助類,提供了一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
29、Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?
- Set裏的元素是不能重複的
- 元素重複與否是使用equals()方法進行判斷的。
- equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值。
30、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
對。
如果對象要保存在HashSet或HashMap中,它們的equals相等,那麼,它們的hashcode值就必須相等。
如果不是要保存在HashSet或HashMap,則與hashcode沒有什麼關係了,這時候hashcode不等是可以的,例如arrayList存儲的對象就不用實現hashcode,當然,我們沒有理由不實現,通常都會去實現的。
31、說出一些常用的類,包,接口,請各舉5個
要讓人家感覺你對java ee開發很熟,所以,不能僅僅只列core java中的那些東西,要多列你在做s項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。
-
常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer
java.util.Date,System,Class,List,HashMap -
常用的包:java.lang java.io java.util java.sql javax.servlet,org.apache.struts.action,org.hibernate
-
常用的接口:Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession
32、GC是什麼? 爲什麼要有GC?
GC是垃圾收集的意思(Garbage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。
33、heap和stack有什麼區別?
- stack(棧內存):程序進入一個方法時,會爲這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
- heap(堆內存):用於存放不放在當前方法棧中的那些數據,例如,使用new創建的對象都放在堆裏,所以,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。
34、說出Servlet的生命週期,並說出Servlet和CGI的區別?
- 簡述:加載和實例化–>初始化–>處理請求–>服務結束
- 生命週期:Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。
- 與cgi的區別在於servlet處於服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務於多個請求,並且其實例一般不會銷燬,而CGI對每個請求都產生新的進程,服務完成後就銷燬,所以效率上低於servlet。
35、final, finally, finalize的區別?
- final :用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
- finally:異常處理語句結構的一部分,表示總是執行。
- finalize:Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
36、forward 和redirect的區別?
- forward:服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。 一次請求,地址欄中的地址不改變。
- redirect:就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛纔請求的所有參數重新請求,所以session,request參數都可以獲取。兩次請求,地址欄中的地址改變。
37、什麼時候用assert(斷言)?
assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值爲true;如果該值爲false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啓。爲了提高性能,在軟件發佈後,assertion檢查通常是關閉的。
38、數組有沒有length()這個方法? String有沒有length()這個方法?
數組沒有length()這個方法,有length的屬性。String有length()這個方法。
39、編程題: 寫一個Singleton(單例模式)出來?
- 餓漢模式
public class Singleton {
private Singleton() {
}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
- 懶漢模式
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance;
}
}
40、Java的接口和C++的虛類的相同和不同處?
由於Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象裏面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,接口有更高的靈活性,因爲接口中沒有任何實現代碼。當一個類實現了接口以後,該類要實現接口裏面所有的方法和屬性,並且接口裏面的屬性在默認狀態下面都是public static,所有方法默認情況下是public,一個類可以實現多個接口。
41、描述一下JVM加載class文件的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
42、什麼情況下調用doGet()和doPost()?
Jsp頁面中的form標籤裏的method屬性爲get時調用doGet(),爲post時調用doPost()。
43、JSP和Servlet有哪些相同點和不同點,他們之間的聯繫是什麼?
- 相同點:JSP和Servlet本質上都是Java類。
- 不同點:JSP側重於視圖,Servlet主要用於控制邏輯 Servlet中沒有內置對象,Jsp中的內置對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象獲得。
- 聯 系:JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式。
44、XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?
- 兩種形式:dtd schema。
- 本質區別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發展schema的根本目的),
- 解析方式:DOM,SAX,STAX等
- DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構佔用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內存,適合對XML的隨機訪問
- SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問
- STAX:Streaming API for XML (StAX)。
45、應用服務器與WEB SERVER的區別?
- 應用服務器:Weblogic、Tomcat、Jboss;
- WEB SERVER:IIS、 Apache
46、MVC 軟件架構思想?
- Model:模型,封裝業務,處理邏輯
- View:視圖,顯示數據
- Controller:協調
47、String,StringBuffer,StringBuilder的區別?
- String:不可修改,適用於少量字符串操作,不需要頻繁改動字符串的情況。
- StringBuffer:可變,線程安全,同步,適用於多線程下在字符緩衝區進行大量操作的情況。
- StringBuilder:可變,線程不安全,非同步,適用於單線程下在字符緩衝區進行大量操作的情況。
48、Sql優化?
1、減少查詢字段數
2、表關聯儘量用主鍵
3、 查詢條件儘量避免模糊查詢
4、避免使用排序字段,排序字段儘量使用主鍵
5、儘量使用限制查詢條件
6、查詢條件使用有效索引
7、exist關鍵字代替in
8、distinct關鍵字慎用
49、String s = “a” + “b” +“c” + "d"創建了幾個對象?
一個對象
javac編譯可以直接對字符串常量進行直接的加減
package com.fsj;
public class Test9 {
public static void main(String[] args) {
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab"); // false
System.out.println(s3 == "ab"); // true
}
}
50、當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞還是引用傳遞?
是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。
51、我們在web 應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?
public String translate(String str){
String tempStr = "";
try{
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}catch (Exception e){
System.err.println(e.getMessage());
}
return tempStr;
}
52、定義類A 和類B 如下:
class A {
int a = 1;
double d = 2.0;
void show() {
System.out.println("Class A: a=" + a + "\td=" + d);
}
}
class B extends A {
float a = 3.0f;
String d = "Java program.";
void show() {
super.show();
System.out.println("Class B: a=" + a + "\td=" + d);
}
}
(1) 若在應用程序的main 方法中有以下語句:
A a=new A();
a.show();
則輸出的結果如何?
(2) 若在應用程序的main 方法中定義類B 的對象b:
A b=new B();
b.show();
則輸出的結果如何?
輸出結果爲:
1)Class A: a=1 d=2.0 ;
2)Class A: a=1 d=2.0
Class B: a=3.0 d=Java program。
53、String s=new String(“xyz”);創建了幾個String Object?
兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s。
54、指出下面程序的運行結果: 【基礎】
class A {
static {
System.out.print("1");
}
public A() {
System.out.print("2");
}
}
class B extends A {
static {
System.out.print("a");
}
public B() {
System.out.print("b");
}
}
public class Hello {
public static void main(String[] ars) {
A ab = new B(); // 執行到此處,結果: 1a2b
ab = new B(); // 執行到此處,結果: 1a2b2b
}
}
輸出結果爲1a2b2b;
類的static 代碼段,可以看作是類首次加載(虛擬機加載)執行的代碼,而對於類加載,首先要執行其基類的構造,再執行其本身的構造。執行順序,基類static代碼塊—>本身static代碼塊—>基類構造方法—>本身構造方法
55、字符串操作:如何實現字符串的反轉及替換?
可用字符串構造一StringBuffer 對象,然後調用StringBuffer 中的reverse方法即可實現字符串的反轉,調用replace 方法即可實現字符串的替換。
56、socket通信(tcp/udp區別及JAVA的實現方式)?
- TCP:面向連接的傳輸層控制協議,面向字節流,把數據看成是一連串無結構的字節流,具有極高的可靠性,保證數據包按照順序準確到達,但其也有着很高的額外負擔。
- UDP:無連接的數據包服務,面向報文的,無擁塞控制,並不能保證數據包會被成功的送達,也不保證數據包到達的順序,但其傳輸速度很快。
- java實現方式:大多數我們會使用TCP,偶爾纔會動用UDP,如聲音訊號,即使少量遺失,也無關緊要。
57、什麼是java序列化,如何實現java序列化?
- 序列化:就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。
- 實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是爲了標註該對象是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
58、i = 5 ,j =7 求 i | j?
i | j 或運算 先轉換爲二進制再運算
5:0101
7:0111
i | j = 0111 = 7
59、List遍歷集合的三種方式?
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
- 超級for循環遍歷
for(String value : list){
System.out.println(value);
}
- size()方法遍歷
for(int i =0; i<list.size();i++){
System.out.println(list.get(i));
}
- 迭代器遍歷
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
60、(1 | 2)<< 4 =?
1 | 2 按位或
0001 0010 0011
<<4 左移運算符,左移四位 相當於乘以2的4次方 (1 | 2) << 4 = 48
61、byte b = (byte)129 b=?
byte取值 -128 ~ 127
java中正數用源碼錶示,負數用補碼錶示,第一位爲符號位
129
補碼 1000 0001 符號位爲1 所以爲負數 補碼減1 得到反碼
反碼:1000 0000 反碼按位取反得到源碼
源碼:1111 1111
所以 b=-127
62、abstract方法不能夠和static連用,爲什麼?
- static修飾的爲靜態方法,而abstract修飾的爲抽象方法,無方法體的方法,無法調用
- abstract方法需要子類重寫,而靜態方法不能被重寫,二者相互矛盾
63、Integer a= 1 , Integer b = 1 , a==b? Integer c = 1000 ,Integer d = 1000,c==d?
- Integer a = 1 , Integer b = 1 , a==b true
- Integer c = 1000 , Integer d = 1000 , c==d false
這裏設計到自動裝箱和自動拆箱的知識
- 在自動裝箱時對於值從 -128 ~ 127之間的值,在內存中會被重用,Integer b = 1 沒有重新生成對象 所以 a == b true
- Integer d = 1000 裝箱後的Integer不被重用,每次裝箱都會新建一個Integer對象 所以 c == d false
64、8大基本數據類型
- 四整型:byte short int long
- 二浮點型:float double
- 一布爾型:boolean
- 一字符型:char
65、什麼是面向對象?
- 對象:一切皆對象,人們所研究的所有事物都是對象。
- 面向對象:不需要知道其中的具體操作。
- 例子:去飯店喫飯的時候,我們面向服務員點菜,不需要知道菜是怎麼做的,只需要喫就可以啦,而當買單的時候,服務員面向我們收錢,不需要知道我們如何喫的,只需要知道多少錢就可以啦。
66、Ajax的好處和壞處?
- 好處:
- 頁面無刷新,用戶體驗好
- 響應速度快,異步方式
- 進一步促使頁面和數據分離
- 壞處:
- ajax局部刷新,頁面後退無用
- 編寫時需要考慮到瀏覽器的兼容性,使用了大量的js和ajax引擎
- 對流媒體和移動設備的支持不太好
- 對搜索引擎的支持比較弱
67、說說你常見的異常?
- 空指針異常 NullPointException
- 類型轉換異常 ClassCastException
- 數組下標越界異常 IndexOutOfBoundsException
- 文件未找到異常 FileNotFoundException
- 操作數據庫異常 SqlException
- 字符串轉換成數字異常 NumberFormatException
- 類不存在異常 ClassNotFoundException
68、HashMap 默認的容量?
- 默認容量:16
- 負載因子:0.75
容量大於 16 * 0.75 自動擴容
69、服務器性能優化?
- 使用內存數據庫
- 使用RDD spark的核心
- 增加緩存
- SSD代替機械硬盤
- 優化數據庫
- 選選擇合適的IO程序
- 多核處理使用
- 分佈式開發
70、java的有點和缺點?
- 優點:
- 平臺無關性
- 無指針
- 垃圾回收機制
- 類庫
- 安全性和健全性好
- 缺點:
- 需要運行環境
- 不適合開發桌面應用程序
- 增加了產品的複雜性
72、java和c++的區別?
- java:
- 無指針,單繼承,實現多接口
- 完全面向對象,垃圾回收機制
- 允許預編譯,不支持其功能,顯示轉換
- c++:
- 有指針,多繼承。
- 面向對象,由程序釋放內存
- 需要預編譯,隱含轉換
73、敏捷開發?
- 概念:敏捷開發以用戶的需求進化爲核心,採用迭代、循序漸進的方法進行軟件開發。
- 優點:
- 精確,質量,速度
- 豐富的投資回報率
- 高效的自我管理團隊
- 敏捷開發宗旨
- 個體與交互比流程與工具更具價值
- 可用的軟件比文檔更有價值
- 與客戶的協作比合作談判更有價值
三、結語
第二大點如有不正確的地方還希望大家多多指教,希望和志同道合的朋友一起學習,一起進步,先更新到這裏,下次繼續補充。