J2SE java面試題

1.面向對象的特徵有哪些方面?

  • 封裝 最常見的是把屬性私有化,封裝 到一個類裏面,只能通過方法去訪問調用
  • 繼承 子類繼承父類,從而繼承了父類的方法和屬性
  • 抽象 比如一個用戶類,抽象出了name,age這些屬性,使得開發過程中更加易於理解
  • 多態 多態分爲操作符的多態和類的多態,類的多態指父類引用指向子類對象,並且有繼承,有重寫。

2.String是基本數據類型麼?

string是類類型,不是基本數據類型

  基本數據類型有八種
 - 整數型:byte,short,long ,int
 - 浮點型:float,double
 - 字符型:char
 - 布爾型:boolean

3.int 和Integer的區別?

int是基本數據類型,32位長度的整數
Integer是類類型,是int的封裝類
int和Integer之間可以通過自動裝箱,拆箱,互相轉換

4.String和StringBuffer的區別?

String 是 immutable(不可改變的)其內容一旦創建好之後,就不可以發生改變。
StringBuffer是可以變長度的,內容也是可以發生改變的
改變的原理是StringBuffer內部採用了字符數組存放數據,在需要增加長度的時候,創建新的數組,並且把原來的數據複製到新的數組這樣的方法來實現的
StringBuffer的方法是有synchronized修飾的是線程安全的類,而StringBuilder就是非線程安全的類

5.運行時異常與一般異常有何異同?

運行時異常又叫做非可查異常,在編譯過程中,不需要必須進行顯示捕捉(比如,空指針異常:NullPointerException  下標越界異常:ArrayIndexOutOfBoundsException 類找不到異常:ClassNotFoundException等)
一般異常又叫做可查異常,在編譯過程中,必須進行處理,要麼try catch捕捉,要麼通過throws拋出去

6.說出ArrayList,Vector,LinkedList的存儲性能和特性

先說ArrayList和Vecor
	兩者都繼承了抽象類AbstractList,但是Vector是線程安全的(其方法是使用Synchronized修飾的),而ArrayList是非線程安全的
再說ArrayList和LinkedList
	ArrayList是數組結構,所以定位很快,但是插入和刪除很慢
	LinkedList是雙向鏈表結構,所以插入和刪除很快,但是定位很慢

7.Collection和Collections的區別

Collection 是接口,是List和Set的父接口
Collections 是工具類,提供了反轉(reverse)排序(sort),
混淆(shuffle)交換(swap),滾動(rotate),線程安全化(synchronizedList)等實用的方法

8.&和&&的區別

&:有兩個作用,分別是位與,和邏輯與
&&:就是邏輯與
	作爲邏輯與,&和&&分別表示爲長路與和短路與
	長路與  兩側都會被運算
	短路與  只要第一個是false,第二個直接短路不在進行運算

9.HashMap和HashTable的區別

HashMap和HashTable都實現了Map接口,都是鍵值對方式保存數據
區別1:
	HashMap(key和value)可以存放爲null
	HashTable(key和value)不可以存放爲null
區別2:
	HashMap不是線程安全的類
	HashTable是線程安全的類

10.final,finally,finalize的區別

final:修飾類,方法,基本類型變量,其引用時候分別有不同的意思
	修飾類 表示該類不能被繼承
	修飾方法 表示該方法不能被重寫
	修飾基本類型變量 表示該變量只能被賦值一次
	修飾引用 表示該引用哦只有一次指向對象的機會
finally:
	適用於異常處理時,無論是否有異常拋出,表示總是執行
finalize:
	finalize是Object的方法,所有類都繼承了該方法。
	當一個對象滿足垃圾回收的條件,並且被回收的時候,其finalize()方法就會被調用

11.OverLoad和Override的區別,Overloaded的方法是否可以改變返回值的類型?

overload 是方法重載的意思,指的是同一個類裏面,方法名一樣,但是參數列表不一樣
override 是方法重寫的意思,值得是子類繼承父類的某個方法後,有重寫了一遍,方法名相同,參數列表相同
Overloaded的方法可以改變返回值的類型,重載其實本質上就是完全不同的方法,只是恰好方法名相同而已

12.Error和Exception有什麼區別?

Error和Exception都實現了Throwable的接口
	Error指的是JVM層面上的錯誤,比如,內存不足,OutOfMemoryError
	Exception指的是代碼邏輯的異常,比如下標越界,OutOfIndexException

13.abstract class 抽象類和interface接口有什麼區別?

