java基本知識-面試題簡答

1:什麼是註釋?註釋分爲幾種?註釋有什麼作用?


註釋就是對代碼的解釋說明性文字,分爲三種:單行註釋、多行註釋、文檔註釋。註釋可以對程序進行說明,給人看,還可以對程序進行排錯。


2:什麼是關鍵字?有什麼特點?


關鍵字就是被java語言賦予了特殊含義的單詞。特點就是所有的關鍵字都是小寫。


3:什麼是標識符?由哪些部分組成?常見的命名規則有哪些?


標識符就是給類、接口、方法、變量名起的名字。常見的規則有:有數字、字母、_以及$符號組成,不能以數字開頭,不能是java中的關鍵字。


4:什麼是常量?常量的分類?字面值常量表現形式有哪些?

在程序的運行過程中其值不發生改變的量。
字面值常量: 1 14 
自定義常量: int MAX = 100;


5:什麼是變量?變量的定義格式?要使用變量需要注意什麼?

在程序運行過程中,其值是可以在某個範圍內發生改變的量。
變量其實就是內存中一小塊區域。
由3部分組成:
1,數據類型: 限定變量的取值
2,變量名:方便使用。
3,值: 如果沒有值就沒有意義。

6:Java中的數據類型分幾類?基本數據類型有哪些?


基本類型:4類8種。基本數據類型有:


整數(byte,short,int,long)、浮點數(float,double)、字符(char)、布爾(boolean)。


7:算術運算有哪些,各自的作用?


有:+,-,*,/,%,++,--。


+:正號,加法,字符串連接符
%:取得餘數
++,--:
單獨使用:在操作數據的前後效果一致。
參與操作使用:
在操作數據的前面,是先++或者--,然後參與操作。
在操作數據的後面,是先參與操作,後++或者--。

8:+運算符需要注意的問題?

當把+號作爲加法和字符串連接符一起使用的時候,注意把運算的地方()起來。

9:賦值運算符常見的有哪些,各自的作用?

=:把右邊的內容賦值給左邊
+=,-=,*=,/=,%=:把左邊的和右邊的操作後賦值給左邊。
注意:
+=隱含了強制類型轉換。

x+=y;等價與:x = (x的數據類型)(x + y);

10:邏輯運算符有哪些都有什麼作用?
&:有false則false
|:有true則true
^:相同爲false,不同爲true。通過情侶關係來理解。
!:非false則true,非true則false。偶數次不改變以前的真假。
&&:和&的結果一樣,但是具有短路效果。左邊有false,右邊不執行。
||:和|的結果一樣,但是具有短路效果。左邊有true,右邊不執行。

11:位移運算符有什麼不同?

要想操作,就必須把所有的數據轉換爲二進制。然後操作。


<<:把數據向左移動,後邊補0。其實相當與乘以2的移動位數次冪。
>>:把數據向右移動,左邊補是最高位的值。其實相當與除以2的移動位數次冪。
>>>:把數據向右移動,左邊補0。其實相當於除以2的移動位數次冪。

12:什麼是函數重載?

函數名相同,參數列表不同,跟返回值無關,就是函數重載。


13:類是什麼?類的組成是哪些?

類是抽取了同類對象的共同屬性和行爲形成的對象或實體的"模版".
類是由成員變量,成員方法,構造函數組成

14:對象是什麼?什麼時候需要使用對象?

對象是現實世界中實體的描述,是其自身所具有的狀態特徵及可以對這些狀態施加的操作結合在一起所
構成的獨立實體.
需要描繪具體事物的時候要使用對象.

15:封裝是什麼?自己概述

隱藏對象的屬性和具體的實現細節,僅對外提供公共的訪問方式.
類、方法其實也是封裝的體現。

16:繼承是什麼?自己概述

概念:把多個類中相同的內容抽取出來,單獨定義到一個類(父類)中,再定義其他類(子類)的時候,繼承父類即可.


好處:1.提高了代碼的複用性,降低了代碼的重複率.2.提高了代碼的維護性3.讓類與類之間產生了關係,是多態的前提. 


17:匿名對象是什麼?應用場景是什麼?

