Java面试基础知识(1)
生活随笔
收集整理的這篇文章主要介紹了
Java面试基础知识(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、final, finally, finalize的區別 final:修飾符(關鍵字)如果一個類被聲明為final,沒有子類也不能被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后不可修改。被聲明為final的方法也同樣只能使用,不能重載 finally:再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執行,然后控制就會進入 finally 塊(如果有的話)。 finalize:方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。 2、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口) 匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個接口,由另一個內部類實現。 3、&和&&的區別。 &是位運算符。&&是布爾邏輯運算符。&&左邊為真右邊就不執行了,&一直執行完畢。 4、HashMap和Hashtable的區別。 都屬于Map接口的類,以鍵值對的形式存儲數據。 HashMap 無序,它允許為空 Hashtable 類似于 HashMap,但是不允許空,它也比 HashMap 慢,因為它是同步的。 5、ArrayList和Vector的區別 同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的 數據增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半 6、Collection 和 Collections的區別。 Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。 Collection是集合類的上級接口,繼承與他的接口主要有Set 和List。 7、GC是什么? 為什么要有GC? 。 GC是垃圾收集器。Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。要請求垃圾收集,可以調用下面的方法之一:System.gc() Runtime.getRuntime().gc() System.gc();
Runtime.getRuntime().gc();
8、String s = new String("xyz");創建了幾個String Object?
兩個對象,一個是“xyx”,一個是指向“xyx”的引用對象s。
9、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11; 10、short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯? short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。 11、sleep() 和 wait() 有什么區別? 他們最大本質的區別是:sleep()不釋放同步鎖,wait()釋放同步鎖?? 還有用法的上的不同是:sleep(milliseconds)可以用時間指定來使他自動醒過來,如果時間不到你只能調用interreput()來強行打斷;wait()可以用notify()直接喚起. sleep是Thread類的靜態方法。 wait是Object的方法,也就是說可以對任意一個對象調用wait方法,調用wait方法將會將調用者的線程掛起,直到其他線程調用同一個對象的notify方法才會重新激活調用者 12、數組有沒有length()這個方法? String有沒有length()這個方法? 數組沒有length()這個方法,有length的屬性。 ?String有有length()這個方法。 13、Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型? 方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重(Overloading)。Overloaded的方法是可以改變返回值的類型。 ? 14、"=="和equals方法究竟有什么區別? ==操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操作符。如果一個變量指向的數據是對象類型的,那么,這時候涉及了兩塊內存,對象本身占用一塊內存(堆內存),變量也占用一塊內存,例如Objet obj = new Object();變量obj是一個內存,new Object()是另一個內存,此時,變量obj所對應的內存中存儲的數值就是對象占用的那塊內存的首地址。對于指向對象類型的變量,如果要比較兩個變量是否指向同一個對象,即要看這兩個變量所對應的內存中的數值是否相等,這時候就需要用==操作符進行比較。 equals方法是用于比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。例如,對于下面的代碼: String a=new String("foo"); String b=new String("foo"); 兩條new語句創建了兩個對象,然后用a/b這兩個變量分別指向了其中一個對象,這是兩個不同的對象,它們的首地址是不同的,即a和b中存儲的數值是不相同的,所以,表達式a==b將返回false,而這兩個對象中的內容是相同的,所以,表達式a.equals(b)將返回true。 15、error和exception有什么區別? error 表示很難恢復的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。 exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況 Exception表示程序需要捕捉和處理的的異常; Error表示系統級別的錯誤和程序無需處理的。 16、List, Set, Map是否繼承自Collection接口? ? List,Set是???? Map不是 17、abstract class和interface有什么區別? 聲明方法的存在而不去實現它的類被叫做抽象類(abstract class)(只聲明不實現,在子類實現。可以有實現的方法和私有的方法) 接口(interface)是抽象類的變體。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。某個類實現了接口,就必須實現接口里的所有方法。 1.抽象類可以有構造方法,接口中不能有構造方法。 2.抽象類中可以有普通成員變量,接口中沒有普通成員變量 3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。 4. 抽象類中的抽象方法的訪問類型可以是public,protected和默認,但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。 5. 抽象類中可以包含靜態方法,接口中不能包含靜態方法 6. 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。 7. 一個類可以實現多個接口,但只能繼承一個抽象類。 18、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)? 接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可以繼承實體類,但前提是實體類必須有明確的構造函數。 19、構造器Constructor是否可被override? 構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。 20、是否可以繼承String類? ? String類是final類故不可以繼承。 21、當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法? 不能,一個對象的一個synchronized方法只能由一個線程訪問。 22、try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后? 會執行,在return前執行。 23、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對? 不對,有相同的hash code。(先判斷hashcode如果hashcode相等再判斷equals,所以如equals相等那么hashcode一定相等) 24、當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞? 是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。 25、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 26、String與StringBuffer的區別。 String的長度是不可變的,StringBuffer的長度是可變的。StringBuffer內容是可以修改的,String是不可修改的修改后就產生一個新的對象。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。 1.如果要操作少量的數據用 String 2.單線程操作字符串緩沖區 下操作大量數據 StringBuilder 3.多線程操作字符串緩沖區 下操作大量數據 StringBuffer(線程安全,速度比StringBuilder慢) 27、int 和 Integer 有什么區別 Java 提供兩種不同的類型:引用類型和原始類型(或內置類型),Int是java的原始數據類型,Integer是java為int提供的封裝類。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關 28、說出ArrayList,Vector, LinkedList的存儲性能和特性 ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。 29、heap和stack有什么區別 stack的空間由操作系統自動分配和釋放,heap的空間是手動申請和釋放的,heap常用new關鍵字來分配。 stack空間有限,heap的空間是很大的自由區。 在Java中,若只是聲明一個對象,則先在棧內存中為其分配地址空間,若再new一下,實例化它,則在堆內存中為其分配地址。 如:Object a =null; 只在棧內存中分配空間 Object b =new Object(); 則在堆內存中分配空間 30、靜態變量和實例變量的區別? static i = 10; //常量 class A a;? a.i =10;//可變 31、什么是java序列化,如何實現java序列化? 序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。 序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable 只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream( 對象流)對象,接著使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即 保存其狀態),要恢復的話則用輸入流。 32、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類? 字節流,字符流。字節流繼承于InputStream OutputStream,字符流繼承于InputStreamReader OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。 33、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。 如果數據將在線程間共享。例如正在寫的數據以后可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那么這些數據就是共享數據,必須進行同步存取。 當應用程序在對象上調用了一個需要花費很長時間來執行的方法,并且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。 34、請說出你所知道的線程同步的方法。 wait():使一個線程處于等待狀態,并且釋放所持有的對象的lock。 sleep():使一個正在運行的線程處于睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。 notify():喚醒一個處于等待狀態的線程,注意的是在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。 Allnotity():喚醒所有處入等待狀態的線程,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。 35、多線程有幾種實現方法,都是什么?同步有幾種實現方法,都是什么? 多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口,同步的實現方面有兩種,分別是synchronized,wait與notify 36、線程的基本概念、線程的基本狀態以及狀態之間的關系 線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。 Java中的線程有四種狀態分別是:運行、就緒、掛起、結束 37、簡述synchronized和java.util.concurrent.locks.Lock的異同 主要相同點:Lock能完成synchronized所實現的所有功能 主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。 38、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內存嗎?有什么辦法主動通知虛擬機進行垃圾回收 對于GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方 式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些 對象為"不可達"時,GC就有責任回收這些內存空間。可以。程序員可以手動執行System.gc(),通知GC運行,但是Java 語言規范并不保證GC一定會執行。 39、運行時異常與一般異常有何異同 Java提供了兩類主要的異常:runtime exception和checked exception。checked 異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。對于這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch。所以,面對這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。但是另外一種異常:runtime exception,也稱運行時異常,我們可以不處理。當出現這樣的異常時,總是由虛機接管。比如:我們從來沒有人去處理過NullPointerException異常,它就是運行時異常,并且這種異常還是最常見的異常之一。出現運行時異常后,系統會把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由Thread.run()拋出,如果是單線程就被main()拋出。拋出之后,如果是線程,這個線程也就退出了。如果是主程序拋出的異常,那么這整個程序也就退出了。運行時異常是Exception的子類,也有一般異常的特點,是可以被Catch塊處理的。只不過往往我們不對他處理罷了。也就是說,你如果不對運行時異常進行處理,那么出現運行時異常之后,要么是線程中止,要么是主程序終止。 40、Java中的異常處理機制的簡單原理和應用 當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發N ullPointerException。另一種情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創建自己的異常,并自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。 41、編程題: 寫一個Singleton出來。 Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。 一般Singleton模式通常有幾種種形式: 第一種形式: 1 public class Singleton { 2 private Singleton(){} 3 private static Singleton instance = new Singleton(); 4 public static Singleton getInstance() { 5 return instance; 6 }} View Code 第二種形式: 1 public class Singleton { 2 private static Singleton instance = null; 3 4 public static synchronized Singleton getInstance() { 5 if (instance==null) 6 instance=new Singleton(); 7 return instance; 8 } 9 } View Code?
轉載于:https://www.cnblogs.com/zhangjinru123/p/7224548.html
總結
以上是生活随笔為你收集整理的Java面试基础知识(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python学习第三十二节(进程间通信、
- 下一篇: 中国电信天翼宽带wifi网络怎么设置 天