我遇到的Java面試題彙總(2019實習篇)

2018年Java研發工程師面試題

  • 秋招也已經結束,來總結一下自己在這段時間所遇到的面試題吧!這些題都是作者親身經歷所遇到的。自認爲比較菜,所以碰了很多壁!在這兒分享我的求職經歷!希望對你有所幫助!想走Java研發方向的話,主要還是要掌握三個重要模塊:
  • Java基礎、數據庫基礎、Linux基礎
  • 這三個模塊是我面試了大多公司的筆試題面試題都會涉及到的!還有的就是框架方面,這裏我們暫且不講!

Java實習生面試(Java基礎)

  • 在找正式工作前所要面對的無疑是找實習,而找實習所遇到的就相對要簡單一些!考的也都相對於基礎一些,但是有的公司要求有些奇葩,不僅要求你要會Java ,還要求你會前端,JavaScript ,Linux 等相關知識!想想實習生要求就如此,那正式的可想而知:
    實習一般的小的公司是直接面試,問一些基礎的問題,大一點的公司都會做一套筆試題,然後再進行面試,問題大致也就以下:

1.Java有哪些基本數據類型:

八個基本類型:

項目 位數 類型 描述
boolean 1 布爾型 boolean數據類型表示一位的信息;
byte 8 整型 byte 數據類型是8位、有符號的,以二進制補碼錶示的整數;
char 16 字符型 char類型是一個單一的 16 位 Unicode 字符;
short 16 整型 short 數據類型是 16 位、有符號的以二進制補碼錶示的整數
int 32 整型 int 數據類型是32位、有符號的以二進制補碼錶示的整數;
float 32 浮點型 float 數據類型是單精度、32位、符合IEEE 754標準的浮點數;
long 64 整型 long 數據類型是 64 位、有符號的以二進制補碼錶示的整數;
double 64 浮點型 double 數據類型是雙精度、64 位、符合IEEE 754標準的浮點數;

2.自動拆箱與自動裝箱:

自動裝箱:簡單來說就是以上八種基本類型在需要的時候自動裝箱爲封裝類型的過程。
自動拆箱:與之對應的就是數據從封裝類型自動轉換爲基本類型的過程!

//例如:
Integer x = 2;     // 裝箱
int y = x;         // 拆箱

八種數據類型拆箱和裝箱對應表:

基本類型 封裝類型
int Integer
char Character
boolean Boolean
long Long
short Short
float Float
byte Byte
double Double

3.關於封裝類型Integer的問題辨析!

  • a.由於Integer變量實際上是對一個Integer對象的引用,所以兩個new生成的變量永遠都不會相等;
Integer i= new Integer(100);
Integer j= new Integer(100);
System.out.print(i==j); //false

b.Integer變量和int變量比較時,只要兩者的值是相同的,結果就爲true;

Integer i= new Integer(100);
int j= 100;
System.out.print(i==j); //true

c.非new生成的Integer變量和new Integer()生成的變量也不相等;

Integer i= new Integer(100);
Integer j= 100;
System.out.print(i==j); //false

d.對於兩個非new生成的Integer對象,進行比較時,如果兩個變量值在-128到127之間時爲true,否則爲false;

Integer i= 100;
Integer j= 100;
System.out.print(i==j); //true
Integer i= 128;
Integer j= 128;
System.out.print(i==j); //false

4.面向對象的三大特徵:繼承、多態 、封裝

  • a.繼承:就是指可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。它支持按級分類的概念。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。 通過繼承創建的新類稱爲“子類”或“派生類”,被繼承的類稱爲“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。繼承概念的實現方式有二類:實現繼承與接口繼承。實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力;
  • b.多態:就是指一個類實例的相同方法在不同情形有不同表現形式。多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味着,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。
  • c.封裝:就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。封裝是面向對象的特徵之一,是對象和類概念的主要特性。 簡單的說,一個類就是一個封裝了數據以及操作這些數據的代碼的邏輯實體。在一個對象內部,某些代碼或某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。
  • 要求能簡單描述每個特徵

5.int和Integer區別:

  • Integer是int的包裝類,int則是java中的一種基本數據類型;
  • Integer變量必須實例化後才能使用,而int不需要;
  • Integer實際是對象的引用,當new一個Integer時,實際上是生成一個指針指向此對象;而int則是直接存儲數據值;
  • Integer默認的值是null,而int默認值爲0;