匿名對象就是沒有名字的對象,由於沒有指向,所以效率較高一些。

應用場景:A:調用方法。但是僅僅只限調用一次而已。B:匿名對象用作實際參數傳遞。


18:構造方法的作用是什麼?構造方法的特點是什麼?構造方法的注意事項是什麼?


構造方法的作用是初始化數據。特點是:名稱和類名一致,並且沒有返回值類型的修飾和返回值。


注意:如果我們沒有給構造方法,系統將給出一個無參構造方法。如果我們給出了構造方法,系統將不再提供構造方法。

19:給成員變量賦值有幾種方式?

     1,通過set/get方法。

     2,通過帶參構造。

20:方法重寫和方法重載的區別?重載可以改變返回值類型嗎?(*面試題)  


方法重寫:
子類中出現和父類中一模一樣的方法聲明的方法。


方法重載:
同一個類中,出現方法名相同,參數列表不同的方法。
跟返回值無關。


重載可以改變返回值類型,因爲他跟返回值無關。

21:static關鍵字是什麼?有什麼特點?什麼時候用呢?

        static關鍵字:是靜態的意思,可以修飾類中成員變量和成員方法。

        靜態的特點:隨着類的加載而加載、優先與對象而存在、被所有對象所共享、可以通過類名.靜態的內容調用。

22:this和super的區別,以及應用場景? (*面試題)    

this:當前類的引用對象。誰調用代表誰。
super:父類的存儲空間標識。可以理解爲父類對象,誰調用代表誰父親。
應用場景:
A:成員變量
this.成員變量 本類的成員變量
super.成員變量  父類的成員變量
B:構造方法
this(...) 本類的構造方法
super(...) 父類的構造方法
C:成員方法
this.成員方法() 本類的成員方法
super.成員方法() 父類的成員方法


23:代碼塊是什麼?代碼塊的分類有哪些及每種代碼塊的作用是什麼?


              用{}括起來的代碼,就叫代碼快。


       分爲:
A:局部代碼快: 就是在方法中用{}括起來的代碼。作用是限定變量的生命週期,提高效率。


B:構造代碼快:在類中,方法外。用{}括起來的代碼。作用是把所有構造方法中相同的內容抽取出來,
定義到構造代碼塊中,將來在調用構造方法的時候,會去自動調用構造代碼塊。構造代碼快優先於構造方法。


C:靜態代碼快:在類中、方法外。用{}括起來的代碼。只不過加了static修飾。
作用是:隨着類的加載而加載,而且只加載一次的代碼。


24:一個類的實例化過程有哪些步驟?(*面試題)
Student s = new Student(); 在內存中到底執行了哪些步驟。

      1,加載Sutdent.class文件進內存(類加載器)


      2,在棧內存爲 s 變量申請一個空間


      3,在堆內存爲Student對象申請空間


     4,對類中的成員變量進行默認初始化


     5,對類中的成員變量進行顯示初始化


     6,有構造代碼塊就先執行構造代碼塊,如果沒有,則省略


     7,執行構造方法,通過構造方法對對對象數據進行初始化


    8,堆內存中的數據初始化完畢,把內存值複製給 s 變量


26:繼承是什麼?繼承的好處是什麼?Java中的繼承特點是什麼?


        繼承就是:把多個類中相同的內容提取出來,定義到一個類中。
                   然後讓這多個類和這個類產生一個關係,這多個類就具備該類的數據了。
 這種關係叫:繼承。


        繼承的好處是:提高代碼的複用性,提高了代碼的維護性,讓類與類之間產生了一個關係,是多態的前提。


        繼承的特點是:Java中類只能夠單繼承,但是可以多層繼承。

27:方法重寫和重載有什麼區別?重載可以改變返回值類型嗎?(*面試題)

        方法重寫:子類中出現和父類一模一樣的方法聲明的方法。


       方法重載:同一個類中,出現的方法名相同,參數列表不同的方法。


       重載可以改變返回值類型,因爲跟返回值無關。


28:子父類中構造方法的執行有什麼特點?爲什麼要這樣?

子類構造方法的執行,首先會去執行父類的構造方法。


