昨天參加了某公司的校招筆試,整體來說題目算比較簡單,但是在做的時(shí)候,才發(fā)現(xiàn)有些概念記得不是很清楚,所以在此把遇到的又覺得比較容易弄混的問題記下來,以后也會(huì)采用這種方式總結(jié)經(jīng)驗(yàn)哈。
首先出場的就是常見的 ++i 和 i++ ,關(guān)于這個(gè)不是說難,就是容易記混淆,可以自己寫段代碼看看具體效果
public class Test { public static void main(String[] args) { int i = 0,j = 0; int a = ++i; int b = j++; System.out.println("i = " + i + " " + "j = " + j); System.out.println("a = " + a + " " + "b = " + b); } }
下面是輸出結(jié)果
可以看到,最后a和b的值不一樣,這就是我們經(jīng)常說的++i 是先加1然后再參與計(jì)算,而 i++則是先參與計(jì)算,再加1. 對于int a = ++i相當(dāng)于是先執(zhí)行了i=i+1;再執(zhí)行int a =i,而對于int b = j++則是相當(dāng)于先執(zhí)行了int b = j,再執(zhí)行j=j+1
PS:其實(shí)這樣記就很簡單了,i和j就是主角嘍,++就是主角要干事了,參與計(jì)算就是好事來了。把自己放在前面的,就是貪圖私利,萬事以己為先的人,那么好事來了,當(dāng)然先去理會(huì)好事嘍,即先參與好事(計(jì)算),之后才注意到自己原來的事(自加1)。而另外一個(gè)則是相反嘍
接下來的就是常見的筆試題目了。關(guān)于String, StringBuffer,StringBuilder的區(qū)別,如下:
對于由String定義的字符串來說,每一次改變字符串都會(huì)新增加一個(gè)對象,如String a = “hah”;String a = a + “hih”;在第二個(gè)語句中改變a時(shí),就會(huì)新new一個(gè)String對象(值得注意的是,String本身是一個(gè)類而不是基本數(shù)據(jù)類型);而StringBuilder和StringBuffer,在每次操作字符串時(shí)則不會(huì)新增對象,而是直接操作原對象;StringBuilder類和StringBuffer類基本是相同的,主要的區(qū)別就在于StringBuffer類是線程安全的,在多線程訪問時(shí)起保護(hù)作用。
關(guān)于MVC設(shè)計(jì)模式的理解
MVC 模式是一種軟件架構(gòu)模式,把軟件系統(tǒng)分成三個(gè)部分:模型(Model)、視圖(View)、控制器(Controller)
模型(Model):應(yīng)用程序的主體部分,程序員在此編寫應(yīng)有的功能,當(dāng)數(shù)據(jù)發(fā)生改變時(shí),它負(fù)責(zé)通知視圖部分,一個(gè)模型可以為多個(gè)視圖提供數(shù)據(jù)。
視圖(View):視圖即為用戶看到的界面,可以與用戶進(jìn)行交互,視圖可以根據(jù)由模型傳遞的數(shù)據(jù)來進(jìn)行視圖的更新
控制器(Controller):主要是負(fù)責(zé)安排模型和視圖來處理相應(yīng)的請求,調(diào)用模型來響應(yīng)請求并在視圖中反應(yīng)處理后的結(jié)果使用該模式的目的:實(shí)現(xiàn)動(dòng)態(tài)程序設(shè)計(jì),使程序的部分重用成為可能,同時(shí)使程序結(jié)構(gòu)更為直觀
簡圖如下:
還遇到一個(gè)讀程序題,大致如下
public class Test { public static void main(String[] args) { int i = 0; for(f('A'); f('B') && i<2; f('D')){ i++; f('C'); } } static boolean f(char a){ System.out.print(a); return true; } }
求輸出結(jié)果?
這道題主要就是在于那個(gè)for循環(huán),在執(zhí)行for循環(huán)時(shí),順序是這樣的
for(1; 2; 4){ 3; }
1處是最先執(zhí)行的,一般是定義變量,如 int = 0,執(zhí)行一次后就不再執(zhí)行
2處是接下來執(zhí)行的,用于定義循環(huán)的限制條件
3處是循環(huán)中的內(nèi)容
4處是最后執(zhí)行的
題中就是把常見的for循環(huán)里面的條件及內(nèi)容都換成了一個(gè)函數(shù),最終輸出的結(jié)果是 ABCDBCDB
最后就是算法類題目了,這次在做題時(shí)才發(fā)現(xiàn)自己把冒泡排序和選擇排序弄混淆了,兩個(gè)排序法乍一看還真是有那么點(diǎn)相像啊
相同點(diǎn):都是一次選出一個(gè)最值
不同點(diǎn):冒泡中相鄰元素滿足排序要求則會(huì)直接進(jìn)行交換。而選擇排序中則是每相鄰的比較時(shí),把最值的那個(gè)的序號(hào)保存下來,最終獲得待排序數(shù)組的最值的序號(hào),然后與待排序數(shù)組中第一個(gè)值進(jìn)行交換
冒泡(從小到大排):
for(int i = 1; i < length; i ++){ for(int j = 0; j < length - i; j ++){ if(array[j] > array[j + 1]){ int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } }
選擇(從小到大排):
for(int i = 0; i < length; i ++){ int minIndex = i; for(int j = i + 1; j < length; j ++){ if(array[j] < array[minIndex]){ minIndex = j; } } if(minIndex != i){ int temp = array[minIndex]; array[minIndex] = array[i]; array[i] = temp; } }