6.Java中的equal和==的區別是什麼:

  • ==:運用在基本類型的時候,通過比較它們實際的值是否相同;而用在比較引用型時,則是比較兩個引用的地址是否相同,也就是是否指向同一個對象;
  • Equal方法:是java.lang.Object的方法,也就是所有Java類都會有的方法。他可以由程序員覆蓋重寫,通過自定義方式來判斷兩者是否相等。對於字符串java.lang.String類來說,它的equal方法用來比較兩個字符串的字符序列是否完全相等;

7.接口和抽象類的區別:(頻率較高)

  • 抽象類:聲明方法的存在而不去實現它的類,用於創建一個體現某些基本行爲的類,併爲該類聲明方法;但不能在該類中實現的情況;
  • 接口:是抽象類的變體,在接口中所有方法都是抽象的,多繼承性可通過實現接口而獲得;
  • 最大的區別:一個實現類只能繼承一個抽象類,但可以繼承多個接口;抽象類是一種功能不全的類,接口只是一個抽象方法聲明和靜態不能修改的數據的集合,兩者都不能被實例化。

8.Java變量:

靜態變量,成員變量,局部變量三種;

  • 靜態變量是指在類中用static修飾的變量,它的生存週期由類決定;
  • 成員變量則是類中沒有用static修飾的變量,他的生命週期由對象決定;
  • 局部變量則是定義在方法裏的變量,方法的參數或代碼塊裏定義的變量,它們作用的範圍用{ } 來界定;

9.Public、private、protect和默認的區別:

  • private表示成員是私有的,只有自身可以訪問;
  • public表示成員公開,所有其他類都可以訪問;
  • protect表示受保護權限,體現在繼承,即子類可以訪問父類受保護成員,同事相同堡壘的其他類可以訪問protect成員;
  • 無修飾詞(默認)表示包訪問權限,同一個包內可以訪問;

10.String、StringBuffer和StringBuilder存在的作用:

  • String 字符串常量;一旦聲明就不可改變;String類是final類不可繼承;
  • StringBuffer 字符串變量(線程安全)類中提供的方法都是同步方法;
  • StringBuilder 字符串變量(非線程安全)類中方法屬於異步方法;

11.Servlet的生命週期:

  • Servlet是服務器端處理HTTP請求的基本組成單元,包括JSP,過濾器等在內的許多技術都給予servlet實現;
  • 生命週期爲:創建、初始化、提供服務、銷燬;

12.面向對象的五大設計原則:

  • a.單一職責原則SRP(Single Responsibility Principle)
    是指一個類的功能要單一,不能包羅萬象。如同一個人一樣,分配的工作不能太多,否則一天到晚雖然忙忙碌碌的,但效率卻高不起來。
  • b.開放封閉原則OCP(Open-Close Principle)
    一個模塊在擴展性方面應該是開放的而在更改性方面應該是封閉的。比如:一個網絡模塊,原來只服務端功能,而現在要加入客戶端功能,
    那麼應當在不用修改服務端功能代碼的前提下,就能夠增加客戶端功能的實現代碼,這要求在設計之初,就應當將服務端和客戶端分開,公共部分抽象出來。
  • c.替換原則(the Liskov Substitution Principle LSP)
    子類應當可以替換父類並出現在父類能夠出現的任何地方。比如:公司搞年度晚會,所有員工可以參加抽獎,那麼不管是老員工還是新員工,
    也不管是總部員工還是外派員工,都應當可以參加抽獎,否則這公司就不和諧了。
  • d.依賴原則(the Dependency Inversion Principle DIP) 具體依賴抽象,上層依賴下層。假設B是較A低的模塊,但B需要使用到A的功能,
    這個時候,B不應當直接使用A中的具體類: 而應當由B定義一抽象接口,並由A來實現這個抽象接口,B只使用這個抽象接口:這樣就達到
    了依賴倒置的目的,B也解除了對A的依賴,反過來是A依賴於B定義的抽象接口。通過上層模塊難以避免依賴下層模塊,假如B也直接依賴A的實現,那麼就可能造成循環依賴。一個常見的問題就是編譯A模塊時需要直接包含到B模塊的cpp文件,而編譯B時同樣要直接包含到A的cpp文件。
  • e.接口分離原則(the Interface Segregation Principle ISP)
    模塊間要通過抽象接口隔離開,而不是通過具體的類強耦合起來.

13.Error和Exception有什麼區別?

  • Error表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
  • Exception表示一種設計或實現問題。也就是說,他表示如果程序運行正常,從不會發生的情況;

14.Java的變量分爲哪兩大類數據類型:

  • 基本數據類型8種:byte \ short \ int \ long \ float \ double \ Boolean \ char
  • 引用型數據類型:類(class)、接口(interface)、數組;
  • 兩者區別:引用型數據類型存放的是數據所在的地址,而基本數據類型是直接存儲數據的值;

