1. 程式人生 > >Java基礎面試(第三部分)

Java基礎面試(第三部分)

1.Java一個類當中如果沒有建構函式,編譯器會自動生成一個預設的建構函式; 如果這個類有其他的建構函式,編譯器則不會提供預設構造引數。

2.SpringMVC與Struct2.0的區別 a.Struct是類級別上的攔截,一個類對應request的上下文;SpringMVC是方法級別上的攔截,一個方法 對應request的上下文; b.基於第一個原因,SpringMVC各方法的request和response不共享,各方法是獨立的;而Struct方法共享所有 Action變數; c.SpringMVC的入口是Serlvet,而Struct的入口是Filter(攔截器); d.SpringMVC的配置是基於AOP,而Struct的配置是基於interceptor機制,所以Spring MVC配置更加簡單, 與Spring能夠完美融合。

3.SpringMVC與SpringBoot的區別 答:Spring MVC 是基於Spring的一個 MVC 響應請求式WEB框架 ; Spring Boot 是基於Spring4的條件註冊的一套快速開發整合包, 實現了自動配置,降低了專案搭建的複雜度。

4.連線資料庫

  // 第一步:同DriverManager載入驅動獲取Connection
     //連線MySql資料庫,使用者名稱和密碼都是root    
     String url = "jdbc:mysql://localhost:3306/test" ;     
     String username = "root"
; String password = "root" ; try{ Connection con = DriverManager.getConnection(url , username , password ) ; }catch(SQLException se){ System.out.println("資料庫連線失敗!"); se.printStackTrace() ; } PreparedStatement ps=null
; ResultSet rs=null; //第二步 給預編譯PreparedStatement物件繫結sql語句 ps=con.prepareStatement("select * from t_emp"); //第三步:執行sql語句,並放入結果即ResultSet物件中 rs=ps.executeQuery();

Statement 和 PreparedStatement之間的關係和區別. 關係:PreparedStatement繼承自Statement,都是介面 區別:PreparedStatement可以使用佔位符,是預編譯的,批處理比Statement效率高

5.介面中的屬性為什麼要用final 答;介面是一種規範,是抽象的,如果內部的引數可以被修改,那沒規範就被破壞了,會影響整個系統 安全和穩定性。 介面內的屬性都是static、public、final 介面內方法都是:public 、abstract

6.關於繼承 1.子類只能呼叫(繼承)父類 public或者protected的變數或者方法 可以用private來標明特有的方法或者屬性(不會被子類隱藏或者覆蓋) 2.同名變數 子類或隱藏父類變數 同名方法 子類會覆蓋父類方法(即子類的優先順序大於父類) 3.子類不能繼承父類的構造器,但是可以通過super呼叫 4.使用子類進行向上轉型時,變數不會進行動態繫結(子類覆蓋隱藏父類),只有方法會發生動態繫結(除了static 和final)。 5.當繼承有引數的構造方法是 子類也同時要生產含有相同引數的構造方法 super(引數) 6.繼承抽象父類中方法可以是抽象的,也可以不是抽象的。子類只會對抽象的方法進行重寫。

7.關於內部類 在Java中 (1)類的靜態方法不能直接呼叫動態方法。 (2)類的靜態方法不能初始化內部類(包括該類的內部類,和其他檔案中的內部類)。 (3)類的靜態方法可以初始化其他類檔案中的類。 (4)類的靜態方法可以初始化靜態類(包括靜態內部類)。

8.String s=new String(“xyz”);建立了幾個字串物件? 答:一個或者兩個物件,一個是靜態儲存區的“xyz”,一個是new建立在堆上的物件(當堆已存在“xyz”,JVM調優機制將起作用)。

9.什麼是多型?如何實現多型? 答:多型是指不同類物件多同一訊息做出響應。 主要方式:1.繼承抽象類2.實現介面3.虛方法 主要特徵:a.發生重寫或者過載 b.發生屬性或者方法的動態繫結 c.向上轉型 引用物件(如:抽象類、介面)指向具體例項物件

10.如何理解面向物件? 答: a.這是一種程式設計思想,能夠幫助我們把複雜的問題簡單化; b.實現角色的轉變,從執行者變成了指揮者。 面向物件的3種特徵: 1.封裝:隱藏類的屬性和方法,對外提供公共的訪問介面; 2.繼承:是 聯結類的層次模式,提高程式碼的重用,是多型的前提。 3.多型:多型是指不同類物件多同一訊息做出響應。提高程式的可拓展性。