使用方式:
	抽象類只能通過繼承(extends)被使用
	接口必須通過實現(implements)被使用
實現方式:	
	抽象類不僅可以提供抽象方法,也可以提供實現方法
	接口只能提供抽象方法,不能提供實現方法,但是在Java8版本開始,接口可以提供實現方法了,前提是要在方法前加上一個default修飾符

14.heap和stack有什麼區別?

heap:堆
stack:棧(堆棧)
存放的內容不一樣:
	heap:是存放對象的
	stack:是存放基本類型(int,float,boolean等等),引用(對象地址),方法調用
存取方式不一樣:
	heap:是自動增加大小的,所以不需要指定大小,但是存取相對較慢
	stack:是固定大小的,並且是先入後出的順序,並且存取速度比較快

15:GC是什麼?爲什麼要用GC?

GC是Garbage Collection的縮寫,即垃圾回收
這裏所謂垃圾回收,指的是那些不再被使用的對象,JVM的垃圾回收機制釋放內存資源
開發人員可以更加專注的進行業務功能的開發,而資源回收的工作交由給更加專業的垃圾回收機制自動完成。

16.short s1=1;s1=s1+1;有什麼錯?

short s1 =1;這句沒有錯誤,編譯器會自動把1這個整數處理爲short
s1 = s1  =1;右側的表達式會返回一個int類型的整數,再把這個int類型的整數賦給short類型s1的時候,就會出現強制轉換的錯誤

17.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round的意思是+0.5  取整數
所以,Math.round(11.5)即11.5+0.5=12; Math.round(-11.5)即-11.5+0.5=-11

18.String s = new String(‘xyz’);創建了幾個String Object?

String s = new String('xyz');
首先構造方法 new String('xyz')中的“xyz”;這本身就是一個字符串對象
然後new關鍵字一定會創建一個對象,所以總共創建了兩個String對象

19.Java有沒有goto?

有,goto是關鍵字,但是是保留字,並不具備功能性

20.接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可以繼承實體類(concreate class)?

接口可以繼承接口,比如List就可以繼承接口Collection
抽象類可以實現接口,比如 MouseAdapter鼠標監聽適配器是一個抽象類,並且實現了MouseListener接口
抽象類可以繼承實體類,所有抽象類,都繼承了Object類

21.List,Set,Map是否都繼承Collection接口?

List和Set繼承了Collection接口
但是Map和Collection之間沒有繼承關係,因爲一個是鍵值對容器,一個是單值容器,無法兼容

22.abstract的method是否可以時static,是否可以同時是synchronized?

都不可以

23.數組有沒有length()這個方法,String有沒有length()這個方法?

數組獲取長度:.lenght屬性
String獲取長度:length()方法
集合獲取長度: size()方法
文件獲取長度:length()方法

24.Set裏的元素是不能重複的,那麼用什麼方法來區分是否重複呢?

以HashSet爲例,判斷重複的邏輯是:
HashSet沒有自身的實現,而是在裏面封裝了一個HashMap,所以本質上就是判斷HashMap的key是否重複
1.首先看hashcode是否相同,如果不同,就是不重複的
2.如果hashcode一樣,在比較equals,如果不同,就是不重複的,否則就是重複的

25.構造器Constructor是否可被override? 是否可以繼承String類?

子類不能繼承父類的構造方法,所以就不存在重寫父類的構造方法(注:super()表示子類調用父類的構造方法,這不能叫繼承父類的構造方法)
String是final修飾的,所以不能夠被繼承

26.switch是否能作用在byte上,能否作用在long上,能否作用在string上?

switch可以作用在byte,short,int,string,Enum(枚舉)上,但是不能作用在long上面(注:switch 作用在String上從JDK1.7開始支持,實質是編譯時將字符串替換爲了其對應的hash值)

27.try{}裏面有一個return語句,那麼緊跟在這個try後面的finally{}裏的code會不會是被執行,什麼時候被執行,在return之前還是之後?

try裏面的return和finally裏的return都會執行,但是當前方法只會採納finally中的return的值

28.兩個對象值相同(x.equals(y) == true),但卻有不同的hashcode,這句話對不對?

因爲hashcode()方法和equals()方法都可以通過自定義類重寫,是可以做到equals相同,但是hashcode不同的,在object類的equals()方法中有那麼一段話:
* Note that it is generally necessary to override the {@code hashCode}
* method whenever this method is overridden, so as to maintain the
* general contract for the {@code hashCode} method, which states
* that equal objects must have equal hash codes.
* 翻譯如下:
* 通常來講,在重寫這個方法的時候,也需要對hashCode方法進行重寫,
以此來保證這兩個方法的一致性——
當equals返回true的時候,這兩個對象一定有相同的hashcode.