因爲子類中可能直接訪問了父類的數據,父類的數據要優先於子類的數據進行初始化。


29:靜態代碼塊,構造代碼塊,構造方法的執行順序是什麼?


靜態代碼塊 -- 構造代碼塊 -- 構造方法


30:final關鍵字是什麼,可以修飾什麼,有什麼特點?

        final關鍵字:是最終意思,可以修飾類、方法、變量。
修飾類:類不可以被繼承。
修飾方法:方法不可被重寫
修飾變量:變量爲常量。

31:多態是什麼,前提是什麼?
        多態:對象在不同時刻表現出來的多種狀態。是一種編譯時期狀態和運行時期狀態不一致的現象。
成員變量:編譯看左邊,運行看左邊。
成員方法:編譯看左邊,運行看右邊。因爲,普通成員方法可以重寫,變量不可以。
靜態方法:編譯看左邊,運行看左邊。

       前提:類與類之間要有繼承關係。要有方法的重寫。父類引用指向子類對象。

32:多態的好處及弊端?如何解決多態的弊端。
;
       好處:提高了程序的可維護性(前提要有繼承保證),和擴展性。
  
      弊端:不能使用子類的特有功能。

33:什麼是抽象類?抽象類的特點和好處是什麼?


      相同的方法,有相同方法的聲明,但是方法體不一樣,只抽取方法聲明的方法,叫做抽象方法,有抽象方法的類,叫做抽象類。

      特點:
A:類或者方法必須用abstract修飾。
B:具體類在繼承抽象類的時候,要麼本身也是抽象類,要麼實現抽象類中的所有抽象方法。
C:抽象類不能被實例化。要想使用,必須按照多態的方式使用。
D:成員特點:
a:成員變量
可以是變量,也可以是常量。
b:構造方法
有構造方法,但是不能實例化。
用於子類訪問父類數據的初始化。
c:成員方法
可以有抽象方法也可以有非抽象方法。
     好處:
A:限定子類必須實現某些功能。
B:提高代碼的複用性。

    抽象類的幾個問題:

A:抽象類不能實例化,構造方法有什麼用。
用於子類訪問父類數據的初始化。

B:抽象類沒有抽象方法,有什麼意義?
限制創建對象。

C:abstract不能和哪些關鍵字共存?
final: 衝突
private: 衝突
static: 無意義

34:什麼是接口? 接口的特點?

           如果一個抽象類中的方法全部是抽象方法,那麼java就針對這種類型的抽象類,給出了一個更抽象的表達式:接口。

       特點:
A:所有的方法,都是抽象方法。
B:類實現接口
要麼本身是抽象類,要麼重寫接口中的抽象方法。
C:接口不能被實例化,要想使用,用多態。
D:成員特點
a:成員變量
只有常量,並且是靜態常量。默認修飾符:public static final
b:構造方法
沒有構造方法,子類數據的初始化默認走的是Ojbect類的構造方法
c:成員方法
全部是抽象的,有默認修飾符:public abstract

35:抽象類和接口的區別? (*面試題)

     A:成員區別
  抽象類:
成員變量:可以是變量,也可以是常量。
構造方法:有。
成員方法:有,可以是抽象的,也可以是非抽象的。

 接口:
成員變量:只能是常量。默認修飾符:publci static final
構造方法:沒有,子類數據的初始化默認走的是Ojbect類的構造方法。
成員方法:只能是抽象的,默認修飾符是:public abstract


B:類與接口的關係區別
類與類:
繼承關係,單繼承。

類與接口:
實現關係,單實現、多實現。


接口與接口:
繼承關係,單繼承、多繼承。


C:設計理念的區別
抽象類被繼承體現的是:is a的關係。抽象類中一般定義的是整個繼承結構的共性功能。
接口被實現體現的是:like a的關係。接口中一般定義的是整個繼承結構的擴展功能。


36,什麼是內部類?有什麼特點?


把類定義在其他類的內部,就被稱爲內部類。


內部類的訪問特點:
A:內部類可以直接訪問外部類的成員,包括私有。
B:外部類要訪問內部類的成員,必須創建對象。


37,爲什麼內部類訪問局部變量必須加final修飾?(*面試題)