11.重用的方式 答:繼承和組合。 組合: 新類中嵌入某個物件(已經實現介面的類或者已經繼承的子類) 更加靈活

12.序列化和反序列化 答: 把物件轉換為位元組序列的過程稱為物件的序列化,把位元組序列恢復為物件的過程稱為物件的反序列化。 用途:檔案的copy、網路資料的傳輸。

集合部分: 1.Collection介面 的實現類 答:Collection介面有3個子介面:List、Set、Queue a.List(有序、可重複):的實現類有ArrayList、Vector、LinkList ArrayList、Vector底層是通過陣列實現的,LinkList是通過雙向連結串列實現的。Vector支援執行緒同步。

b.Set(無序、不可重複)實現類有 HashSet(基於雜湊表,可以為null)和TreeSet(基於二叉樹,不可為null)

c. Queue:實現類有 Deque:底層是是陣列,有2個標誌位指向陣列的頭與尾實現雙端佇列。

補充:Map介面沒有顯示繼承類。java.lang,Object. HashMap是無序的,但是它的子介面類LinkHashMap是有序的。

2.HashMap的key是否可以重複? 答:key的“重複”表現在toString()上,但是本質上它們的hashcode是不一樣的,即引用地址不一樣。 所以Key不可以是重複的。

  1. 請問 ArrayList、HashSet、HashMap 是執行緒安全的嗎?如果不是我想要執行緒安全的集合怎麼辦? 答:都不是執行緒安全的,集合中只有Vector和hashtable是執行緒安全。 可以通過呼叫Collections工具類提供API來實現執行緒同步 這裡寫圖片描述

  2. ArrayList 內部用什麼實現的? 答:內部是有Object[] 實現的。

5.集合的種類? 答: 普通集合通常效能最高,但是不保證多執行緒的安全 性和併發的可靠性。 執行緒安全集合僅僅是給集合添加了 synchronized 同步鎖,嚴重犧牲了效能,而且對併發的效率就 更低了, 併發集合則通過複雜的策略不僅保證了多執行緒的安全又提高的併發時的效率。 ConcurrentHashMap、ConcurrentLinkedQueue。

6.集合的實現類 答:List集合有3個實現介面; List :Vecoter、ArrayList、LinkList Map:HashMap、LinkHashMap Set:HashSet、TreeSet、LinkHashSet

HashMap和HashTable的區別: 1.HashMap 物件的 key、value 值均可為 null。 HahTable 物件的 key、value 值均不可為 null。。 2.HashTalle是執行緒安全的,而HashMap不是執行緒安全的。

執行緒部分 1..執行緒的週期 與方法 答:新建、就緒、執行、死亡、阻塞

這裡寫圖片描述

void start() 開啟執行緒的方法 void run() 建立該類的子類時必須實現的方法 static void sleep(long t) 釋放CPU的執行權,不釋放鎖 static void sleep(long millis,int nanos) final void wait()釋放CPU的執行權,釋放鎖 final void notify() static void yied()可以對當前執行緒進行臨時暫停(讓執行緒將資源釋放出來) public final void join()//讓執行緒加入執行,執行某一執行緒join方法的執行緒會被凍結,等待某一執行緒執行結束,該執行緒才會恢復到可執行狀態

2.sychronized與鎖的區別 這裡寫圖片描述

3.樂觀鎖與悲觀鎖 (上鎖的的位置不同) 悲觀鎖:一段執行邏輯加上悲觀鎖,不同執行緒同時執行時,只能有一個執行緒執行,其他的執行緒在入口處等待,直到鎖被釋放. sychronized提供的是悲觀鎖 樂觀鎖:一段執行邏輯加上樂觀鎖,不同執行緒同時執行時,可以同時進入執行,在最後更新資料的時候要檢查這些資料是否被其他執行緒修改了(版本和執行初是否相同),沒有修改則進行更新,否則放棄本次操作. 注:悲觀鎖 適合寫入頻繁場景, 樂觀鎖 適合讀取頻繁場景。 如何進一步 確保樂觀鎖事務原子性: a.藉助C語言的ASC方式 b.加鎖:加入悲觀鎖