涼麪經-維恩貝特面試覆盤

今天下午進行了維恩貝特的面試,之前看這個公司的面經,都是常規題,我還蠻有信心的,今天面試,完了之後,我的內心有點拔涼。

因爲緊張,有些問題不太記得了,記錄一下我還記得的問題,並且把答案整整清楚。

!!!答案都是我百度之後的自己的理解,會存在很多不正確的地方,請指出來,讓我學習學習,謝謝啦!!!

  1. 自我介紹
  2. 簡單描述一下實習期間做的項目
  3. oracle分頁方式,mysql分頁方式

oracle使用rownum關鍵字得到數據的行數,再加where條件對rownum進行行數的限制
mysql使用limit關鍵字

  1. 數據庫事務是什麼?數據庫隔離級別有什麼用

數據庫的事務就是一些操作的序列,這些序列要麼都執行要麼都不執行
隔離級別有四種,可以防止數據庫併發導致的一些問題,如髒讀、不可重複讀、幻讀

  1. 髒讀是怎麼發生的,幻讀是怎麼發生的

髒讀是一個線程讀到了其他線程還沒有提交的數據,可能是另外這個線程數據還沒有提交,之後需要回滾了
幻讀是一個線程兩次讀取數據的行數不一樣多,第二次比第一次多,可能是因爲另外一線程插入了數據到數據庫中

  1. 若有多個用戶同時操作數據庫中的數據,怎麼保證數據的正確性?

加鎖處理

  1. 數據庫中的事務是怎麼實現的

事務日誌,寫入數據與進行的操作

MVCC:在表後有兩個隱藏的列,創建時間和過期時間,裏面存儲的是相應的版本號

  1. 說說數據庫中的索引

索引是給數據表的一列或者多列進行排序,從而提高查找信息的速度

  1. 爲什麼加了索引查找速度會變快

索引的底層是用B+樹實現的,而非索引是進行全表掃描的形式進行查詢的

  1. 說說B+樹比B樹好在哪裏

B+樹內存中存有更多的元素,減少IO次數,性能高

B+樹查找元素都在葉子結點中,查找性能穩定

B+樹的葉子節點有序地組成鏈表結構,範圍查找更方便

  1. 說說mybatis映射的實現原理

mybatis中映射的實現其實是使用動態代理進行的。我們編寫Mapper接口,mybatis使用JDK的動態代理MapperProxyFactory爲我們生成實現類

  1. mybatis怎麼實現分頁的

方法一:可以使用PageHelper來實現,需要自定義一個Page類接收返回值
方法二:可以使用mysql數據庫的limit或者oracle的rownum來實現,使用#傳入參數值進行數據行數的限定

  1. 常用的Object的方法有哪些

hashcode:獲取對象的散列值,默認返回對象的堆內存地址
equals:比較兩個對象的值是否相等
clone:實現對象的複製
toString:返回一個String對象,默認是:對象的class名稱+@+hashcode的十六進制字符串
notify:喚醒該對象上等待的某個線程
notifyAll:喚醒該對象上等待的所有線程
wait:使該對象上的線程進入等待的狀態
finalize:垃圾回收機制中需要調用的方法
getClass:獲取對象運行時的class對象

  1. 怎麼實現兩個數組的合併

使用System.arraycopy方法進行數組的複製,方法中第一個參數是要複製到數組,第二個參數是從哪個下標開始複製,第三個參數是目標數組,第四個參數複製到目標數組的開始下標,第五個參數是複製的長度;另外,因爲數組的長度是不可變的,所以還需要創建一個數組來作爲目標數組

public class array {
    public static void main(String[] args) {
        //聲明數組1
        String[] str1 = new String[]{"1","2"};
 
        //聲明數組2
        String[] str2 = new String[]{"3","4"};
 
        //目標數組
        String[] str3 = new String[4];
 
        //將數組1放到目標數組中,參數爲:
        // 1.將要複製的數組  2.從將要複製的數組的第幾個元素開始  3.目標數組   4.將要放到目標數組的那個位置   5.複製多少個元素
        System.arraycopy(str1,0,str3,0,str1.length);
 
        //複製數組2到目標數組中
        System.arraycopy(str2,0,str3,2,str2.length);
 
        //循環輸出看
        for (int i = 0;i<str3.length;i++){
            System.out.println(str3[i]);
        }
    }
}
  1. 怎麼實現兩個數組的排序

使用arrays類中的sort方法進行排序

  1. 列表中的sort方法使用的是什麼排序法

雙軸快速排序

  1. 元素爲對象的數組怎麼進行排序

引入比較器。實現Comparable接口,重寫comparealeTo方法

  1. 怎麼實現數組的線程安全

給操作數組的地方加鎖,或者轉爲Vector來使用

  1. 在java應用程序中是怎麼實現事務的

在Spring中,首先在application中配置事務管理器,然後在方法上使用@Transactional的註解

application.xml

<!-- 配置事務管理器,全註解聲明式事務  -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

web.xml

<!--開啓了對註解的解析-->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

代碼中

@Transactional(propagation=Propagation.REQUIRED, rollbackFor=RuntimeException.class)

  1. 程序中多線程加鎖的方式有哪些

synchronized關鍵字
lock接口

  1. lock加鎖怎麼使用

lock是一個接口,不能自己實例化對象,使用子類來實例化出真正可以使用的鎖,如可重入鎖ReentrantLock來實例化對象,然後調用其lock方法加鎖,在finally中使用unlock方法來釋放鎖

lock lock = new ReentrantLock();
try{
lock.lock();
...//以下代碼只有一個線程可以運行
}finally{
lock.unlock();
}
  1. synchronized加鎖在變量上方法上代碼塊中有什麼區別

synchronized加鎖在靜態變量上,鎖住的是類

加鎖在方法上鎖住的是實例對象

加鎖在代碼塊上,鎖住的是括號中寫的對象

  1. synchronized用在普通變量上和用在this上各自鎖住的是什麼

this鎖住的是實例對象

  1. 談談你瞭解的java7以後的併發包

通常所說的併發包是java.util.concurrent及其子包。具體主要包括以下4個方面:比synchronized更高級的同步結構;線程安全的容器;併發隊列實現;強大的Executor框架

  1. linux中怎麼知道是不是可執行程序?怎麼加可執行權限?

linux中的文件目錄有三種權限,RWX,分別對應着可讀可寫可執行,可以使用ll指令查看
使用chmod +x 文件名 指令添加可執行權限

  1. 怎麼判斷兩個服務器可以通信

在命令符窗口中ping一下對方ip地址

  1. 除此之外你還做過什麼項目
  2. 微信小程序是怎麼開發的
  3. 你還有什麼要問我的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章