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