A: 防止在使用後數據發生改變。
B: 延長變量的生命週期。
38,什麼是匿名內部類?本質是什麼?

匿名內部類就是沒有名字的內部類。


格式:
new 類名或者接口名() {
重寫方法;
};


本質:是繼承類或者實現接口的子類匿名對象。

39,==和equals()的區別? (*面試題)

A:==
a:基本類型 比較的是基本類型的值
b:引用類型 比較的是引用類型的地址值
B:equals()
只能比較引用類型。
默認比較地址值。

40,什麼是字符串?字符串的特點是什麼?

字符串:由多個字符組成的一串數據。

特點:一旦被賦值就不能被改變。(*面試題)
注意:這裏指的是字符串的內容不能發生改變。而字符串的引用是可以再次賦值的。

41:String s1 = new String("hello");和String s2 = "hello";的區別?(*面試題)

有區別,區別是:前者創建了兩個對象,後者創建了一個對象。


42:String、StringBuffer、StringBuilder的區別?(*面試題)


String:字符長度是固定的。


StringBuffer/StringBuilder:字符長度是可變的。


StringBuffer:安全的,但效率較低一些。


StringBuilder:不安全的,但效率較高一些。


StringBuffer和StringBuilder兼容。


43:什麼是基本數據包裝類?


爲了對基本類型的數據進行更多的操作的,java就針對每種基本類型的數據提供了對應的包裝類類型。


對應的類型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean


44:什麼是正則表達式?


正則表達式就是符合一定規則的字符串。

45:集合和數組有什麼區別?(*面試題)

集合: 
長度可以發生改變。
只能存儲對象類型,引用類型。
可以存儲任意類型的對象。
數組:
長度固定。
可以存儲基本類型,也可以存儲引用數據類型。
只能存儲同一種類型的元素。

46:集合有多少種? 各自的特點是什麼?

Collection
|--List 有序(存入和取出的順序一致),元素可重複
|--ArrayList
底層數據結構是數組,查詢快,增刪慢。
線程不安全,效率高。

|--Vector
底層數據結構是數組,查詢快,增刪慢。
線程安全,效率低。

|--LinkedList
底層數據結構是鏈表,查詢慢,增刪快。
線程不安全,效率高。

|--Set 無序的 元素唯一
|--HashSet
|--TreeSet

47:泛型是什麼?有什麼用?在哪裏用?泛型有什麼好處和弊端?

泛型是一種把明確數據類型的工作推遲到創建對象或者調用方法的時候纔去明確的特殊的數據類型。
能優化程序設計,解決了黃色警告線問題。
把運行時期的異常提前到了編譯時間。
避免了強制類型轉換。
好處:
優化了程序的設計,解決了黃色警告線的問題。
把運行時期的問題提前到了編譯時期間解決了。
避免了強制類型轉換。


弊端:讓類型統一了,不能存儲不同的數據類型了。


48:用迭代器遍歷集合的時候,用集合修改集合有沒有問題?如果有,怎麼解決?(*面試題)


有問題,因爲會出現併發修改異常。


解決方法有多種,比如,我們可以不通過集合來修改集合,而使用迭代器來修改集合。
像ListIterator迭代器就有添加方法。


49、HashSet如何保證元素唯一性的呢?


底層數據結構是哈希表(散列表)。具體的是由一個元素是單向鏈表的數組組成。
它依賴於兩個方法:hashCode()和equals()方法。
執行順序:
先判斷hashCode()是否相同,
如果相同
繼承執行equals()方法,看其返回值:
true:元素重複,不存儲。
false:元素不重複,存儲。
如果不同
存儲。

記住:
看到HashXxx結構的集合,就要知道,被該集合存儲的元素要重寫hashCode()和equals()方法。
而且,是自動生成的。


50、TreeSet底層數據結構是什麼?如何保證元素的唯一性的呢?


底層數據結構是二叉樹。


根據比較的返回值是否是0來決定。
如何保證元素的排序的呢?
A:自然排序 元素具備比較性
讓集合中被存儲的元素所屬的類實現Comparable接口。
B:比較器排序 集合具備比較性
在創建集合對象的時候,讓構造方法接收一個Comparator接口的子類對象。