15.數組和集合的區別:

  • a.數組聲明瞭它容納的元素類型,而集合不聲明。這是由於集合是以Object形式來存儲它們的元素;
  • b.一個數組實例具有固定的大小,不能伸縮。集合則可以根據需要動態改變大小。
  • c.數組是一種可讀/可寫的數據結構,沒有辦法創建一個只讀數組。然而可以使用集合提供的ReadOnly只讀方式來使用集合;該方法將返回一個集合的只讀版本;

16.常考的幾個基礎程序,要求務必熟記:

1.各進制間轉換:
public static void main(String args[]) { 
@SuppressWarnings("resource") 
Scanner input = new Scanner(System.in); 
System.out.println("請輸入十進制數!"); 
Integer i = input.nextInt();
String binary = Integer.toBinaryString(i);  //十進制轉二進制
String octal = Integer.toOctalString(i);    //十進制轉八進制
String hex = Integer.toHexString(i);        //十進制轉十六進制
System.out.println("i的二進制數是:"+binary);
System.out.println("i的八進制數是:"+octal);
System.out.println("i的十六進制數是:"+hex);
System.out.println("請輸入進制數!"); 
Integer j = input.nextInt(); 
int t = Integer.parseInt(String.valueOf(j),2);    //二進制轉十進制
int b = Integer.parseInt(String.valueOf(j),8);    //八進制轉十進制
int s = Integer.parseInt(String.valueOf(j),16); //十六進制轉十進制
System.out.println("j的十進制數是:"+t); 
System.out.println("j的十進制數是:"+b); 
System.out.println("j的十進制數是:"+s); 
input.close();          //必須要寫
   }           
2.遞歸調用,循環輸出數組:
public static void main(String args[]) {
int a[] = new int[20]; 
for(int i = 0; i < 20; i++) {
a[i] = getRe(i);  }
System.out.println("數組是:"); 
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + "\t");}	}
 private static int getRe(int n){
 if (n==0||n==1) {return 2;}
else return getRe(n-2) + getRe(n-1); 
} 
3.冒泡排序:
  //進行冒泡排序(升序排列)
  int temp = 0; 
  //如果length太大,提出來單獨定義,有利於提高程序效率!
  //爲養成良好的代碼習慣,建議將length提出來
  int m = a.length;
	     for(int j = 0 ;j < m ;j++){
	     for(int k = 0;k < m-j-1 ;k++) {
	    		if (a[k+1] < a[k]) {      
	    			temp = a[k];
	    			a[k] = a[k+1];
	    			a[k+1] = temp;
	    		} } } 
4.定義數組並依次輸出:
@SuppressWarnings("resource")
		  Scanner input = new Scanner(System.in);
	     int i = input.nextInt();     //輸入數組長度
	     int []a = new int[i];        //定義數組
	     System.out.println("請輸入數組數據");
	     @SuppressWarnings("resource")
		 Scanner in = new Scanner(System.in);
	     for(int j = 0; j < a.length; j++) {
	    	 a[j]=in.nextInt();  }
	     System.out.print("未排序的數組是:");
	     for(int k = 0; k < a.length; k++) {
	    	 System.out.print(a[k]+"  ");	  }    
5.進行字符串反轉:
System.out.println("反轉後的字符串是:");
for(int i = str.length(); i > 0; i--){
System.out.print(str.charAt(i-1));}
字符串替換(將所有c換爲0.0):  
System.out.println(str.replaceAll("c", "0.0"));
6.獲取當前時間:
public static void main(String args[]) {
	Date dat = new Date();
	int y = dat.getYear();
	int M = dat.getMonth();
	int d = dat.getDay();
	int h = dat.getHours();
	int m = dat.getMinutes();
	int s = dat.getSeconds();
System.out.println("當前時間是"+y+"年"+M+"月"+d+"日"+h+":"+m+":"+s);	}

Java實習生面試(數據庫基礎)

關於數據庫的筆試題面試題考的最關鍵的還是運用,要麼寫出語句讓你說明它的作用,要麼給你一個要求讓你用數據庫語句寫出來!關於一些理論性的問題以下是我遇到的。

1.索引:

索引是對數據庫表中一或多個列的值進行排序的結構,是幫助數據庫高效獲取數據的數據結構;簡單理解爲數據庫中加快檢索表中數據的方法;

2.事務:

是併發控制的基本單位,所謂事務,他就是個操作序列,這些操作要麼不執行,要麼全部執行,是一個不可分割的工作單位;是數據庫維護數據一致性的單位,在每個事務結束是,都能保持數據一致性;

3.Drop、delete與truncate的區別:

三者都表示刪除;
Delete和truncate只刪除表中的數據,不刪除表的數據結構;
執行速度:drop>truncate>delete
一般在刪除整個表的時候用drop,只刪除部分數據行的時候用delete,而刪除表中所有數據的時候用truncate;

4.視圖:

視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增、改、查、操作;優點是獲取數據更容易;

5.數據庫三大範式:

第一範式(1NF):數據庫表中的字段都是單一屬性的,不可在分的;這個單一屬性由基本類型構成,包括整型,實數,字符型,邏輯型,日期型等;
第二範式(2NF):數據庫表中不存在非關鍵字段對任意候選關鍵字的部分函數依賴;即所有非關鍵字段都完全依賴於任意一組候選關鍵字;
第三範式(3NF):在第二範式的基礎上,數據庫表中不存在非關鍵字段對任意候選字段傳遞函數依賴;

6.SQL常用語句:

1.create table lee(id number primary key not null)       建表;
2.create view_name lee select *from Table_name;          建立視圖;
3.create unique index lee_name on lee(name);            建立索引;
4.drop index lee_name on lee;                            刪除索引
5.insert into lee values(“12”,“一班”,“”);            插入數據
6.update lee set 年齡=“20” where 姓名=“李凡”and 學號“1234”   數據更新;
7.select * from lee;                              查詢lee表中的數據;
8.select * into 學生 from lee;        查詢lee表中的數據並插入到學生表

7.主鍵約束和唯一性約束的區別:

A.主鍵約束在表中定義一個主鍵值,這是唯一確定表中每一行數據的標識符。該約束強制實體完整性。一個表中最多隻有一個主鍵,且主鍵列不允許空值。
B.UNIQUE(唯一性)約束指定表中某個列或多個列不能有相同的兩列或兩行以上的數據存在。這種約束通過實現唯一性索引來強制實體完整性。當表中已經有了一個主鍵約束時,如果要在其他列上實現實體完整性,又因爲表中不能有兩個或兩個以上的主鍵約束,所以只能通過創建UNIQUE約束來實現。一般的,把UNIQUE約束稱爲候選的主鍵約束。

8. 數據庫的三級模式:

A.邏輯模式:也稱模式,它是對數據庫中數據的整體邏輯結構和特徵的描述;
B.外模式:也稱子模式,它是對各個用戶或程序所涉及到的數據的邏輯結構和數據特徵的描述。
C.內模式:也成存儲模式或者物理模式,它是對數據的內部表示或底層描述;

9. 數據模型三大要素:

數據結構、數據操作、數據約束條件;

10.拓展一點數據結構 的

1.算法:

是對特定問題求解步驟的一種描述。它是指令的有效序列,其中每條指令表示一個或者多個操作。
算法應具有以下五種特性:有窮性、確定性、有效性、輸入、輸出;
所要達到的目標:正確性、可讀性、健壯性、高效性;

2.棧和隊列的區別

棧:先進後出;
隊列:先進先出;

3.3種遍歷:根據遍歷反推結構,根據結構寫出遍歷;

先序遍歷:根左右; 中序遍歷:左根右; 後續遍歷:左右根;

Java實習生面試(Linux基礎)

Linux可以說是博大精深,關於Linux的面試題遇到的不是很多,但是如果想走後端開發的,Linux還是很重要的!作者目前對Linux的研究還僅限於cd 和ls 。
在這就附上兩個很不錯的網址吧,自認爲很適合新手學習Linux基礎,也花不了多少時間。

1.Linux基礎入門鏈接:

實驗樓Linux學習,作者親驗

2.Linux基礎命令:

實驗樓Linux基礎命令學習,作者親驗

4.最後來分享兩個很好的大佬的知識庫:

不論是學習還是面經都是很不錯的選擇,後悔沒有在求職之前好好看,在這分享出來給大家:
寶庫一
寶庫二

後面還會分享作者秋招遇到的面試筆試題(或許還有春招),簡歷投了一打,面試了一堆
這是秋招篇Java研發工程師面試題(秋招篇)

聲明:本文所有面試的問題都是作者在實習求職期間自己遇到並總結出來的面經,答案有的摘自博客有的看書所得,不一定都能適用,希望對後來的小夥伴們有所幫助。真心感謝網上分享經驗的大佬們!才疏學淺,如有錯誤,望指正!謝謝!

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