更新時(shí)間:2021-11-26 11:21:08 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1188次
動(dòng)力節(jié)點(diǎn)小編為大家整理了部分中級(jí)Java軟件開(kāi)發(fā)面試題以供大家參考:
面向?qū)ο笫腔谌f(wàn)物皆對(duì)象這個(gè)觀點(diǎn). 把一個(gè)對(duì)象抽象成類(lèi),也就是Java抽象類(lèi),具體上就是把一個(gè)對(duì)象的靜態(tài)特征和動(dòng)態(tài)特征抽象成屬性和方法,也就是把一類(lèi)事物的算法和數(shù)據(jù)結(jié)構(gòu)封裝在一個(gè)類(lèi)之中,程序就是多個(gè)對(duì)象和互相之間的通信組成的。
比如把一個(gè)人看成一個(gè)對(duì)象,這個(gè)人就會(huì)有他的屬性和行為;他有手、腳、嘴巴等就是他的屬性,或者他會(huì)說(shuō)話(huà)、會(huì)走路、會(huì)吃飯就是行為,同理我們也可以把這些都看成對(duì)象,所以一個(gè)對(duì)象是可以由多個(gè)對(duì)象組成的。
面向?qū)ο缶哂蟹庋b性、繼承性、多態(tài)性。封裝就是隱蔽了對(duì)象內(nèi)部不需要暴露的細(xì)節(jié),使得內(nèi)部細(xì)節(jié)的變動(dòng)跟外界脫離,只依靠接口進(jìn)行通信;即不用管這個(gè)方法是怎么實(shí)現(xiàn)的,只要知道他可以實(shí)現(xiàn)這個(gè)功能。封裝性降低了編程的復(fù)雜性. 通過(guò)繼承使得新建一個(gè)類(lèi)變得容易,一個(gè)類(lèi)繼承了父類(lèi),則父類(lèi)所有的非私有的方法和公用屬性可以被這個(gè)類(lèi)所調(diào)用。 而繼承和實(shí)現(xiàn)接口所產(chǎn)生的多態(tài),使得不同的類(lèi)所產(chǎn)生的對(duì)象能夠?qū)ο嗤南⒆鞒霾煌姆磻?yīng),即在實(shí)現(xiàn)接口的情況下,同一個(gè)方法里的行為不同,極大地提高了代碼的通用性.。
總之,面向?qū)ο蟮奶匦蕴岣吡舜笮统绦虻闹赜眯院涂删S護(hù)性。
(1)String對(duì)象是不可改變的。
(2)如果要修改字符串而不創(chuàng)建新的對(duì)象,則可以使用 StringBuilder 類(lèi)。例如,當(dāng)在一個(gè)循環(huán)中將許多字符串連接在一起時(shí),使用 StringBuilder 類(lèi)可以提升性能。
(3)由于 String 的值一旦創(chuàng)建就不能再修改,所以稱(chēng)它是恒定的。看似能修改 String 的方法實(shí)際上只是返回一個(gè)包含修改內(nèi)容的新 String。
(4)StringBuffer可改變的Unicode字符序列,允許并發(fā)操作,是線(xiàn)程安全的。
(5)StringBuilder:可改變的Unicode字符序列操作同StringBuffer,只是不支持并發(fā)操作,非線(xiàn)程安全的 。
(6)不考慮線(xiàn)程安全前提下,StringBuilder性能最高,StringBuffer次之,String比較差。 為什么StringBuffer的性能比String高?主要原因在于String類(lèi)是不可變類(lèi),任何對(duì)String引用指向的字符串作出的修改都會(huì)導(dǎo)致生成新的字符串(對(duì)象),而對(duì)StringBuffer的修改則不會(huì)導(dǎo)致新對(duì)象的產(chǎn)生。
那么為什么StringBuilder的性能比StringBuffer的高呢?這則與線(xiàn)程安全有關(guān)。StringBuilder是線(xiàn)程非安全的。
HashMap,LinkedHashMap,TreeMap都屬于Map
Map 主要用于存儲(chǔ)鍵(key)值(value)對(duì),根據(jù)鍵得到值,因此鍵不允許鍵重復(fù),但允許值重復(fù)。
HashMap 是一個(gè)最常用的Map,它根據(jù)鍵的HashCode 值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問(wèn)速度。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線(xiàn)程的同步,即任一時(shí)刻可以有多個(gè)線(xiàn)程同時(shí)寫(xiě)HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMap 也是一個(gè)HashMap,但是內(nèi)部維持了一個(gè)雙向鏈表,可以保持順序;
TreeMap 不僅可以保持順序,而且可以用于排序;
(1)同步性
ArrayList,LinkedList是不同步的,而Vestor是同步的。所以如果不要求線(xiàn)程安全的話(huà),可以使用ArrayList或LinkedList,可以節(jié)省為同步而耗費(fèi)的開(kāi)銷(xiāo)。但在多線(xiàn)程的情況下,就得使用Vector。當(dāng)然,也可以通過(guò)一些辦法包裝ArrayList,LinkedList,使他們也達(dá)到同步,但效率可能會(huì)有所降低。
(2)數(shù)據(jù)增長(zhǎng)
從內(nèi)部實(shí)現(xiàn)機(jī)制來(lái)講ArrayList和Vector都是使用Object的數(shù)組形式來(lái)存儲(chǔ)的。
當(dāng)你向這兩種類(lèi)型中增加元素的時(shí)候,如果元素的數(shù)目超出了內(nèi)部數(shù)組的長(zhǎng)度它們都需要擴(kuò)展內(nèi)部數(shù)組的長(zhǎng)度,Vector缺省情況下自動(dòng)增長(zhǎng)原來(lái)一倍的數(shù)組長(zhǎng)度;
ArrayList是原來(lái)的50%,所以最后你獲得的這個(gè)集合所占的空間總是比你實(shí)際需要的要大。所以要在集合中保存大量的數(shù)據(jù)那么使用Vector有一些優(yōu)勢(shì)。
(3)檢索、插入、刪除對(duì)象的效率
ArrayList和Vector中,是用下標(biāo)來(lái)檢索一個(gè)對(duì)象,或在集合的末尾插入、刪除一個(gè)對(duì)象的時(shí)間是一樣的。但是,如果在集合的其他位置增加或移除元素那么花費(fèi)的時(shí)間會(huì)呈線(xiàn)形增長(zhǎng)。
LinkedList中,在插入、刪除集合中任何位置的元素所花費(fèi)的時(shí)間都是一樣的,但它在查詢(xún)一個(gè)元素的時(shí)候比較慢。
一般大家都知道ArrayList和LinkedList的大致區(qū)別:
ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
對(duì)于隨機(jī)訪問(wèn)get和set,ArrayList覺(jué)得優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針。
對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)。
(1)abstract class 在 Java 語(yǔ)言中表示的是一種繼承關(guān)系,一個(gè)類(lèi)只能使用一次繼承關(guān)系。但是,一個(gè)類(lèi)卻可以實(shí)現(xiàn)多個(gè)interface。
(2)在abstract class 中可以有自己的數(shù)據(jù)成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是static final的,不過(guò)在 interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。
(3)abstract class和interface所反映出的設(shè)計(jì)理念不同。其實(shí)abstract class表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系。
(4)實(shí)現(xiàn)抽象類(lèi)和接口的類(lèi)必須實(shí)現(xiàn)其中的所有方法。抽象類(lèi)中可以有非抽象方法。接口中則不能有實(shí)現(xiàn)方法。
(5)接口中定義的變量默認(rèn)是public static final 型,且必須給其初值,所以實(shí)現(xiàn)類(lèi)中不能重新定義,也不能改變其值。
(6)抽象類(lèi)中的變量默認(rèn)是 friendly 型,其值可以在子類(lèi)中重新定義,也可以重新賦值。
(7)接口中的方法默認(rèn)都是 public,abstract 類(lèi)型的。
多線(xiàn)程是為了同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率,而是為了提高資源使用效率來(lái)提高系統(tǒng)的效率。線(xiàn)程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候?qū)崿F(xiàn)的。如:火車(chē)是一個(gè)進(jìn)程,而車(chē)廂就是線(xiàn)程,車(chē)廂脫離了火車(chē)是不能開(kāi)動(dòng)的,同理可以由多個(gè)車(chē)廂,則一個(gè)進(jìn)程是有多個(gè)線(xiàn)程來(lái)提高效率的。
在JAVA中,要開(kāi)始一個(gè)線(xiàn)程,有兩種方式。一是直接調(diào)用Thread實(shí)例的start()方法,繼承Thread類(lèi);二是實(shí)現(xiàn)Runnable接口,將Runable實(shí)例傳給一個(gè)Thread實(shí)例然后調(diào)用它的start()方法。
實(shí)現(xiàn)同步也有兩種,一種是用同步方法,一種是用同步塊, 同步方法就是在方法返回類(lèi)型后面加上synchronized, 比如:public void synchronized add(){...}同步塊就是直接寫(xiě):synchronized (這里寫(xiě)需要同步的對(duì)象){...}
第一種方式:每個(gè)Bean都有一個(gè)代理;
第二種方式:所有Bean共享一個(gè)代理基類(lèi);
第三種方式:使用攔截器;
第四種方式:使用tx標(biāo)簽配置的攔截器;
第五種方式:全注解;
如果大家想了解更多,可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java面試題,里面有更多的知識(shí)在等著大家去學(xué)習(xí),希望對(duì)大家能夠有所幫助。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)