java常見面試總結

来源:https://www.cnblogs.com/zhangshiyi/archive/2018/11/12/9949143.html
-Advertisement-
Play Games

M:model代表的是應用的業務邏輯,通過Javabeen,EJB實現, V:view代表的是應用的表示面,有jsp頁面產生 C:controller提供應用的處理過程機制,一般是一個servlet,通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用 Jav ...


  1. MVC的各個部分都有哪些技術來實現?如何實現?

Mmodel代表的是應用的業務邏輯,通過JavabeenEJB實現,

Vview代表的是應用的表示面,有jsp頁面產生

Ccontroller提供應用的處理過程機制,一般是一個servlet,通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用

  1. J2EE常用的設計模式有哪些?說明工廠模式?

Java中的23種設計模式:

Factory(工廠模式),Builder(建造模式),Factory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式)Facade(門面模式),Adapter(適配器模式),Bridge(橋梁模式), Composite(合成模式),Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式),Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式),Observer(觀察者模式), State(狀態模式), Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)

工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類並且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然後需要定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例後,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。

  1. 什麼是java虛擬機?為什麼java被稱作是“平臺無關的編程語言?”

Java虛擬機是指在實際的電腦上模擬模擬各種電腦功能實現的,java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。

Java虛擬機屏蔽了與具體操作系統平臺相關的信息,使得Java程式只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平臺上不加修改地運行。

  1. JDKJRE的區別是什麼?

JDK包含了JRE,但是JRE是可以獨立安裝的

 JDKJava Development Kit的縮寫,是Java的開發工具包,主要包含了各種類庫和工具

 JREJava Runtime Environment的縮寫,是Java程式的運行環境。既然是運行,當然要包含JVM,也就是所謂的Java虛擬機,還有所以的Java類庫的class文件,都在lib目錄下,並且都打包成了jar

  1. StringStringBufferStringBuilder之間的區別?

運行速度方面:StringBuilder > StringBuffer > String   String為字元串常量,而StringBuilderStringBuffer均為字元串變數,即String對象一旦創建之後該對象是不可更改的,但後兩者的對象是變數,是可以更改的。

線程安全方面:StringBuilder是不安全的,運行速度快,而StringBuffer是線程安全的,運行速度慢。

  1. Listmapset三個介面,存取元素時,各有什麼特點?

List特點:元素有放入順序,元素可重覆。

Set特點:元素無放入順序,元素不可以重覆。(元素雖然無放入順序,但是元素在set中的位置是有該元素的hashcode決定的,其位置其實是固定的)

Map特點:元素按鍵值對存儲(key-value),無放入順序

List介面有是三個實現類:linkedlistArrayListvector

LinkedList:底層基於鏈表實現,鏈表記憶體是散亂的,每一個元素存儲本身記憶體地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢

ArrayListVector的區別:ArrayList是非線程安全的,效率高;Vector是基於線程安全的,效率低

Set介面有兩個實現類:hashset(底層由hashmap實現),linkedhashset

Map介面有三個實現類:HashMapHashTableLinkeHashMap

  1. Forwardredirect的區別?

Forward請求轉發

request.getRequestDispatcher().forward(request,response);

Redirect重定向response.sendRedirect();

請求轉發是在伺服器端完成的,重定向是在客戶端完成的

請求轉發的速度快,重定向速度慢

轉發是同一次請求,重定向是兩次請求

轉發的地址欄沒有變化,重定向地址欄有變化

轉發必須是在同一臺伺服器下完成,重定向可以在不同的伺服器下完成。

  1. Jsp有哪些內置對象,作用分別是什麼?

名稱

數據類型

說明

request

javax.servlet.http.HttpServletRequest

客戶端的請求信息

response

javax.servlet.http.HttpServletResponse

伺服器對客戶端的響應

out

javax.servlet.jsp.JspWriter

Web瀏覽器內輸出信息

page

java.lang.Object

page 對象代表JSP本身

pageContext

javax.servlet.jsp.PageContext

頁面屬性範圍,可以獲取其他屬性範圍對象

session

javax.servlet.http.HttpSession

會話對象

application

javax.servlet.ServletContext

應用程式範圍

config

javax.servlet.ServletConfig

Servlet初始化配置信息

exception

java.lang.Throwable

異常處理對象

 

  1. 兩張表,studentsidsnamedid),depdidtname)。學生表和院系表。

(1)請按系號升序,學號降序列出學生的系號、學號、姓名

select did,sid,sname from student order by did asc, sid desc;

(2)請分別用(1)不包含inexists2)包含in3)包含existssql語句,查詢出所有系名等於工商院的學生。

  1. 請列舉三個以上Oracle索引失效的情況。

