java面試問題

秋楓瑟瑟發表於2018-01-26

1.equals與==的區別:

a.==是判斷兩個變數或例項是不是指向同一個記憶體空間 equals是判斷兩個變數或例項所指向的記憶體空間的值是不是相同

2.Hashcode的作用,與 equal 有什麼區別

a.同樣用於鑑定2個物件是否相等的,java集合中有 list 和 set 兩類,其中 set不允許元素重複實現,那個這個不允許重複實現的方法,如果用 equal 去比較的話,如果存在1000個元素,你 new 一個新的元素出來,需要去呼叫1000次 equal 去逐個和他們比較是否是同一個物件,這樣會大大降低效率。hashcode實際上是返回物件的儲存地址,如果這個位置上沒有元素,就把元素直接儲存在上面,如果這個位置上已經存在元素,這個時候才去呼叫equal方法與新元素進行比較,相同的話就不存了,雜湊到其他地址上

3.介面和抽象類的區別

a.一個類只能繼承單個類,但是可以實現多個介面
b.介面強調特定功能的實現,而抽象類強調所屬關係
c.抽象類中的所有方法並不一定要是抽象的,你可以選擇在抽象類中實現一些基本的方法。而介面要求所有的方法都必須是抽象的

4.用什麼方法解析XML最好、

a.DOM:消耗記憶體:先把xml文件都讀到記憶體中,然後再用DOM API來訪問樹形結構,並獲取資料。這個寫起來很簡單,但是很消耗記憶體。要是資料過大,手機不夠牛逼,可能手機直接當機

5.wait和sleep的區別

a.sleep是繼承thread而wait是object的

b.sleep是不會釋放鎖的,是暫時讓執行緒進入休眠狀態,wait釋放鎖

6.java中堆和棧的區別和記憶體機制

a.基本資料型別比變數和物件的引用都是在棧分配的
b.堆記憶體用來存放由new建立的物件和陣列
c.類變數(static修飾的變數),程式在一載入的時候就在堆中為類變數分配記憶體,堆中的記憶體地址存放在棧中
d.例項變數:當你使用java關鍵字new的時候,系統在堆中開闢並不一定是連續的空間分配給變數,是根據零散的堆記憶體地址,通過雜湊演算法換算為一長串數字以表徵這個變數在堆中的"物理位置”,例項變數的生命週期--當例項變數的引用丟失後,將被GC(垃圾回收器)列入可回收“名單”中,但並不是馬上就釋放堆中記憶體
e.區域性變數: 由宣告在某方法,或某程式碼段裡(比如for迴圈),執行到它的時候在棧中開闢記憶體,當區域性變數一但脫離作用域,記憶體立即釋放

7.java垃圾回收的是那些

a.一些沒有被引用的物件

8.java中的集合有多少種它們的區別是什麼

a.首先可以分為list set map

List:
實現List介面的常用類有LinkedList,ArrayList,Vector和Stack。ArrayList,LinkedList是不同步的,而Vestor是同步的。
ArrayList是List的子類,允許存放重複元素,有序。集合中元素被訪問的順序取決於集合的型別。如果對 ArrayList進行訪問,迭代器將從索引0開始,每迭代一次,索引值加1(查詢快)
LinkedList是一種可以在任何位置進行高效地插入和刪除操作的有序序列。允許null元素,LinkedList使用雙向連結串列實現儲存(增刪改快)
VectorVector由於使用了synchronized方法(執行緒安全)所以效能上比ArrayList要差(安全,效能差)
Set:
HashSet是Set介面的一個子類,主要的特點是:裡面不能存放重複元素,而且採用雜湊的儲存方法,所以沒有順序。這裡所說的沒有順序是指:元素插入的順序與輸出的順序不一致。不是同步的,集合元素可以是null,但只能放入一個null
TreeSet:有序,
LinkedHashSet:當遍歷該集合時候,LinkedHashSet將會以元素的新增順序訪問集合的元素。
LinkedHashSet在迭代訪問Set中的全部元素時,效能比HashSet好,但是插入時效能稍微遜色於HashSet。
Map:
TreeMap:有序
Hashtable:單向鏈的二維陣列,value不能為空,執行緒安全的,所有方法均用synchronized修飾
與 HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值為空(安全慢)
HashMap:可以放入空值,按插入的順序儲存,執行緒不安全,最多隻允許一條記錄的鍵為Null;允 許多條記錄的值為 Null;
LinkedHashMap:存了記錄的插入順序,如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap可以實現,它還可以按讀取順序來排列,像連線池中可以應 用。

