您現在的位置是:首頁 > 人文

Java開發面試過程中的問題整理一

由 程式設計俠 發表于 人文2022-04-16
簡介(1)、隱式裝載,程式在執行過程中當碰到透過new 等方式生成物件時,隱式呼叫類裝載器載入對應的類到jvm中,比如Dog dog = new Dog()

一、Java基礎

Java開發面試過程中的問題整理一

1、Java中兩種資料型別(為後面進一步提問做鋪墊)

(1)基本資料型別,分為boolean、byte、int、char、long、short、double、float;

(2)引用資料型別 ,分為陣列、類、介面。

擴充套件:Java中引入了基本資料型別,但是為了能夠將這些基本資料型別當成物件操作,Java為每一個基本資料型別都引入了對應的包裝型別(wrapper class),int的包裝類就是Integer,從Java 5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。

基本資料型別: boolean,char,byte,short,int,long,float,double

封裝類型別: Boolean,Character,Byte,Short,Integer,Long,Float,Double

2、java中==和eqauls()的區別

==分兩類分析,既可以比較基本型別也可以比較引用型別,對於基本型別來說是比較的數值。對於引用型別來說比較的記憶體地址值;equals是屬於java。lang。Object類裡面的方法,Object裡的equals裡預設的是雙等於==。分兩種情況討論:一種是自定義類,看自定義類有沒有重寫equals方法,通常情況下,如果重寫了equals則比較的是類中相應屬性是否相等。如果沒有重寫equals方法,則仍然使用==比較的是地址。

總結、:

== :

基本型別:比較值是否相等

引用型別:比較的就是記憶體地址是否相同

equals :

引用型別:預設情況下,比較的是地址值。可以進行重寫,使其比較物件的值是否相等。

3、說說int和Integer有何區別

(1)Integer是int的包裝類;int是基本資料型別;

(2)Integer變數必須例項化後才能使用;int變數不需要;

(3)Integer實際是物件的引用,指向此new的Integer物件;int是直接儲存資料值 ;

(4)Integer的預設值是null;int的預設值是0。

4、switch中能否使用string型別的引數作為變數(涉及到jdk版本的理解)

在JDK1。7之前,switch只能支援byte、short、char、int、float、double或者其對應的封裝類以及Enum型別。JDK1。7開始支援String。當字串不會頻繁改變時可以用列舉來代替String。

5、說明ArrayList和LinkedList的區別和優缺點,在哪些場景會使用?

區別:

(1)ArrayList是實現了基於動態陣列的資料結構,LinkedList是基於連結串列結構;

(2)對於隨機訪問的get和set方法,ArrayList要優於LinkedList,因為LinkedList要移動指標;

(3)對於新增和刪除操作add和remove,LinkedList比較佔優勢,因為ArrayList要移動資料;

各自優缺點:

(1)對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部陣列中增加一項,指向所新增的元素,偶爾可能會導致對陣列重新進行分配;而對LinkedList而言,這個開銷是 統一的,分配一個內部Entry物件。

(2)在ArrayList集合中新增或者刪除一個元素時,當前的列表移動元素後面所有的元素都會被移動。而LinkedList集合中新增或者刪除一個元素的開銷是固定的。

(3)LinkedList集合不支援 高效的隨機隨機訪問(RandomAccess),因為可能產生二次項的行為。

(4)ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間。

應用場景:

ArrayList使用在查詢比較多,但是插入和刪除比較少的情況,而LinkedList用在查詢比較少而插入刪除比較多的情況

6、實現多執行緒的幾種方式,多執行緒的應用場景有哪些?

(1)、繼承Thread類,重寫run方法

(2)、實現Runnable介面,重寫run方法。【可以避免由於Java的單繼承特性而帶來的侷限。適合多個執行緒去處理同一資源的情況】

(3)、實現Callable介面,重寫call方法。【有返回值,允許丟擲異常】

(4)、使用執行緒池【減少建立新執行緒的時間,重複利用執行緒池中執行緒,降低資源消耗,可有返回值】

7、${}和#{}的區別

使用#{}:

(1)、傳入引數,sql在解析的時候會加上“ ”,當成字串來解析,如 id = “id”;

(2)、#{}能夠很大程度上防止sql注入;

使用${}:

(1)、傳入資料直接顯示在生成的sql中,sql在解析的時候值為id = id。

(2)、${}方式無法防止sql注入

最後:能用#{}時儘量用#{},但有些場合需要使用$。

注意MyBatis排序時使用order by 動態引數時需要注意,用$而不是#(#會自動拼接符號)

8、描述一下JVM載入class檔案的原理機制和特點。

Java中的所有類,都需要由類載入器裝載到JVM中才能執行。JVM中類的載入是由類載入器(ClassLoader)和它的子類來實現的。在我們使用一個類之前,JVM需要先將該類的位元組碼檔案(。class檔案)從磁碟、網路或其他來源載入到記憶體中(載入Class檔案到JVM),並對位元組碼進行解析生成對應的Class物件,這就是類載入器的功能。我們可以利用類載入器,實現類的動態載入。在寫程式的時候,我們幾乎不需要關心類的載入,因為這些都是隱式裝載的,除非我們有特殊的用法,像是反射,就需要顯式的載入所需要的類。

