今天下午進行了維恩貝特的面試,之前看這個公司的面經,都是常規題,我還蠻有信心的,今天面試,完了之後,我的內心有點拔涼。
因爲緊張,有些問題不太記得了,記錄一下我還記得的問題,並且把答案整整清楚。
!!!答案都是我百度之後的自己的理解,會存在很多不正確的地方,請指出來,讓我學習學習,謝謝啦!!!
- 自我介紹
- 簡單描述一下實習期間做的項目
- oracle分頁方式,mysql分頁方式
oracle使用rownum關鍵字得到數據的行數,再加where條件對rownum進行行數的限制
mysql使用limit關鍵字
- 數據庫事務是什麼?數據庫隔離級別有什麼用
數據庫的事務就是一些操作的序列,這些序列要麼都執行要麼都不執行
隔離級別有四種,可以防止數據庫併發導致的一些問題,如髒讀、不可重複讀、幻讀
- 髒讀是怎麼發生的,幻讀是怎麼發生的
髒讀是一個線程讀到了其他線程還沒有提交的數據,可能是另外這個線程數據還沒有提交,之後需要回滾了
幻讀是一個線程兩次讀取數據的行數不一樣多,第二次比第一次多,可能是因爲另外一線程插入了數據到數據庫中
- 若有多個用戶同時操作數據庫中的數據,怎麼保證數據的正確性?
加鎖處理
- 數據庫中的事務是怎麼實現的
事務日誌,寫入數據與進行的操作
MVCC:在表後有兩個隱藏的列,創建時間和過期時間,裏面存儲的是相應的版本號
- 說說數據庫中的索引
索引是給數據表的一列或者多列進行排序,從而提高查找信息的速度
- 爲什麼加了索引查找速度會變快
索引的底層是用B+樹實現的,而非索引是進行全表掃描的形式進行查詢的
- 說說B+樹比B樹好在哪裏
B+樹內存中存有更多的元素,減少IO次數,性能高
B+樹查找元素都在葉子結點中,查找性能穩定
B+樹的葉子節點有序地組成鏈表結構,範圍查找更方便
- 說說mybatis映射的實現原理
mybatis中映射的實現其實是使用動態代理進行的。我們編寫Mapper接口,mybatis使用JDK的動態代理MapperProxyFactory爲我們生成實現類
- mybatis怎麼實現分頁的
方法一:可以使用PageHelper來實現,需要自定義一個Page類接收返回值
方法二:可以使用mysql數據庫的limit或者oracle的rownum來實現,使用#傳入參數值進行數據行數的限定
- 常用的Object的方法有哪些
hashcode:獲取對象的散列值,默認返回對象的堆內存地址
equals:比較兩個對象的值是否相等
clone:實現對象的複製
toString:返回一個String對象,默認是:對象的class名稱+@+hashcode的十六進制字符串
notify:喚醒該對象上等待的某個線程
notifyAll:喚醒該對象上等待的所有線程
wait:使該對象上的線程進入等待的狀態
finalize:垃圾回收機制中需要調用的方法
getClass:獲取對象運行時的class對象
- 怎麼實現兩個數組的合併
使用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]);
}
}
}
- 怎麼實現兩個數組的排序
使用arrays類中的sort方法進行排序
- 列表中的sort方法使用的是什麼排序法
雙軸快速排序
- 元素爲對象的數組怎麼進行排序
引入比較器。實現Comparable接口,重寫comparealeTo方法
- 怎麼實現數組的線程安全
給操作數組的地方加鎖,或者轉爲Vector來使用
- 在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)
- 程序中多線程加鎖的方式有哪些
synchronized關鍵字
lock接口
- lock加鎖怎麼使用
lock是一個接口,不能自己實例化對象,使用子類來實例化出真正可以使用的鎖,如可重入鎖ReentrantLock來實例化對象,然後調用其lock方法加鎖,在finally中使用unlock方法來釋放鎖
lock lock = new ReentrantLock();
try{
lock.lock();
...//以下代碼只有一個線程可以運行
}finally{
lock.unlock();
}
- synchronized加鎖在變量上方法上代碼塊中有什麼區別
synchronized加鎖在靜態變量上,鎖住的是類
加鎖在方法上鎖住的是實例對象
加鎖在代碼塊上,鎖住的是括號中寫的對象
- synchronized用在普通變量上和用在this上各自鎖住的是什麼
this鎖住的是實例對象
- 談談你瞭解的java7以後的併發包
通常所說的併發包是java.util.concurrent及其子包。具體主要包括以下4個方面:比synchronized更高級的同步結構;線程安全的容器;併發隊列實現;強大的Executor框架
- linux中怎麼知道是不是可執行程序?怎麼加可執行權限?
linux中的文件目錄有三種權限,RWX,分別對應着可讀可寫可執行,可以使用ll指令查看
使用chmod +x 文件名
指令添加可執行權限
- 怎麼判斷兩個服務器可以通信
在命令符窗口中ping一下對方ip地址
- 除此之外你還做過什麼項目
- 微信小程序是怎麼開發的
- 你還有什麼要問我的