當前位置:
首頁 > 最新 > 該面試了吧,「想學嗎?我教你啊」

該面試了吧,「想學嗎?我教你啊」

一、解釋堆(stack)、棧(heap)、方法區(method area)。

一般時候,定義一個基本數據類型的變數,函數方法的執行,一個對象的引用都是JVM的棧空間; 通過new關鍵字和構造器創建的對象都是佔用的堆空間,堆是垃圾回收器主要場所。方法區和堆都是各個線程共享的內存區域,用於存儲已經被JVM載入的類信息、常量、靜態變數和編譯器編譯之後的代碼,常量池也是方法區的一部分。棧空間操作最快但是內存很小,通常大量的對象都是存在堆空間的。 棧和堆 的大小都是可以通過JVM的啟動參數來調整的,棧空間用光了會引發StackOverflowError,而堆和常量池空間不足則會引發OutOfMemoryError。

二、java中會存在內存泄漏嗎?

理論上java因為有垃圾回收機制所以是沒有內存泄漏的,這也是java被廣泛用於伺服器端編程的重要原因,然而在實際的開發中,可能會存在無用但可達的對象,這些對象無法被GC回收,因此也會有內存泄漏的發生,例如Hibernate的一級緩存對象屬於持久態,是不會被回收的,這些對象中會存在無用的對象,如果不及時關閉或清空一級緩存對象就可能導致內存泄漏。在支持垃圾回收的語言中,內存泄露是很隱蔽的,這種內存泄露其實就是無意識的對象保持。如果一個對象引用被無意識的保留起來了,那麼垃圾回收器不會處理這個對象,也不會處理該對象引用的其他對象,即使這樣的對象只有少數幾個,也可能會導致很多的對象被排除在垃圾回收之外,從而對性能造成重大影響,極端情況下會引發Disk Paging(物理內存與硬碟的虛擬內存交換數據),甚至造成OutOfMemoryError(內存溢出)。

三、抽象方法(abstract)是否可以是靜態的(static)、本地方法(native)、是否可以被synchronized修飾?

都不能,抽象方法需要子類重寫。而靜態的方法是無法被重寫的。本地方法是本地代碼實現的,抽象方法是沒有實現的。synchronized和方法的實現細節有關,抽象方法不涉及實現細節,因此也是相互矛盾的。

四、如何實現字元串的反轉及替換?