Java類的載入是動態的,它並不會一次性將所有類全部載入後再執行,而是保證程式執行的基礎類(像是基類)完全載入到jvm中,至於其他類,則在需要的時候才載入。這當然就是為了節省記憶體開銷。

進一步提問:類載入的方式有幾種?區別是什麼?

類裝載方式有兩類:隱式裝載和顯示裝載,其中顯示裝載又分2種方式。

(1)、隱式裝載,程式在執行過程中當碰到透過new 等方式生成物件時,隱式呼叫類裝載器載入對應的類到jvm中,比如

Dog dog = new Dog();【第一種方式】

(2)、顯式裝載,

【第二種方式】使用Class。forName()透過反射載入型別,並建立物件例項,比如

Class clazz = Class。forName(“Dog”);

Object dog =clazz。newInstance();

如果無法找到Dog,則丟擲ClassNotFoundException。

【第三種方式】使用某個ClassLoader例項的loadClass()方法

Class clazz = classLoader。loadClass(“Dog”);

Object dog=clazz。newInstance();

如果無法找到Dog,則丟擲ClassNotFoundException。

區別:

方式1和2使用的類載入器是相同的,都是當前類載入器(即:this。getClass。getClassLoader)。

方式3由使用者指定類載入器。如果需要在當前類路徑以外尋找類,則只能採用方式3。即第3種方式載入的類與當前類分屬不同的名稱空間。

方式1是靜態載入,方式2和3是動態載入。

進一步提問:java內建的類載入器(ClassLoader)有哪些,簡述一下類載入器工作原理

Java的類載入器有三個:

第一種是Bootstrap Loader(引導類載入器)。它的實現依賴於底層作業系統,由C編寫而成,沒有繼承於ClassLoader類。根類載入器從系統屬性sun。boot。class。path所指定的目錄中載入類庫。預設為jre目錄下的lib目錄下的class檔案,該載入器沒有父載入器。負責載入虛擬機器的核心類庫,如java。lang。*。Object類就是由根類載入器載入的。

第二種是Extended Loader(標準擴充套件類載入器)。它的父載入器為根類載入器。由java編寫而成,是ClassLoader的子類。它從java。ext。dirs中載入類庫,或者從JDK安裝目錄jre\lib\ext子目錄下載入類庫。如果把使用者建立的jar檔案放在該目錄下,也會自動由擴充套件類載入器載入。

第三種是AppClass Loader(應用程式類路徑類載入器)。它的父載入器為擴充套件類載入器。由java編寫而成,是ClassLoader的子類,它從環境變數classpath或者系統屬性java。class。path所指定的目錄中載入類,是使用者自定義的類載入器的預設父載入器。

載入類時,會以Bootstrap Loader→Extended Loader→AppClass Loader的順序來尋找類,如果找不到,就會丟出NoClassDefFoundError。

Java開發面試過程中的問題整理一

9、在一個類中,聲明瞭若干個static方法和非static方法,宣告的static方法能否直接訪問宣告的非static方法?

static方法不能直接訪問非static方法,因為static方法是屬於這個類本身的一個方法,在編譯期間就已經確定了;而非static方法是屬於這個類的物件的方法,需要在例項化之後才能訪問到。即:static方法呼叫時不需要建立物件,可以直接呼叫,非static方法是要與物件關聯在一起的,必須建立一個物件後,才可以在該物件上進行方法呼叫,若在static方法中訪問非static方法,非static方法不知道關聯到哪個物件上,將不能透過編譯。

進一步提問:說一下靜態方法和非靜態方法都是在什麼時候被裝載到記憶體中的?

靜態方法(Static Method)與靜態成員變數一樣,屬於類本身,在類裝載的時候被裝載到記憶體(Memory),不自動進行銷燬,會一直存在於記憶體中,直到JVM關閉。

非靜態方法(Non-Static Method)又叫例項化方法,屬於例項物件,例項化後才會分配記憶體,必須透過類的例項來引用。不會常駐記憶體,當例項物件被JVM 回收之後,也跟著消失。

進一步提問:靜態方法怎樣訪問非靜態方法?

靜態方法不能直接使用本類的非靜態方法

解決方式有三種

(1)、兩個方法都改成非靜態

(2)、兩個方法都改成靜態

(3)、先建立類的例項,然後靜態方法再呼叫這個例項的非靜態方法

10、在Java中,物件什麼時候可以被垃圾回收?

Java垃圾回收不是實時的,垃圾回收器的作用是查詢和回收(清理)無用的物件。以便讓JVM更有效的使用記憶體。垃圾回收器的執行時間是不確定的,由JVM決定,在執行時是間歇執行的。也可以透過System。gc()來強制回收垃圾,但是這個命令下達後JVM不一定會立即響應執行,但間隔一小段時間基本都會執行。

11、一個漢字佔幾個位元組

中文在不同編碼下佔不定長的 2~4個位元組。注意在utf-16中佔用兩個位元組,在java 執行時用UTF-16編碼在轉碼的時候會在前面加上表示位元組順序的字元,這個字元稱為”零寬度非換行空格”(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。FEFF佔用兩個位元組。

Java開發面試過程中的問題整理一

12、專案中使用Maven進行構建,有哪些優勢?你使用過哪些maven命令?說一下maven中本地倉庫和遠端倉庫的區別和聯絡。

優點:

(1)建立專案,自動關聯和下載依賴的jar包,統一維護jar包

(2)升級框架版本方便

常用 Maven 命令:

(1)、安裝專案到本地倉庫:mvn install

(2)、建立maven專案:mvn archetype:generate

(3)、驗證專案是否正確:mvn validate

(4)、maven 打包:mvn package

(5)、只打jar包:mvn jar:jar

(6)、生成原始碼jar包:mvn source:jar

(7)、產生應用需要的任何額外的原始碼:mvn generate-sources

(8)、編譯原始碼: mvn compile

(9)、編譯測試程式碼:mvn test-compile

(10)、執行測試:mvn test

(11)、執行檢查:mvn verify

(12)、清理maven專案:mvn clean

Maven倉庫關係:

maven的倉庫只有兩大類:1。本地倉庫 2。遠端倉庫,在遠端倉庫中又分成了3種:2。1 中央倉庫 2。2 私服 2。3 其它公共庫

執行Maven的時候,Maven所需要的任何構件都是直接從本地倉庫獲取的。如果本地倉庫沒有,它會首先嚐試從遠端倉庫下載構件至本地倉庫,然後再使用本地倉庫的構件。

Java開發面試過程中的問題整理一

13、Thread。sleep(0)有沒有實際作用

觸發作業系統立刻重新進行一次CPU競爭,作業系統重新計算執行緒的優先順序(包括當前執行緒)。競爭的結果也許是當前執行緒仍然獲得CPU控制權,也許會換成別的執行緒獲得CPU控制權。

二、前端框架

1、在專案中使用過哪些前端框架?

Vue(用於構建使用者介面的 漸進式框架,特點:輕量級、雙向資料繫結、元件化)、

React(構建使用者介面的 JAVASCRIPT 庫,特點:只負責顯示、宣告式框架、資料驅動DOM)、

Angular(前端JS框架,核心:MVVM、模組化、自動化雙向資料繫結、語義化標籤、依賴注入等)、

QucikUI(企業級web前端開發解決方案)、

Layui(前端 UI 框架)、

Avalon(前端MVVM框架)、

還有Dojo、Ember、Aurelia等

2、js中如何檢視某變數的資料型別?可以檢視的資料型別有哪些?

使用typeof檢視變數的資料型別。

javascript共有6種資料型別:

基本型別5種:number、string、boolean、null、undefined。引用型別1種:object

typeof檢測返回6種:undefined、boolean、string、number、object、function

Java開發面試過程中的問題整理一

3、前端進行檔案下載時,能不能用ajax向後端發起請求?

Ajax不能實現檔案下載功能

原因:ajax的返回值是json,text,html,xml型別,或者可以說ajax的接收型別只能是String字串,不是流型別,所以無法實現檔案下載。但用aja仍然可以獲得檔案的內容(可以讀取到返回的response,但只是讀取而已),該檔案將被保留在記憶體中,無法將檔案儲存到磁碟,這是因為javascript無法和磁碟進行互動,否則這會是一個嚴重的安全問題,js無法呼叫瀏覽器的下載處理機制和程式,會被瀏覽器阻塞。

4、如何解決前後端互動過程中特殊字元的傳參(比如中文、特殊符號等)?

(這個問題屬於送分題,有一定專案經驗的人,都會注意到在前後端進行互動時,需要進行decoder編碼-Encoder解碼的過程,防止亂碼)

進一步提問:前後端陣列傳參如何處理?

前端:資料使用JSON。stringify(str)處理

後端:資料轉換:List objectList = JSONObject。parseArray(str, Object。class)

5、FreeMarker、jsp、html 三者的區別

先說說freemarker和jsp的不同,執行機制就不大一樣,jsp是編譯成繼承自servlet的class檔案,執行jsp就是執行一個servlet(Java檔案編譯後會產生一個class檔案,最終執行的就是這個class檔案,JSP也一樣,它也要編譯成class檔案。JSP不止要編譯,它還得要轉譯,首先把JSP轉譯成一個Servlet檔案,然後再編譯成class檔案。當用戶訪問JSP時就執行了class檔案)。

而freemarker就是套模板,透過模板+內容直接生成HTML然後輸出。

HTML(Hypertext Markup Language)文字標記語言,它是靜態頁面,和JavaScript一樣是解釋性語言。

JSP(Java Server Page)Java服務端的頁面,它是動態頁面,它是需要經過JDK編譯後把內容發給客戶端去顯示。

6、vue例項內部和外部分別怎麼呼叫vue中的方法?

內部呼叫: this。operate();

外部呼叫:vm。operate(); (vm是vue例項名)

推薦文章

Copyright © 2024海納網