hashtable:初始化長多是11  每次的擴容是2n+1

hashmap:初始長度是16 每次擴容是16*0.75*2 

影響Hashmap效率:初始化容量 負載係數

ConcurrentHashMap:執行緒安全的,用於替代HashTable,採用分段加鎖的方式實現,提升了效率
9.什麼是redis
Redis 是一個基於記憶體的高效能key-value資料庫
10.redis支援的資料型別有那些
Redis通過Key-Value的單值不同型別來區分, 以下是支援的型別:
Strings
Lists
Sets 求交集、並集
Sorted Set 
hashes

11. redis相比memcached有哪些優勢?

a. memcached所有的值均是簡單的字串,redis作為其替代者,支援更為豐富的資料型別

b. redis的速度比memcached快很多

c. redis可以持久化其資料

12. redis常見效能問題和解決方案:

(1) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案

(2) 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次

(3) 為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內

(4) 儘量避免在壓力很大的主庫上增加從庫

(5) 主從複製不要用圖狀結構,用單向連結串列結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

13.

堆疊空間

堆疊的特性: 最後一個放入堆疊中的物體總是被最先拿出來, 這個特性通常稱為後進先出(LIFO)佇列。 堆疊中定義了一些操作。 兩個最重要的是PUSH和POP。 PUSH操作在堆疊的頂部加入一 個元素。POP操作相反, 在堆疊頂部移去一個元素, 並將堆疊的大小減一。

 

佇列:什麼是佇列?又該怎麼理解呢?

①佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

②佇列中沒有元素時,稱為空佇列。

③建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。一個是隊頭指標front,它指向隊頭元素;另一個是隊尾指標rear,它指向下一個入隊元素的儲存位置。

④佇列採用的FIFO(first in first out),新元素(等待進入佇列的元素)總是被插入到連結串列的尾部,而讀取的時候總是從連結串列的頭部開始讀取。每次讀取一個元素,釋放一個元素。所謂的動態建立,動態釋放。因而也不存在溢位等問題。由於連結串列由結構體間接而成,遍歷也方便。(先進先出)

堆、棧區別總結:

1.堆疊空間分配

 ①棧(作業系統):由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

 ②堆(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收,分配方式倒是類似於連結串列。

2.堆疊快取方式

①棧使用的是一級快取, 他們通常都是被呼叫時處於儲存空間中,呼叫完畢立即釋放。

②堆則是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法來決定(並不是一旦成為孤兒物件就能被回收)。所以呼叫這些物件的速度要相對來得低一些。

3.堆疊資料結構區別

①堆(資料結構):堆可以被看成是一棵樹,如:堆排序。

②棧(資料結構):一種先進後出的資料結構。

14. spring事物

Spring事務 的本質其實就是資料庫對事務的支援,沒有資料庫的事務支援,spring是無法提供事務功能的。對於純JDBC運算元據庫,想要用到事務,可以按照以下步驟進行:
    獲取連線 Connection con = DriverManager.getConnection()
    開啟事務con.setAutoCommit(true/false);
    執行CRUD
    提交事務/回滾事務 con.commit() / con.rollback();
    關閉連線 conn.close();
使用Spring的事務管理功能後,我們可以不再寫步驟 2 和 4 的程式碼,而是由Spirng 自動完成。 那麼Spring是如何在我們書寫的 CRUD 之前和之後開啟事務和關閉事務的     呢?解決這個問題,也就可以從整體上理解Spring的事務管理實現原理了。下面簡單地介紹下,註解方式為例子
    配置檔案開啟註解驅動,在相關的類和方法上通過註解@Transactional標識。
    spring 在啟動的時候會去解析生成相關的bean,這時候會檢視擁有相關注解的類和方法,並且為這些類和方法生成代理,並根據@Transaction的相關引數進行相關配     置    注入,這樣就在代理中為我們把相關的事務處理掉了(開啟正常提交事務,異常回滾事務)。

15.資料庫事務

資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和永續性)屬性。事務是資料庫執行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。

16.怎麼配置spring事務

    1.傳統的jdbc DataSource是安全的但是每個請求都要開啟一個連線,連線不是安全的一般的資料來源由容器進行管理,包括連線池。例如TOMCAT,WEBSPHERE,WEBLOGIC等這些J2EE商業容器都提供了這個功能。

 Spring宣告式事務處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對元件進行事務代理。

17.設計模式

單例模式的特點:1.只能有一個例項 2.單例類必須自己建立自己唯一的例項 3.單例類必須給所有其他物件提供這一例項。

代理模式:
  代理模式的三種角色:
抽象角色(宣告真實物件和代理物件的共同介面)
  代理角色(代理角色中提供與真實物件相同的介面以便在任何時候可都能代理真實物件,同時附加其他操作,相當於真實物件進行封裝) 
  真實角色:代理角色所代表的真物件,是我們最終要引用的物件
  好處:就是對外部提供統一的介面方法而代理類在介面中實現對真實類的附加操作行為,從而可以在不影響外部呼叫的情況下,進行系統擴充套件。
工廠模式: 
  主要解決:介面選擇的問題
  如何解決:讓其子類實現工廠介面,返回的也是一個抽象的產品。
  優點:如果想建立物件,只要知道名字即可;擴充套件性高,如果想要增加一種產品,只需擴充套件一個工廠類即可;不關心其內部的具體實現,只關心介面的作用即可 
  缺點:每次增加一個工廠類,需要增加個具體類和物件實現工廠,當時的系統中類的個數成倍增加,在一定層都上增加了系統的複雜度,同時也增加了系統具體類的依賴
觀察者模式:
當物件間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個物件被修改時,則會自動通知它的依賴物件。觀察者模式屬於行為型模式。

18.sleep()和wait()的區別
1.sleep()不會釋放鎖,wait()釋放鎖

2.sleep()是thread的,wait()是Object

3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用

4.sleep需要捕獲異常wait不需要

19.tomcat叢集衝突有什麼影響

1    叢集衝突的話就只能執行一個tomcat而不能執行多個tomcat,所以要改埠號,不讓叢集有衝突!

2  DNS輪詢 當叢集中某臺伺服器停止之後,使用者由於dns快取的緣故,便無法訪問服務,必須等到dns解析更新,或者這臺伺服器重新啟動。還有就是必須把叢集中的所有服務埠暴露給外界,沒有用apache做前置代理的方式安全,並且佔用大量公網IP地址,而且tomcat還要負責處理靜態網頁資源,影響效率

3  R-proxy(反向代理)當其中一臺tomcat停止執行的時候,apache仍然會轉發請求過去,導致502閘道器錯誤。但是隻要伺服器再啟動就不存在這個問題。

4   mod_jk 當停止掉的tomcat伺服器再次啟動的時候,Apache檢測不到,仍然不會轉發請求過去

20.spring的實現原理

1   Spring內部最核心的就是IOC了,動態注入,讓一個物件的建立不用再new,可以自動的生產,這其實利用了java的反射,反射其實就是在執行時動態的去建立,呼叫物件,Spring就是在執行時,跟XML Spring的配置檔案來動態建立物件和呼叫物件裡的方法。

2   Spring還有一個核心就是AOP,這個是面向切面程式設計,可以為某一物件進行監督和控制(也就是在呼叫這類物件的具體方法的前後去呼叫你指定的模組)從而達到對一個模組擴充的功能,這些都是通過配置類達到的

3   Spring目的:就是讓物件與物件之間的關係沒有通過程式碼來關聯,都是通過配置類說明管理的(Spring根據這些配置,內部通過反射去動態組裝物件)

21.資料庫拆表原則

1.能不分就不分

2.資料量太大,正常的運維影響正常業務訪問

3.表設計不合理,需要對某些欄位垂直拆分

4.某些資料表出現了無窮增長

5.安全性和可用性的考慮

6.業務耦合性考慮











 





相關文章