publicstaticStringreverse(String originStr) {

if(originStr ==null|| originStr.length()

returnreverse(originStr.substring(1)) + originStr.charAt(); }

五、Thread類中的wait和sleep都可以使線程暫停,區別是什麼?另外線程和進程的描述。

sleep方法是靜態方法,會暫停指定時間,將執行機會讓給別的線程,但是會持有對象鎖,時間到了,自動到就緒狀態。 wait是Object類的方法,會放棄對象鎖,進入等待池,只有調用 notify方法,才能喚醒。

簡單的說:進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,是操作系統進行資源分配和調度的一個獨立單位;線程是進程的一個實體,是CPU調度和分派的基本單位,是比進程更小的能獨立運行的基本單位。線程的劃分尺度小於進程,這使得多線程程序的並發性會更高,進程在執行時通常擁有獨立的內存單元,而線程之間可以共享內存。使得多線程會帶來更好的用戶體驗和性能,但是多線程對於其他程序是不友好的,因為他可能佔有了更多的CPU,當然,也不是線程越多,程序的性能就越好,因為線程之間的調度和切換也會浪費CPU時間。時下很時髦的Node.js就採用了單線程非同步I/O的工作模式。

六、舉例說明同步和非同步

如果線程中存在臨界資源(資源數量小於競爭資源線程數量),如正在寫的數據被讀到,正在讀的數據被別的線程寫過了,那麼這些數據必須進行同步存取(例如資料庫中 排他鎖),當應用程序在對象上調用了一個執行時間很長的方法,並且不希望讓程序等待方法的返回,就應該使用非同步編程,其實,所謂的同步就是阻塞式操作,而非同步就是非阻塞式操作。

七、線程池及其相關

在面向對象編程中,創建和銷毀對象是很費時間的,因為創建對象要分配內存資源,虛擬機將試圖跟蹤每一個對象,以便能夠在對象銷毀後進行垃圾回收。所以提高效率的一個手段就是 減少創建對象和銷毀對象的次數,特別是很耗資源的那種,這就是「池化資源」的技術產生原因,線程池就是 事先創建若干個可執行的線程放在池中,也就是容器中,需要的時候獲取線程不用自行創建,使用完畢後放回池中,從而減少創建和銷毀線程對象的開銷。

這是典型的用空間換取時間的策略,資料庫連接池也是一樣的道理,還是為了減少資源的開銷。

創建線程池的方法,網上可詳查。

另外,Lock和synchronized 有哪些異同? Lock能完成後者的所有,主要不同在於Lock比sychronized 有更精確的線程語義和性能,而且不強制要求一定要獲得鎖,需手動釋放鎖,在finally。

八、線程的基本狀態和關係

說明:其中Running表示運行狀態,Runnable表示就緒狀態(萬事俱備,只欠CPU),Blocked表示阻塞狀態,阻塞狀態又有多種情況,可能是因為調用wait()方法進入等待池,也可能是執行同步方法或同步代碼塊進入等鎖池,或者是調用了sleep()方法或join()方法等待休眠或其他線程結束,或是因為發生了I/O中斷。

九、java實現對象序列化的意義

序列化就是用來處理對象流的機制,就是將對象的內容進行流化,可以對流化的對象進行讀寫操作,也可以將流化的對象傳輸於網路之間,序列化就是為了解決對象流在讀寫操作中可能產生的問題(如果不進行序列化可能會存在數據亂序的問題)。

十、Statement和PrepareStatement區別

與Statement相比,PrepareStatement介面代表預編譯的語句,他的主要優勢在於可以減少SQL的編譯錯誤並增加SQL的安全性,它還可以帶參數,避免了用字元串拼接SQL語句的麻煩和不安全,當批處理SQL或頻繁執行相同的查詢,後者帶有性能上的優勢,由於資料庫可以將編譯優化後的SQL語句緩存起來,下次執行相同的語句就會很快。

十一、事務的ACID

原子性,一致性,隔離性,持久性

面試中問到事務很多的,首先需要知道的是,只有存在並發數據訪問時才需要事務,當多個事務訪問同一數據時,可能會存在五類問題,包括3類數據讀取問題(臟讀,不可重複讀,幻讀)和2類數據更新問題。

資料庫通常會通過鎖機制來解決數據並發訪問問題,按鎖定對象不同可以分為表級鎖和行級鎖;按並發事務鎖定關係可以分為共享鎖和獨佔鎖,具體的內容大家可以自行查閱資料進行了解。直接使用鎖是非常麻煩的,為此資料庫為用戶提供了自動鎖機制,只要用戶指定會話的事務隔離級別,資料庫就會通過分析SQL語句然後為事務訪問的資源加上合適的鎖。需要說明的是,事務隔離級別和數據訪問的並發性是對立的,事務隔離級別越高並發性就越差。所以要根據具體的應用來確定合適的事務隔離級別,這個地方沒有萬能的原則。

十二、說一下你用過的設計模式。

面試被問到關於設計模式的知識時,可以揀最常用的作答,例如:

---工廠模式:工廠類可以根據條件生成不同的子類實例,這些子類有一個公共的抽象父類並且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作(多態方法)。當得到子類的實例後,開發人員可以調用基類中的方法而不必考慮到底返回的是哪個子類的實例。

---代理模式:給對象提供一個代理對象,由代理對象控制對原對象的引用。

---適配器模式:把一個類的介面變換成客戶端所期待的另一種介面,從而使因介面不匹配而無法在一起使用的類能夠一起工作。

---模板方法模式:提供一個抽象類,將部分邏輯以具體方法或構造器的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯,不同的子類可以以不同的方式實現這些抽象方法(多態實現),從而實現不同的業務邏輯。

挑自己最熟悉的,切記言多必失。

十三、轉發和重定向的區別?

forward:伺服器請求資源,伺服器直接請求訪問地址, 把那個地址的內容讀取過來發送給瀏覽器,瀏覽器根本不知道內容是從哪裡來的,所以他的地址還是原來的地址。

redirect:就是伺服器根據邏輯,發送一個狀態碼,告訴瀏覽器去訪問這個地址,因此可以看到之後的地址。

forward更加高效,所以滿足需求的情況下用forward。有助於隱藏實際的鏈接。 有些情況下愛,比如需要訪問其他伺服器上的資源,則必須用 redirect。

十四、get和post的區別。

get是從伺服器上獲取資源; 將表單中的數據按照 name--value的格式放在url後面; get傳輸的數據更小; 使用get時參數會顯示在地址欄上。

post:用來向伺服器提交數據,post 是將表單中的數據放在http協議中的請求頭或消息體中。

十五、如何實現JSP和servlet的單線程模式?

對於jsp頁面,可以通過page進行設置

對於servlet 可以讓其實現SingleThreadMode介面

如果兩者都是單線程,每個請求都會創建一個Servlet實例,嚴重性能問題和頻繁的垃圾回收。

十六、實現會話跟蹤的技術有哪些?

HTTP協議本身無狀態, 伺服器為了區分不同的用戶,會對其會話進行跟蹤,為用戶進行登記。

最常用的是 cookie和session,cookie有兩種,一種是基於窗口的,瀏覽器關閉後,cookie就沒有了;另一種是將信息存在一個了臨時文件中,並設置存在時間,當用戶通過瀏覽器與伺服器建立了一次會話後,會話id就會隨響應信息返回存儲在基於窗口的cookie中,那就意味著瀏覽器沒有關閉,會話沒有超時,下一次請求這個會話id又會提交給伺服器讓伺服器識別用戶身份。

session:當用戶第一次訪問某個網站時,會自動創建session,session存在伺服器的內存中,不能將太大的對象放在session,且對象對象最好實現了Serializable介面,否則在序列化中會出現異常。

十七、簡述過濾器

過濾器是一個在駐留在伺服器端的web組件,它可以截取 客戶端和伺服器之間的請求和響應信息,並且過濾,當web容器接收到一個對資源的請求時,將會判斷是否與過濾器有關,如果有,web容器將會把請求交給過濾器處理,在過濾器中,你可以改變請求的內容,重新設置頭信息,然後在發送給目標資源。當目標資源做出響應後,也會給過濾器,處理,發送到客戶端。

常見的過濾器用途: 對用戶請求統一認證,對用戶的訪問進行記錄和審核,對發送的數據進行過濾和替換,對請求或響應進行加密和解密,觸發資源訪問事件。

和過濾器相關的介面主要有:Filter、FilterConfig和FilterChain。

十八、簡述監聽器

java web中的監聽器就是application、session、request三個對象創建、銷毀或者往其中添加、修改、刪除屬性時自動執行代碼的功能的組件。

十九、jsp中的靜態包含和動態包含區別

靜態包含是通過JSP的include指令包含頁面,動態包含是通過JSP標準動作包含頁面。靜態包含是編譯時包含,如果包含的頁面不存在則會產生編譯錯誤,而且兩個頁面的"contentType"屬性應保持一致,因為兩個頁面會合二為一,只產生一個class文件,因此被包含頁面發生的變動再包含它的頁面更新前不會得到更新。動態包含是運行時包含,可以向被包含的頁面傳遞參數,包含頁面和被包含頁面是獨立的,會編譯出兩個class文件,如果被包含的頁面不存在,不會產生編譯錯誤,也不影響頁面其他部分的執行。

二十、什麼是 Web Service?

Web Service 就是一個應用程序,它向外界暴露了一個可以通過web調用的API,就是說你可以通過編程調用這個應用程序而不需要知道裡面的細節,它是通過HTTP協議傳輸數據。

這裡提到一個 概念:SOA 面向服務 的架構,SOA是一種思想,它將應用程序的不同功能單元通過中立的契約聯繫起來,獨立於硬體平台,操作系統和編程語言,使得各種形式的單元可以更好的集成。

二十一、介紹一下你了解的Web Service框架

待補充

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |