1. 程式人生 > >記錄某公司(簡稱SMKJ) 的一次面試

記錄某公司(簡稱SMKJ) 的一次面試

昨天去了一家公司面試 Java 開發崗位,這篇文章主要是做一個面試的記錄以及總結。

這家公司的規模大概100-200人,環境還可以,在一棟大廈租了兩層辦公室(31層和32層)。一同搭電梯上去的還有一位去應聘測試崗位的妹紙��

這裡要吐槽一下該公司的前臺,由於跟HR約好了是在31樓面試,我和測試妹紙都去了31樓的前臺,31樓的前臺直接讓我們去樓上找32樓的前臺,32樓的前臺找了樓下31樓的面試官,結果又把我們帶回樓下31樓面試。

首先填了一份個人資訊表,然後直接進入面試環節(沒有筆試 ��)。

以下是面試時一些問題的記錄:

1、面向物件的三大特性

答:封裝、繼承、多型。

2、XML解析

答:
1、解析方式
* DOM:Document Object Model,文件物件模型。這種方式是W3C推薦的處理XML的一種標準方式。

缺點:必須讀取整個XML文件,才能構建DOM模型,如果XML文件過大,造成資源的浪費。
優點:適合對XML中的資料進行操作(CRUD)。

  • SAX:Simple API for XML。這種方式不是官方標準,屬於開源社群XML-DEV,幾乎所有的XML解析器都支援它。

2、解析工具
* JAXP:

DOM或SAX方式進行解析XML。API在JDK之中。

  • Dom4J:(推薦)

是開源組織推出的解析開發包。(牛,大家都在用,包括SUN公司的一些技術的實現都在用)

3、反射

答:當我們的程式在執行時,需要動態的載入一些類,這些類可能之前用不到所以不用載入到jvm,而是在執行時根據需要才載入,這樣的好處對於伺服器來說不言而喻。

舉個例子,我們的專案底層有時是用mysql,有時用oracle,需要動態地根據實際情況載入驅動類,這個時候反射就有用了,假設 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection這兩個類我們要用,這時候我們的程式就寫得比較動態化,通過Class tc = Class.forName(“com.java.dbtest.TestConnection”);通過類的全類名讓jvm在伺服器中找到並載入這個類,而如果是oracle則傳入的引數就變成另一個了。這時候就可以看到反射的好處了,這個動態性就體現出java的特性了!

舉多個例子,大家如果接觸過spring,會發現當你配置各種各樣的bean時,是以配置檔案的形式配置的,你需要用到哪些bean就配哪些,spring容器就會根據你的需求去動態載入,你的程式就能健壯地執行。

4、Java 8 新特性

  • Lambda 表示式:Lambda允許把函式作為一個方法的引數(函式作為引數傳遞進方法中)。

  • 方法引用:方法引用提供了非常有用的語法,可以直接引用Java的類方法、物件方法或者構造器。

5、Lambda 表示式

Lambda 表示式我們可以理解為對於函式式介面和其中的抽象方法的具體實現。

Lambda 表示式可以認為是一種特殊的匿名內部類,Lambda只能用於函式式介面。

lambda語法如下:

     ([形參列表,不帶資料型別]) -> {
         //執行語句
         [return..;]
     }

程式碼演示如下:

public class TestLambda {  
     public static void main(String[] args) {  
           TestLambdaInterface1 t1 = new TestLambdaInterface1() {  
                @Override  
                public void test() {  
                     System.out.println("使用匿名內部類");  

                }  
           };  

           //與上面的匿名內部類執行效果一樣  
           //右邊的型別會自動根據左邊的型別進行判斷  
           TestLambdaInterface1 t2 = () -> {  
                System.out.println("使用lambda");  
           };  
           t1.test();  
           t2.test(); 
     }
}

@FunctionalInterface  
interface TestLambdaInterface1 {  
     //不帶引數的抽象方法  
     void test();  
}  

6、設計模式

單例模式

單例模式:確保一個類只有一個例項,並提供了一個全域性訪問點。

