java基礎(chǔ)面試題

一、小策略

  1. 說區(qū)別的時候,先單獨說出每一個的特性,再列出相同點即可。
  2. 當(dāng)遇到自己不太擅長的問題的時候,一定不要慌張,想法設(shè)法的往自己熟悉的地方帶,比如說問到快速排序算法時,自己不是特別的懂,就可以說自己比較了解簡單的二分算法和冒泡排序算法。

二、基礎(chǔ)面試題

1、一個".java"源文件中是否可以包括多個類(不是內(nèi)部類)?有什么限制?

可以有多個類,但只能有一個public的類,并且public的類名必須與文件名相一致。

2、Java有沒有g(shù)oto?

java中的保留字,現(xiàn)在沒有在java中使用。

3、說說&和&&的區(qū)別?

  1. &和&&都可以用作邏輯與的運算符,表示邏輯與(and),當(dāng)運算符兩邊的表達式的結(jié)果都為true時,整個運算結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。

  2. &&還具有短路的功能,即如果第一個表達式為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)不會增長

  3. &還可以用作位運算符,當(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ū)別:

  1. 抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
  2. 抽象類中可以有普通成員變量,接口中沒有普通成員變量。
  3. 抽象類中的抽象方法的訪問類型可以是public,protected和默認類型,但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。
  4. 抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法。
  5. 抽象類和接口中都可以包含靜態(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方法后,其它線程是否可進入此對象的其它方法?

分幾種情況:

  1. 其他方法前是否加了synchronized關(guān)鍵字,如果沒加,則能。
  2. 如果這個方法內(nèi)部調(diào)用了wait,則可以進入其他synchronized方法。
  3. 如果其他個方法都加了synchronized關(guān)鍵字,并且內(nèi)部沒有調(diào)用wait,則不能。
  4. 如果其他方法是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ū)別?

從三方面來說

  1. 歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現(xiàn)
  2. 同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
  3. 只有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(單例模式)出來?

  1. 飽漢模式
public class Singleton{
    private Singleton(){
    } 
    private static Singleton instance = new Singleton(); 
    public static Singleton getInstance() {  
        return instance;   
   }  
}  
  1. 饑漢模式
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文檔有哪幾種方式?

  1. 兩種形式:dtd schema。
  2. 本質(zhì)區(qū)別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發(fā)展schema的根本目的),
  3. 解析方式: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?

  1. Integer a = 1 , Integer b = 1 , a==b true
  2. 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的好處和壞處?

  1. 好處:
  • 頁面無刷新,用戶體驗好
  • 響應(yīng)速度快,異步方式
  • 進一步促使頁面和數(shù)據(jù)分離
  1. 壞處:
  • 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的有點和缺點?

  1. 優(yōu)點:
  • 平臺無關(guān)性
  • 無指針
  • 垃圾回收機制
  • 類庫
  • 安全性和健全性好
  1. 缺點:
  • 需要運行環(huán)境
  • 不適合開發(fā)桌面應(yīng)用程序
  • 增加了產(chǎn)品的復(fù)雜性

72、java和c++的區(qū)別?

  1. java:
  • 無指針,單繼承,實現(xiàn)多接口
  • 完全面向?qū)ο螅厥諜C制
  • 允許預(yù)編譯,不支持其功能,顯示轉(zhuǎn)換
  1. c++:
  • 有指針,多繼承。
  • 面向?qū)ο螅沙绦蜥尫艃?nèi)存
  • 需要預(yù)編譯,隱含轉(zhuǎn)換

73、敏捷開發(fā)?

  • 概念:敏捷開發(fā)以用戶的需求進化為核心,采用迭代、循序漸進的方法進行軟件開發(fā)。
  1. 優(yōu)點:
  • 精確,質(zhì)量,速度
  • 豐富的投資回報率
  • 高效的自我管理團隊
  1. 敏捷開發(fā)宗旨
  • 個體與交互比流程與工具更具價值
  • 可用的軟件比文檔更有價值
  • 與客戶的協(xié)作比合作談判更有價值

三、結(jié)語

第二大點如有不正確的地方還希望大家多多指教,希望和志同道合的朋友一起學(xué)習(xí),一起進步,先更新到這里,下次繼續(xù)補充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內(nèi)容

  • Java基礎(chǔ)面試題 1、 一個“.java”原文件中可以有幾個類(不是內(nèi)部類)?有什么限制? 可以有多個類,但只能...
    Muscleape閱讀 685評論 3 5
  • JAVA面試題相關(guān)基礎(chǔ)知識 1、面向?qū)ο蟮奶卣饔心男┓矫?①抽象: 抽象是忽略一個主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,...
    小宇java閱讀 905評論 0 6
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,733評論 18 399
  • 當(dāng)一個人放棄思考,無知便是惡,這是最大的罪,最大的惡。
    ming1025閱讀 283評論 0 0