一.非技術(shù)題
1.有7個球。大小相同。僅有一個重量不同。給你一個平稱,最快速度找到重量不一樣的那一顆;
(1)先拿出其中6個球,平均分放到天平兩端。
(2)如果天平平衡,則剩下不同。
(3)如果天平不平衡,則選重的那邊任意兩個球做比較。
(4)如果一樣重,則剩下的那個求就是不一樣的,如果天平不平衡,從之前那三顆選出一顆與其中一顆比較,一樣則是另一顆,不一樣則是比較的這顆。
二、技術(shù)題
1.下列關(guān)于構(gòu)造函數(shù)的描述正確的是(C);
A、構(gòu)造函數(shù)可以聲明返回類型;
B、構(gòu)造函數(shù)不可以有private修飾;
C、構(gòu)造函數(shù)通常與類名相同;
D、構(gòu)造函數(shù)不能帶參數(shù);
2.下列關(guān)于C#索引器理解正確的是( C);
A、索引器的參數(shù)必須是2個或2個以上;
B、索引器的參數(shù)必須是整數(shù)型;
C、索引器沒有名字;
D、以上皆非;
索引至少聲明1個參數(shù),A錯;索引參數(shù)類型不必是整型, B錯;索引確實沒有名字,名字位置上都是關(guān)鍵字this,C對。
3.委托可以把( C)遞給( C);
A、對象和對象;
B、對象和方法;
C、方法和方法;
4.以下哪個是排序的數(shù)據(jù)列表:(A );
A、SortedList B、HashTable
C、ArryList D、Heap
5.關(guān)于線程和進程的說法( C);
A、操作系統(tǒng)中的每一個應(yīng)用程序必須由一個進程,但不必有線程;
B、一個進程可以有自己的堆棧,但是線程只能和進程共享堆棧;
C、線程必隸屬于一個進程;
D、線程可以改變它屬于哪個進程;
二、簡答題
1.C#的類和接口有什么異同?
是繼承與被繼承的關(guān)系,類可以繼承接口,實現(xiàn)接口所有的方法。接口只是定義方法的返回值什么的,而繼承類則負責(zé)實現(xiàn)接口的方法,就這么個關(guān)系;
抽象類:
抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明于抽象類中,且不包含任何實現(xiàn),派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。
接口:
接口是引用類型的,類似于類,更和抽象類有所相似,以至于很多人對抽象類和接口的區(qū)別比較模糊。和抽象類的相似之處有三點:
1、不能實例化;
2、包含未實現(xiàn)的方法聲明;
3、派生類必須實現(xiàn)未實現(xiàn)的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);
另外,接口有如下特性:
接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員。
一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。 其實java的接口和抽象類跟C#是差不多的, 他們的特性是相同!別的就是語法的不同了!
2.C#訪問修飾符有哪些,分別有什么作用?
public 公共的,可任意訪問
private 私有的,可被本類訪問
protected保護,可被本類和子類訪問
internal 內(nèi)部,可被本程序集內(nèi)的所有類訪問
protected internal內(nèi)部保護,只能被本程序集內(nèi)的所有類和這些類的繼承子類所存取
3.C#中類可以實現(xiàn)多繼承嗎?通過什么方式實現(xiàn)?
C#中類不支持多繼承,但是允許類和接口之間實現(xiàn)多繼承
所以第一個方法,一個一個派生
第二個方法,利用接口,實現(xiàn)多繼承
4.什么是反射?
JAVA中的反射是運行中的程序檢查自己和軟件運行環(huán)境的能力,它可以根據(jù)它發(fā)現(xiàn)的進行改變。通俗的講就是反射可以在運行時根據(jù)指定的類名獲得類的信息。
5.一數(shù)列的規(guī)則如下:0、1、1、1、2、3、4、6、9....求第30位數(shù)是多少,用遞歸算法實現(xiàn);
0,1,2,3,4,9,6,27,這些數(shù)字有什么規(guī)律
分成2組觀察
0,2,4,6,8,10......
依次的雙數(shù)
1,3,9,27,81,243.....
后一個數(shù)是前一個數(shù)的三倍
6.C#可否對內(nèi)存進行直接操作?
可以的,
c#中是有指針的,雖然很少用到,雖然使用時要加上"unsafe"
只針對這個問題,c#是可以的
可是使用時要加上"unsafe",這已經(jīng)是他從c++過來的一個轉(zhuǎn)變了,......
7.簡述MVC及其優(yōu)缺點?
MVC本來是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計數(shù)據(jù)你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。
優(yōu)點:
1:耦合性低
視圖層和業(yè)務(wù)層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,同樣,一個應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需要改動MVC的模型層即可。因為模型與控制器和視圖相分離,所以很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。
2:重用性高
隨著技術(shù)的不斷進步,需要用越來越多的方式來訪問應(yīng)用程序。MVC模式允許使用各種不同樣式的視圖來訪問同一個服務(wù)器端的代碼,因為多個視圖能共享一個模型,它包括任何WEB(HTTP)瀏覽器或者無線瀏覽器(wap),比如,用戶可以通過電腦也可通過手機來訂購某樣產(chǎn)品,雖然訂購的方式不一樣,但處理訂購產(chǎn)品的方式是一樣的。由于模型返回的數(shù)據(jù)沒有進行格式化,所以同樣的構(gòu)件能被不同的界面使用。
MVC使開發(fā)和維護用戶接口的技術(shù)含量降低。
3:部署快
使用MVC模式使開發(fā)時間得到相當大的縮減,它使程序員(Java開發(fā)人員)集中精力于業(yè)務(wù)邏輯,界面程序員(HTML和JSP開發(fā)人員)集中精力于表現(xiàn)形式上。
4:可維護性高
分離視圖層和業(yè)務(wù)邏輯層也使得WEB應(yīng)用更易于維護和修改。
5:有利軟件工程化管理
由于不同的層各司其職,每一層不同的應(yīng)用具有某些相同的特征,有利于通過工程化、工具化管理程序代碼??刂破饕蔡峁┝艘粋€好處,就是可以使用控制器來聯(lián)接不同的模型和視圖去完成用戶的需求,這樣控制器可以為構(gòu)造應(yīng)用程序提供強有力的手段。給定一些可重用的模型和視圖,控制器可以根據(jù)用戶的需求選擇模型進行處理,然后選擇視圖將處理結(jié)果顯示給用戶。
缺點:
1:沒有明確的定義
完全理解MVC并不是很容易。使用MVC需要精心的計劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費一些時間去思考。同時由于模型和視圖要嚴格的分離,這樣也給調(diào)試應(yīng)用程序帶來了一定的困難。每個構(gòu)件在使用之前都需要經(jīng)過徹底的測試。
2:不適合小型,中等規(guī)模的應(yīng)用程序
花費大量時間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會得不償失。
3:增加系統(tǒng)結(jié)構(gòu)和實現(xiàn)的復(fù)雜性
對于簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運行效率。
4:視圖與控制器間的過于緊密的連接
視圖與控制器是相互分離,但卻是聯(lián)系緊密的部件,視圖沒有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。
5:視圖對模型數(shù)據(jù)的低效率訪問
依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對未變化數(shù)據(jù)的不必要的頻繁訪問,也將損害操作性能。
6:一般高級的界面工具或構(gòu)造器不支持模式
改造這些工具以適應(yīng)MVC需要和建立分離的部件的代價是很高的,會造成MVC使用的困難。
8.C#中委托是什么,事件是不是一種委托。
委托是一種在對象里保存方法引用的類型,同時也是一種類型安全的函數(shù)指針。
9.a=10,b=15,在不適用第三方變量的前提下,把a、b的值互換。
a=a+b;
b=a-b;
a=a-b;
10.hashMap的數(shù)據(jù)結(jié)構(gòu);
在Java編程語言中,最基本的結(jié)構(gòu)就是兩種,一個是數(shù)組,另外一個是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個基本結(jié)構(gòu)來構(gòu)造的,HashMap也不例外。HashMap實際上是一個“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體。
11.Redis可緩存哪幾種數(shù)據(jù)類型;
String類型、List類型、Set類型(不可重復(fù)的無序集合)、ZSet(不可重復(fù)的有序集合)、Hash(鍵值對集合)
12.集合怎么擴容;怎么不使用新集合的情況下去重;
ArrayList 默認初始容量為10
線程不安全,查詢速度快
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組結(jié)構(gòu)
擴容增量:原容量的 0.5倍
如 ArrayList的容量為10,一次擴容后是容量為15
同樣可以通過分析源碼知道:
Vector:線程安全,但速度慢
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組結(jié)構(gòu)
加載因子為1:即當 元素個數(shù) 超過 容量長度 時,進行擴容
擴容增量:原容量的 1倍
如 Vector的容量為10,一次擴容后是容量為20
Set(集) 元素?zé)o序的、不可重復(fù)。
HashSet:線程不安全,存取速度快
底層實現(xiàn)是一個HashMap(保存數(shù)據(jù)),實現(xiàn)Set接口
默認初始容量為16(為何是16,見下方對HashMap的描述)
加載因子為0.75:即當 元素個數(shù) 超過 容量長度的0.75倍 時,進行擴容
擴容增量:原容量的 1 倍
如 HashSet的容量為16,一次擴容后是容量為32
for(int x =0;x<a.size()-1;x++){
for(int y=(x+1);y<a.size();y++){
if(a.get(x).equals(a.get(y))){
a.remove(y); y--;//這里很重要 在內(nèi)循環(huán)中如果刪掉一個元素 下一個元素會補位到被刪除的位置 但是內(nèi)循環(huán)y依舊是跳到下一個位置去了,所以補位的元素就沒有判斷 而跳過去了!每次 刪除一個元素后 要把y退回到上一個位置!
}
}
}
System.out.println(a);