自然排序和比較器排序的區別:
TreeSet構造函數什麼都不傳, 默認按照Comparable(接口,compareTo(T))的順序(沒有實現Comparable就報錯ClassCastException)
TreeSet如果傳入Comparator(接口compare(T1,T2)), 就優先按照Comparator



51、LinkedHashSet底層數據結構是什麼?如何保證元素的唯一性的呢?


底層由鏈表和哈希表組成。
由鏈表保證有序。
由哈希表保證唯一。

52、什麼是可變參數?


針對在寫一個方法的時候,不知道具體要有多少個形式參數的時候。
  java提供了可變參數的用法。


注意:
A:變量其實是該數據類型的一個數組。
B:形式參數如果有多個的話,可變參數只能是最後一個。
C:數據類型要一致。

53、Map和Collection集合的區別?(*面試題)

A:Map集合存儲的是鍵值對形式的元素。
 Collection集合存儲的是單個的元素。

B:Map集合的鍵是唯一的。
 Collection的子接口Set集合元素是唯一的。

C:Map集合的值是可以重複的。
 Collection的子接口List集合的元素是可以重複的。
D:Map集合的數據結構僅對鍵有效,對值無效.
 Collection的數據結構是針對元素有效的

54、Hashtable和HashMap的區別?(面試題)

A:HashMap 線程不安全,效率高。允許null鍵和null值。

B:Hashtable 線程安全,效率低。不允許null鍵和null值。

55、Collection和Collections有什麼區別?

Collection:是集合的頂層接口,定義了集合的通用方法。

Collections:是一個工具類,裏面定義了對集合進行操作的一些常見方法。

56、什麼是異常?異常有哪幾種?各有什麼特點?

程序出現了不正常的情況,就是異常。


異常的繼承體系結構:
Throwable
|--Error 嚴重的問題,一般我們解決不了。
|--Exception
|--RuntimeException 運行時期異常,這種問題一般要修正代碼。
|--非RuntimeException 編譯時期異常,必須進行處理,否則代碼不能夠通過。

57、throws和throw的區別? (*面試題)

throws
位置:在方法()後面,跟的是類名,後面可以跟多個異常類名,並且用逗號隔開
表示拋出異常,交給調用者去處理
如果後面根據的是RuntimeException及其子類,那麼,該方法可以不用處理。
如果後面根據的是Exception及其子類,那麼,必須要編寫代碼進行處理,或者調用的時候拋出。
throw
位置:在方法中,跟的對象名稱。後面只能跟一個異常對象
表示拋出異常,由方法體內語句處理
如果方法中,有throw拋出RuntimeException及其子類,那麼,聲明上可以沒有throws。
如果方法中,有throw拋出Exception及其子類,那麼,聲明上必須有throws。

58、final、finally、finalize的區別?(*面試題)

final:是最終的意思,用於修飾類、變量、和方法。修飾類的時候,類是最終類,不可以被繼承。
修飾變量的時候,變量爲常量,不可以被改變。修飾方法的時候,方法不能被重寫


finally:是異常處理的一部分,它裏面的代碼永遠會執行(前提:jvm沒退出),一般用於釋放資源。


finalize:是object類的一個方法,用於垃圾處理。


59、什麼是遞歸?使用遞歸需要注意哪些?


遞歸就是方法定義中調用方法本身的現象。


A:遞歸一定要有出口,否則就是死遞歸。
B:遞歸的次數不能太多,否則內存溢出。
C:構造方法不能遞歸使用。


60、基本的IO流有哪些?(*面試題)


字節流:InputStream、OutputStream、FileInputStream、FileOutputStream、


字符流:Writer、Reader、FileWriter、FileReader、


高效字節流:BufferedInputStream、BufferedOutputStream


高效字符流:BufferedWriter、BufferedReader


最開始的時候,只有字節流,但是後來由於中文字符或者其他字符的出現,用兩個字節才能表示。


如果用字節流也是可以讀寫字符文件的數據的,但是比較麻煩。爲了簡化這種操作,就提供了字符流。


61、flush()和close()的區別?(*面試題)