實現:

  • 使用一個私有靜態變數、一個私有建構函式以及一個公有靜態函式來實現。

  • 私有建構函式保證了不能通過建構函式來建立物件例項,只能通過公有靜態函式返回唯一的私有靜態變數。

public class Singleton {

    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

代理模式

釋出訂閱模式

MVC 模式

7、Hibernate 的一級快取、二級快取

Session 的快取被稱為 Hibernate 的第一級快取。SessionFactory 的外接快取稱為 Hibernate 的二級快取。這兩個快取都位於持久層,它們存放的都是資料庫資料的拷貝。SessionFactory 的 內建快取 存放元資料和預定義 SQL,SessionFactory 的內建快取是隻讀快取。

快取的作用:

  • 減少資料庫的訪問頻率,提高訪問效能。

  • 保證快取中的物件與資料庫同步,位於快取中的物件稱為持久化物件。

8、ConcurrentHashMap 的 key 可不可以為 null ?

  • HashMap 可以允許插入 null key 和 null value

  • HashTable 和 ConcurrentHashMap 都不可以插入 null key 和 null value

9、執行緒池的執行緒命名

一、建立執行緒的時候沒有傳入名字

ThreadPoolManager.potatoPool.execute(new MyThread());  

在這種情況下,執行緒池會給執行緒自動命名,如果想改變執行緒的名稱,那麼需要線上程中的run方法中給執行緒setName。如下:

public class MyThread extends Thread{  
    public String threadName;  
    public MyThread (String threadName){  
        this.threadName=threadName;  
    }  

    @Override  
    public void run() {  
        Thread.currentThread().setName(threadName);  
    }  

}  

二、建立執行緒的時候直接傳入名字

ThreadPoolManager.potatoPool.execute(new MyThread("aa"));  

10、Linux上安裝好MySQL,只能本機訪問,其他機器不能訪問的問題

1、許可權問題,修改許可權

2、防火牆的原因,修改防火牆配置

11、執行緒池核心執行緒數(core) 和 最大執行緒數(max)

當所有的核心執行緒(core) 都在幹活時,新新增的任務會被新增到佇列中等待處理,如果佇列滿了,則新建非核心執行緒執行任務。

12、執行緒池捕獲異常

public class CaptureUncaughtException {  
    public static void main(String[] args) {  
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());  
        ExecutorService exec = Executors.newCachedThreadPool();  
        exec.execute(new ExceptionThread2());  // ExceptionThread2 為任務物件
    }  
}  

/**  
 * MyUncaughtExceptionHandler:捕獲執行緒異常處理的類,需要實現 UncaughtExceptionHandler 介面
 * @author nnngu  
 */  
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {  
    @Override  
    public void uncaughtException(Thread t, Throwable e) {  
        System.out.println(t+"捕獲到了異常,異常處理的物件為:"+e); // e:丟擲的物件 
    }  
}  

13、Mybatis 的 Mapper

參考:

14、Jsp和servlet ,jsp的 9大內建物件

Servlet 的生命週期:init、service(doGet、doPost)、destory

JSP 的九大內建物件:

內建物件名 型別
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext

JSP 的四大域物件:

物件
ServletContext context域
HttpServletRequet request域
HttpSession session域
PageContext page域

15、檔案上傳、socket、流

參考:

16、Netty

參考:

17、集合

答:List、Set、Map

List 是有序的,可以有重複元素

Set 是無序的,不允許有重複元素

Map 是鍵值對

18、IO 和 NIO

參考:

19、寫在最後

最後,我發現面試官也有一些錯誤,在此也把它記錄下來:

  • 面試官說 NIO 是 JDK 1.5 之後引入的。(其實 NIO 是 JDK 1.4 開始引入的)
  • 關於執行緒池的核心執行緒數(core) 和 最大執行緒數(max)的問題,面試官說當執行緒池裡的執行緒數達到核心執行緒數(core) 時,新來了任務就會繼續建立執行緒來處理。(其實當執行緒數達到核心執行緒數之後,新來的任務會加入佇列等待處理,只有當佇列滿了才會繼續建立執行緒)

先寫到這裡,以後有什麼補充再更新。