一、小策略
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.ceil(11.6)的結果為11,Math.ceil(-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.strtuts.action,org.hibernate
常用的接口:Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession
32、GC是什么? 為什么要有GC?
GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。
33、heap和stack有什么區別?
heap(堆內存):程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用于存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
stack(棧內存):用于存放不放在當前方法棧中的那些數據,例如,使用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有哪些相同點和不同點,他們之間的聯系是什么?
Servlet:服務器端應用程序,動態web頁面。
JSP:java servlet page,Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯后是"類servlet"。
不同:Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,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取值 -127 ~ 128
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、敏捷開發?
概念:敏捷開發以用戶的需求進化為核心,采用迭代、循序漸進的方法進行軟件開發。
優點:
精確,質量,速度
豐富的投資回報率
高效的自我管理團隊
敏捷開發宗旨
個體與交互比流程與工具更具價值
可用的軟件比文檔更有價值
與客戶的協作比合作談判更有價值
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。