1,<>
2,單獨的>,<,(有時會用到,有時不會)
3,like "%_" 百分號在前.
4,表沒分析.
5,單獨引用複合索引里非第一位置的索引列.
6,字元型欄位為數字時在where條件里不添加引號.
7,對索引列進行運算.需要建立函數索引.
8,not in ,not exist.
9,當變數採用的是times變數,而表的欄位採用的是date變數時.或相反情況。
10, 索引失效。
11,基於cost成本分析(oracle因為走全表成本會更小):查詢小表,或者返回值大概在10%以上
12,有時都考慮到了 但就是不走索引,drop了從建試試在
13,B-tree索引 is null不會走,is not null會走,點陣圖索引 is null,is not null   都會走
14,聯合索引 is not null 只要在建立的索引列(不分先後)都會走
in null   必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null ,其他建立索引的列可以是is null(但必須在所有列都滿足is null的時候),或者=一個值;
當建立索引的第一位置是=一個值時,其他索引列可以是任何情況(包括is null =一個值),以上兩種情況索引都會走。其他情況不會走。

 

  1. 請描述Oracle資料庫啟動的三個階段?

1startup nomount -- 啟動實例,不載入資料庫

       nomount:在這一階段,只需要讀取initSID.ora文件,啟動資料庫實例,創建後臺進程。在initSID.ora文件中,可以定位SPFILEORAC.ora文件,這是參數文件,通過它可以初始化SGA和啟動後臺進程。並可以定位控制文件位置。在此階段,可以執行的操作有:重建控制文件,重建資料庫。

2alter database mount -- 載入資料庫

       mount:在nomount階段,可以通過讀取控制文件來轉換到mount階段。在資料庫載入階段(mount),所有的數據文件和聯機日誌文件的名稱和位置都從控制文件中讀取,但是並沒有真正查找這些文件。在此階段,可以執行的操作有:資料庫日誌歸檔、資料庫介質恢復、使數據文件聯機或離線、重定位數據文件和聯機日誌文件。

3alter database open -- 打開資料庫

       open:通過查找定位並打開數據文件和聯機日誌文件來切換到open階段。此時資料庫可用,可以建立會話。

 

  1. 使用遞歸函數計算一個階乘 5=5*4*3*2*1=120

public class JieCheng {  

public static int run(int n){  

 if (n == 1)

 {      

    return n;  

 }else

{   

 return n * run( n - 1 );  

 }

  }

 }

 

  1. 編寫一段代碼,將字元串’abcdefg’倒敘輸出為’gfedcba’;

public static void main(String[] args) {

String temp= "";

String str = "abcdefg";

char[] strs = str.toCharArray();

 

for(int i = strs.length-1; i>=0; i--){

temp += strs[i];

}

System.out.print(temp);

}

 

  1. 請說明sysnchronized(鎖、線程)關鍵字的作用,在什麼情況下使用?

synchronized修飾方法和synchronized修飾代碼塊。

主要是用來處理java中的同步機制,用來防止同一個資源被用戶併發訪問時,會出現併發問題。

  1. 介面和抽象類有什麼區別?兩者分別在什麼情況下使用?

介面是對動作的抽象,抽象類是對根源的抽象。

抽象類表示的是,這個對象是什麼。介面表示的是,這個對象能做什麼。

1、抽象類和介面都不能直接實例化,如果要實例化,抽象類變數必須指向實現所有抽象方法的子類對象,介面變數必須指向實現所有介面方法的類對象。

2、抽象類要被子類繼承,介面要被類實現。

3、介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現

4、介面里定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。

5、抽象類里的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類。

6、抽象方法只能申明,不能實現,介面是設計的結果 ,抽象類是重構的結果

7、抽象類里可以沒有抽象方法

8、如果一個類里有抽象方法,那麼這個類只能是抽象類

9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。

10、介面可繼承介面,並可多繼承介面,但類只能單根繼承。

 

 

  1. 從代碼編碼(採用Hibernate技術)和資料庫設計兩個層面,說出一些資料庫操作與優化方面的經驗?

資料庫設計

a) 降低關聯的複雜性;

b) 儘量不使用聯合主鍵

c) ID的生成機制,不同的資料庫所提供的機制並不完全一樣

d) 適當的冗餘數據,不過分追求高範式
HQL優化:HQL如果拋開它同HIBERNATE本身一些緩存機制的關聯,HQL的優化技巧同普通的SQL優化技巧一樣,可以很容易在網上找到一些經驗之談。

延遲載入:a) 實體延遲載入:通過使用動態代理實現b) 集合延遲載入:通過實現自有的SET/LISTHIBERNATE提供了這方面的支持c) 屬性延遲載入;

  1. 類的載入過程?

1)通過一個類的全限定名來獲取定義此類的二進位位元組流。

2)將這個位元組流所代表的靜態存儲結構轉化為方法區的運行時數據結構

3)Java堆中生成一個代表這個類的java.lang.Class對象,作為方法區這些數據的訪問入口。

  1. 多線程有哪幾種實現方法?同步有哪幾種實現方法?

Java實現多線程有兩種方法:

  1. 繼承Thread
  2. 實現runnable介面

共同點:都必須用Thread產生線程,然後再調用start()方法。

不同點:

  1. 繼承Thread類有一個缺點就是單繼承,而實現Runnable介面則可以實現多繼承。
  2. 繼承Thread類如果產生Runnable實例對象,就必須產生多個Runnable實例對象,然後再用Thread產生多個線程。而試下了Runnable介面,只需要建立一個實現這個類的實例,然後用這一個實例對象產生多個線程,即實現了資源的共用性。

同步的實現方面有兩種:分別是synchronized,waitnotity
public synchronized void save(){}

 

  1. 不通過new語句創建對象有哪幾種方式?

Java中創建對象有四種方式:

  1. new語句創建對象
  2. 運用反射機制,調用java.lang.class 或者java.lang.reflect.Constructor類的newInstance()實例方法
  3. 調用對象的clone()方法
  4. 運用反序列化手段,調用java.io.ObjectInputStream對象的readObject()方法
  5. 寫一個java正則表達式,用於匹配email地址(填寫表達式即可);

public static void main (String[] args) {

        String str = "[email protected]@sdfs.comddd";

        String reg = "([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})";

        Pattern pattern = Pattern.compile (reg);

        Matcher matcher = pattern.matcher (str);

        while (matcher.find()) {

            System.out.println (matcher.group());

        }

    }

 

  1. Java中的基本類型?

四類八種:數值型(整數型:byteshortintlong

浮點型:floatdouble

字元型:char

布爾型:boolean

引用類型(類class、介面interface、數組)

  1. 什麼是cookieSessioncookie有什麼區別?

Cookieweb伺服器發送數據到客戶端並且將信息保存在客戶端的一種機制,用來記錄用戶的信息。

Session是服務端記錄用戶狀態時用於標識具體用戶的機制。

區別:1.cookie在客戶端,session在伺服器端

2.cookie的安全性一般,他人可以通過分析存放在本地的cookie併進行cookie欺騙。Session的安全性高於cookie

  1. 單個的額cookie保存的數據不能超過4k,很多瀏覽器限制一個站點最多保存20cookie
  2. Session可以放在文件、資料庫或者記憶體中,在一定時間內他是保存在伺服器上的,當訪問增多時,會較大的占用伺服器的性能。
  3. Session的運行依賴session IDsession ID存放在cookie中,如果瀏覽器禁用了cookiesession也會失效。
  4. 用戶驗證一般會用session,因此,維持一個會話的核心就是在客戶端的唯一標識,即session ID

 

  1. 寫出幾點java最佳編程實踐?
  2. Jsp中引用資源永遠使用絕對路徑src=””
  3. URL編碼永遠使用utf-8
  4. Finally 語句中不要return xx

finally語句只能做如下事件
-(1)關閉io資源,比如關閉inputstreamsocket; 
-(2)只做列印錯誤信息,捕獲異常,不要拋出異常;

  1. 存儲在資料庫中的必須是原內容,而不是轉義之後的

 

  1. 寫一個Singleton(單例模式)出來

懶漢模式:

class Singleton {
private static Singleton s;
private Singleton(){
System.out.println("A Singleton Model example");

}

public static Singleton getSigleton(){
if(s==null){

s=new Singleton();
return s;

}

}

惡漢模式:

Public calss Singleton{

     Private singleton(){}

Private static singleton instance = new singleton();

Public static singleton gettlnstance(){

Return instance;

}   

}

 

  1. Staticfinal關鍵字可以用來修飾什麼,分別起什麼作用?

Static可以修飾方法、屬性和代碼塊

--1Static關鍵字修飾方法稱為靜態方法,靜態方法不依賴對象就可以訪問,所以對於靜態方法是沒有this

在靜態方法中不能訪問非靜態成員方法和非靜態成員變數,但是在非靜態成員方法中是可以訪問靜態成員方法/變數的

--2static變數也被稱為靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的對象所共用,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是對象所擁有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

--3static關鍵字用來形成靜態代碼塊以優化程式性能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。

Final關鍵字可以修飾類,變數,方法

修飾類不可以被繼承,但是可以繼承其他類

修飾的方法不能被子類重寫

修飾變數:a. 修飾局部變數,變為常量,只能被賦值一次

b. 修飾引用變數,變數保存的是記憶體的地址,被修飾後就不能再重新創建。

  1. Java有哪些異常類,請寫出最少三個,並說明他們在什麼情況下產生的?

輸入不匹配異常:InputMisMatchException

空指針異常:NullPointerException

類型強制轉換異常:ClassCastExceptin/NumberFormatExction

數組索引(下標越界異常):ArrayIndexOfBoundsExction

文件已經結束異常:EOFException

不合法參數異常:IllagalArgumentException

文件未找到異常:FileNotFoundException

操作資料庫異常:SQLException

輸入輸出異常:IOException

算數異常(除數為0):ArithmaticException

  1. Jsp頁面是如何執行的?Jsp執行的效率比servlet低嗎?

創建jsp頁面,將jsp頁面部署在Tomcat伺服器下

用戶第一次訪問jsp頁面時,將jsp頁面轉譯成servlet

Jspc對轉譯的servlet文件編譯成servlet.class文件

伺服器訪問servlet.class文件並將響應結果響應到客戶端

  1. Servlet api 中的forWord() redirect() 的區別?

 請求轉發(內部跳轉、伺服器跳轉):

request.getRequestDispather("地址").forward(request,response);

      a、伺服器端完成跳轉,地址欄地址不會變化;

      b、效率高,能繼續訪問request中的數據;

      c、客戶端只發一個請求,最後獲得一個響應;

      d、只能跳轉到該web應用程式的內部頁面地址;

 2018年11月12日21:10:53

    重定向(客戶端的跳轉):response.sendRedirect("地址");

      a、伺服器與客戶端共同參與跳轉,跳轉最終客戶端發出,地址欄地址發生改變;

      b、效率較低,不能繼續訪問原請求中的數據;

      c、客戶端發送兩個請求,獲得兩個響應;

      d、可以跳轉到網路上的任何可以訪問的地址;

  1. 同步請求和非同步請求有什麼不同?請描述一個使用同步請求和

非同步請求的場景。

同步:發送方發出數據後,等待收方發迴響應後才發下一個數據包的通訊方式。

非同步:發送方發出數據後,不等接收方發迴響應,接著發送下個數據包的通訊方式。

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Map集合的特點 1、Map集合中保存的都是鍵值對,鍵和值是一一對應的 2、一個映射不能包含重覆的值 3、每個鍵最多只能映射到一個值上 Map介面和Collection介面的不同 Map是雙列集合的根介面,Collection是單列集合的根介面 1、Map是雙列的(是雙列集合的根介面),Collec ...
  • # 一、Spring的常用組件類註解 ## @Component 被該註解所修飾的類是一個普通的spring bean類,該註解可以替代@Controller、@Service、@Repository.在不確定具體的bean的時候,可以選擇使用@Component註解,但是一般不建議使用。 ## @ ...
  • 藍圖這個名字好像就是根據單詞Blueprint字面意思來,跟平常我們理解的藍圖完全掛不上鉤,這裡藍圖就是指Blueprint。 使用藍圖的好處是可以將不同功能作用的視圖函數/類視圖放到不同的模塊中,可以更加方便的開發和維護 ...
  • python 3.5+ 版本 python2版本 在字典中如果有重覆的key值,從左向右開始複製,也就是最先複製的值會被覆蓋掉 ...
  • 對於JDK要配置三個環境變數,分別是JAVA_HOME、path、classpath 對於我本人電腦來說,配置如下: JAVA_HOME:C:\Program Files\Java\jdk1.8.0_191;(JDK的安裝路徑) path: %JAVA_HOME%\bin;%JAVA_HOME%\j ...
  • 恢復內容開始 C++11 新特性 借鑒於 https://www.cnblogs.com/feng-sc/p/5710724.html C++ 2011/2014 統稱 C++2.0 1.auto關鍵字 auto這個關鍵字,是一個自動檢測類型的關鍵字,當類型很複雜時,無法確定變數/參數類型時,可以使 ...
  • Python編程語言非常強大,非常容易上手,版本更新也不慢,在win10 x64中相容性也很好,直接安裝不需另外配置,雖然Python2和3有點異同。學習的話選擇最新的 python 3.7.1版。 系統是win 10 X64.到官網去下載 最新版 Python 3.7.1 1.建議下載execut ...
  • 隨著互聯網的興起,web開發變得愈發的重要。Python作為當前火熱的語言, 其中的web開發框架可以說是百花齊放,下麵聊一聊這些框架。 一: 基於Python的代表性Web框架 "Django" Django是一個開放源代碼的Web應用框架,由Python寫成。採用了MTV的框架模式,即模型M,模 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...