flush():刷新緩衝區,流對象還可以繼續使用。


close():釋放流資源,但是會先刷新一次緩衝區,操作完畢後,流對象不可以再使用。


62、什麼是多線程?進程和線程的區別是什麼?


多線程就是應用程序的多條執行路徑。


進程:正在運行的應用程序,每個進程的具備獨立的運行空間。


線程:是進程的執行單元,執行路徑。如果是多個線程,那麼,這多個線程共享同一個進程資源。


63、啓動線程調用的是run()還是start()方法?run()和start()的區別是什麼?(*面試題)

啓動線程調用的是start()
run()封裝了被線程執行的代碼,start()是啓動線程並調用run()方法。

64、多線程有幾種實現方案?分別是什麼?如何操作?(*面試題)

多線程有兩種實現,分別是:

1,繼承Thread類
自定義類繼承Thread類,在類中重寫run()方法,測試類中創建自定義類對象,並調用start()方法


2,實現Runnable接口
自定義類實現Runnable接口,重寫run()方法,測試類中創建自定義對象,
創建Thread對象,把自定義對象作爲構造參數傳遞。調用Thread類的start()方法。


65、線程的生命週期? (*面試題)

新建: 創建線程對象
就緒: 具備cup執行資格,沒有執行權,隨時準備執行
運行: 具備執行資格,執行權,執行run()中的代碼
堵塞: 是當線程運行到符合某個我們定義的條件時,它會停止下來等待喚醒
死亡: run()結束了

66、多線程爲什麼會出現安全問題?怎麼解決呢?(*面試題)

如果滿足以下條件,那麼就會出現安全問題:

A:是多線程程序。
B:有共享的數據。 C:針對共享數據有多條語句操作。
 
只要我們把多線程環境中,把操作共享數據的操作,變成單線程就沒有問題了。
Java針對這種情況,就提供了同步技術:
A:同步代碼塊
B:同步方法
C:JDK5以後的Lock鎖
67、同步的鎖對象分別是?(*面試題)
代碼塊:任意對象
方法:this

靜態方法:類名.class


68、sleep()和wait()的區別?(*面試題)

sleep():必須指定時間,不釋放鎖對象。
wait():可以指定時間,也可以不指定。釋放鎖對象。

69、線程死鎖是什麼,爲什麼有死鎖,怎麼解決死鎖?(*面試題)

        爲了解決程序因佔用資源,出現資源爭搶,而出現的程序進入等待的狀態(死鎖)。
        舉例:有A和B兩個線程,有CD 兩把鎖, A和B嵌套CD鎖,A線程中有C,D鎖,B線程中有D C兩把鎖,當兩個線程運行時,就可能會出現死鎖導致
程序停滯的情況。
        怎麼解決:真正意義上來說,死鎖是不能被解決的,死鎖是多線程中的一個需要避免的重大的問題,當我們在編寫程序時,可以給共享的資源加上另外一
個把鎖,控制資源的動態,同時可以設置線程的優先級使線程之間協調合理的利用CPU的時間。

70、線程間的通信是什麼?


不同種類的線程針對同一個資源的操作。



71、什麼是網絡編程?


用編程語言來實現計算機的資源共享和信息傳遞,就叫做網絡編程。


72、網絡通信三要素是什麼? (*面試題)

A:IP地址
計算機在網絡中的唯一標識。
現在使用的是:"點分十進制"
B:端口
應用程序的的標記。
C:協議
通信的規則。

73、UDP和TCP的區別? (*面試題)

UDP:不建立連接,數據打包傳輸,數據有限制,數據不可靠,速度快。
TCP:建立連接,數據無限制,數據可靠,速度慢。


74、反射是什麼?反射獲取字節碼文件的三種方式?反射的好處?(*面試題)


        在運行狀態下,通過class文件對象(Class的對象),去使用構造方法,成員變量,成員方法。就是反射。
        3種方法:
                A.用Object類的getClass方法得到。
                B.用任意數據類型的靜態class屬性可以得到
                C.用Class類的靜態方法forName(String className)方法得到
        好處:只要有一個類或者一個類的對象,就可以得到這個類或對象的所有屬性和方法。包括私有的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章