兩個對象值相同(x.equals(y)==true),但卻有不同的hashcode,這個答案是否定的,但是得搞清楚裏面的原委

29.垃圾回收的優點和原理,並考慮兩種回收機制

與C語言開發人員需要手動進行內存資源的釋放不同,java提供回收機制,自動進行GC,將開發人員從容易犯錯的內存資源管理中解放出來。
原理:當某一個對象,沒有任何引用指向它的時候,那麼它就滿足垃圾回收的條件,在適當的時候,JVM虛擬機進行GC將其回收,釋放空間,以供後續在利用
兩種常見的回收機制:
1.定時回收
	每隔30分鐘進行一次回收,這種機制的弊端是如果垃圾產生的比較快,有可能30分鐘之內垃圾已經把內存佔用光了,導致性能變慢
2.當垃圾佔到某個百分比的時候,進行回收
	比如,當垃圾佔到70%的時候,進行回收,這種機制的弊端是,如果垃圾產生的頻率很快,那麼JVM久必須高頻率的進行回收,而在垃圾回收的過程中,JVM會停頓下來,只做垃圾回收,而影響業務功能的正常運行、
一般說來,JVM會採用兩種機制結合的方式進行垃圾回收。
	

30.你所知道的集合類都有哪些?主要方法?

常見的集合:
	ArrayList,LinkedList,HashSet,HashMAp,TreeSet等等
常見方法:
	size(),add(),remove()等等

31.char型變量中能不能存貯一箇中文漢字?爲什麼?

char 是16位的,佔兩個字節,漢字通常使用GBK或者UNICODE編碼,也是使用兩個字節,所以可以存放漢字

32.解析XML文檔有哪幾種方式?

主要是兩種方法,SAX和DOM,SAX就是逐行讀取,直到找到目標數據爲止
DOM是完全文檔加載,然後讀取

33.關鍵字:throws,throw,try,catch,finally,分別代表什麼意義?在try塊中可以拋出異常麼?

throws:用在方法聲明上,表示該方法有可能拋出某個異常
throw: 拋出一個指定的異常
try catch:在try中有可能會拋出某個異常,一旦某個異常拋出後,就會在catch中進行捕捉
finally:表示無論是否捕捉異常,都會執行

34.一個“java”源文件中是否可以包括多個類(不是內部類)?有什麼限制?

可以包括多個類,但是隻能出現一個public修飾的類,但是可以出現多個非public修飾的類

35.java中有幾種類型的流?

Java中所有的流都是基於字節流,所以最基本的流是輸入輸出字節流
	InputStram   OutputStream
在字節流的基礎上,封裝了字符流
	Reader Writer
進一步,有封裝了緩存流
	BufferedReader 	PrintWriter
以及數據流
	DataInputStream
	DataOutputStream
對象流
	ObjectInputStream
	ObjectOutputStream

36.java中會存在內存泄露麼?請簡單描述

因爲Java是自動進行垃圾回收管理的,所以不存在 C語言中同等概念的內存泄漏,但是存在Java特色的內存泄漏
當某些對象不被使用,但是又有非直接引用指向的時候,那麼就不滿足垃圾回收的條件,而形成內存泄漏。
比如代碼中的例子,每個Object創建的時候,有一個引用o指向,接着就被放進了集合al中。 下一個Object創建的時候,上一個Object就沒有引用指向了。
這些Object都沒有引用指向,但是卻放在ArrayList中,而這個Arraylist忘記了回收,那麼裏面的所有對象,都會一直存活下去,雖然不再被使用了。
package j2se;
 
import java.util.ArrayList;
 
public class MemoryLeak {
    static ArrayList<Object> al = new ArrayList<Object>();
 
    public static void main(String[] args) {
 
        for (int i = 0; i < 100; i++) {
            Object o = new Object();
            al.add(o);
        }
 
    }
}

37.java中多態的機制是什麼?

父類(接口)引用指向子類對象
方法有重寫

38.靜態變量和實例變量的區別?

靜態變量直接通過類就可以訪問,無需實例
實例變量 比如同構類的某個具體實現,纔可以訪問

39.什麼是java序列化,如何實現java 序列化?

序列化指的是把一個Java對象,通過某種介質進行傳輸,比如Socket輸入輸出流,或者保存在一個文件裏,實現java序列化的手段是讓該類實現接口Serializable,這個接口是一個標誌性的接口,沒有任何方法,僅僅用於表示該類可以序列化

40.是否可以從一個static方法內部發出對非static方法的調用?

不行,因爲非static方法需要一個具體的實例纔可以調用,而調用static方法的時候,不一定存在一個實例

41.在java中,如何跳出當前的多重嵌套循環?

在外部循環的前一行,加上標籤 ,在break的時候使用標籤,即能達到結束多重嵌套循環的效果
public class HelloWorld {
    public static void main(String[] args) {
           
        //打印單數    
        outloop: //outloop這個標示是可以自定義的比如outloop1,ol2,out5
        for (int i = 0; i < 10; i++) {
              
            for (int j = 0; j < 10; j++) {
                System.out.println(i+":"+j);
                if(0==j%2) 
                    break outloop; //如果是雙數,結束外部循環
            }
              
        }
          
    }
}

42.List,Map,Set三個接口,存取元素時,各有什麼特點?

List是有順序的,並且可以重複
Set是無序的,不可以重複
Map是鍵值對方式保存

43.Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以 implements(實現)interface(接口)?

匿名內部類本質上就是在繼承其他類,實現其他接口

如例:
匿名類1,就是繼承了Thread
匿名類2 ,就是實現了Runnable接口
package j2se;
 
public class HelloWorld {
 
    public static void main(String[] args) {
 
        // 匿名類1
        new Thread() {
            public void run() {
 
            }
        };
 
        // 匿名類2
        new Runnable() {
            public void run() {
 
            }
        };
 
    }
}

44.內部類可以引用外部類的成員麼?有沒有什麼限制?

可以使用,如果是非靜態內部類,可以使用外部類的所有成員 如果是靜態內部類,只能使用外部類的靜態成員

45.多線程有幾種實現方法,都是什麼?

1.繼承一個Thread類
2.實現一個Runnable接口
3.匿名內部類
注:啓動線程是start()方法,run()並不能啓動一個新的線程

46.sleep()和wait()有什麼區別?

首先sleep和wait之間沒有任何關係
sleep是Thread類的方法,指的是當前線程暫停
wait是Object類的方法,指的是佔用當前對象的線程臨時釋放當年對象的佔用,以使得其他線程有機會佔用當前對象。所以調用wait方法一定是在synchronized 中進行的

47.說出數據連接池的工作機制是什麼?

數據庫連接池的原理:
因爲創建連接和關閉連接的行爲是非常耗時的,會顯著降低軟件的性能表現。解決辦法就是先創建n條數據庫連接Connection,循環使用,但是不進行關閉,這樣再執行SQL語句,就不需要額外創建連接了,直接使用現成的連接就可以了,從而節約了創建連接和關閉連接的時間開銷。

48.簡述synchronized和java.util.concurrent.locks.Lock的異同?

1.Lock是一個接口,而Synchronized是java中的關鍵字,synchronized是內置的語言實現,Lock是代碼層面的實現
2.Lock可以選擇性的獲取鎖,如果一段時間獲取不到,可以放棄,synchronized不行,會一根筋一直獲取下去,藉助Lock的這個特性,就能夠規避死鎖。synchronized必須通過謹慎和良好的設計,才能減少死鎖的發生
3.synchronized在發生異常和同步塊結束的時候,會自動釋放鎖。而Lock必須手動釋放,所以如果忘記了釋放鎖,一樣會造成死鎖

49.Class.forName的作用?爲什麼要用?

Class.forName常見的場景是在數據庫驅動初始化時調用
Class.forName本身的意義是加載類到JVM中,一旦一個類被加載道JVM中,它的靜態屬性就會被初始化,在初始化的過程中就會執行相關代碼,從而達到“加載驅動的效果”

50.當一個線程進入另一個線程的一個synchronized方法後,其他線程是夠可以進入此對象的其它方法

這個要看情況而定,如果該對象的其它方法也是有synchronized修飾的,那麼其他的線程救護被擋在外面,否則其他線程就可以進入其他方法

51.給我5個你常見的runtimeexception

NullPointerException 空指針異常
ArithmeticException 算術異常,比如除數爲零
ClassCastException 類型轉換異常
ConcurrentModificationException 同步修改異常,遍歷一個集合的時候,刪除集合的元素,就會拋出該異常 
IndexOutOfBoundsException 數組下標越界異常
NegativeArraySizeException 爲數組分配的空間是負數異常
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章