1、創(chuàng)建線程的集中不同的方式?你喜歡哪一種?
答:有三種方式來創(chuàng)建線程:繼承Thread類 ?、實(shí)現(xiàn)Runnable接口、應(yīng)用程序可以使用Excete()框架來創(chuàng)建線程池。
實(shí)現(xiàn)Runnable接口這種方式更受歡迎,因?yàn)檫@不需要繼承Thread類,即單繼承,多實(shí)現(xiàn)的原因?qū)е隆?/p>
2、線程的狀態(tài)有幾種?
答:Runnable:線程準(zhǔn)備運(yùn)行,不一定立馬就能開始執(zhí)行。
? ? ? Running :正在執(zhí)行的線程。
? ? ?Waiting:線程處于阻塞狀態(tài),等待外部處理結(jié)束。
? ? Sleeping:線程被強(qiáng)制睡眠。
? ?Blocked:等待I/O操作完成。
? ?Blocked on Synchronization:等待獲取鎖。
Dead:線程完成了執(zhí)行。
3、接口和抽象類的區(qū)別?
答:1)、接口中所有的方法隱含的都是抽象的。 ? ? ? 抽象類 則可以包含抽象和非抽象方法。
2)、接口支持多實(shí)現(xiàn)。抽象類支持單繼承。
3)、實(shí)現(xiàn)接口后必須要實(shí)現(xiàn)接口聲明的所有的方法(如:Dao(DaoImple)\Service(ServoceImple)),繼承類后可以不實(shí)現(xiàn)抽象類聲明的所有方法,(當(dāng)前類必須是抽象的)。
4)、java接口中的聲明的變量默認(rèn)都是final的,抽象類可以包含非final。
5)、接口中所有的方法都有事public ,抽象類中所有的函數(shù)方法可以是任何修飾符的方法。
6)、接口是比抽象類更抽象的類,絕對(duì)抽象,不可以被實(shí)例化,抽象類也不可以被實(shí)例化,但是main方法可以調(diào)用。
4、在監(jiān)視器(Monitor)內(nèi)部,是如何做到線程同步的?
答:監(jiān)視器和鎖在java虛擬機(jī)中是一塊使用的。監(jiān)視器監(jiān)視一塊同步代碼塊。確保了一次只有一個(gè)線程執(zhí)行同步代碼塊,每一個(gè)監(jiān)視器都和一個(gè)對(duì)象引用相關(guān)聯(lián),線程在獲取鎖之前不允許執(zhí)行同步d代碼。
5、線程死鎖是什么?
答:當(dāng)兩個(gè)線程循環(huán)依賴一對(duì)同步對(duì)象時(shí),會(huì)發(fā)生這種情況,假如:一個(gè)線程A進(jìn)入對(duì)象a的監(jiān)視器,如果Class B中的線程試圖調(diào)用對(duì)象A的任何同步方法,--------出現(xiàn)線程堵塞。但是,如果對(duì)象A中的線程也試圖調(diào)用對(duì)象A中的任何同步方法,那么會(huì)永遠(yuǎn)的等待下去。
死鎖特點(diǎn):
(1)、死鎖通常很少發(fā)生,只有當(dāng)兩個(gè)線程恰好一這種方式獲取cpu時(shí)鐘周期時(shí)才會(huì)發(fā)生死鎖。
(2)、死鎖可能涉及更多的線程以及更多的同步對(duì)象。
總結(jié):獲取當(dāng)前類的監(jiān)視器(類鎖:只允許一個(gè)線程操作的權(quán)限)。
線程依賴:前面線程在堵塞。后面線程進(jìn)不去。-----死鎖。
6、java集合類的接口?
答:java集合類提供了一套設(shè)計(jì)良好的支持對(duì)一組對(duì)象進(jìn)行操作接口的類。
基本接口:Colletion、Set(不可重復(fù))、List(有序可重復(fù))、Map(key\value)、
(問:Cllection和Collections的區(qū)別?)
7、(1)HashMap和Hashtable有什么區(qū)別?
答:都實(shí)現(xiàn)了Map接口,都具有Map的特點(diǎn)。
? ? ? ?HashMap允許鍵和值都是null,Hashtable不允許為null,
? ? ? Hashtable是同步的,hashMap不是,hashtable是線程安全的,hashMap不是線程安全的。
? ? ?HashMap提供了應(yīng)用于迭代的鍵的集合。
? ? ? (2)Array和ArrayList的區(qū)別?
? ? ? ?Array可以包含基本數(shù)據(jù)類型和對(duì)象類型,ArrayList只能包含對(duì)象類型。
? ? ? Array大小是固定的,ArrayList的大小是動(dòng)態(tài)變化的。
? ? ?ArrayList提供了更多的方法和特性,比如:addAll().remove();
? ? 對(duì)于基本數(shù)據(jù)類型,集合使用自動(dòng)拆裝箱來減少編碼的工作量。處理基本數(shù)據(jù)是效率比較慢。
? ? ?(3)ArrayList和LinkList的區(qū)別?
答:兩者都實(shí)現(xiàn)了List接口,ArrayList是基于索引的數(shù)據(jù)接口,底層是數(shù)組。
LinkedList是以元素列表的形式存儲(chǔ)它的數(shù)據(jù),每一個(gè)元素都和它的前一個(gè)和后一個(gè)元素鏈接在一起的。
相對(duì)于ArrayList,LinkedList的插入、添加、刪除操作速度更快,因?yàn)楫?dāng)元素被添加到集合任意位置的時(shí)候,不需要象數(shù)組那樣重新計(jì)算大小或者是更新索引。
LinkedList比ArrayList更占內(nèi)存,因?yàn)長inkedList為每一個(gè)節(jié)點(diǎn)儲(chǔ)存了兩個(gè)引用,一個(gè)指向前一個(gè)元素,一個(gè)指向下一個(gè)元素。
8、Comparable和Comparator接口的區(qū)別?
答:java提供了只包含一個(gè)compareTo()方法的Comparable接口。compareTo();可以對(duì)兩個(gè)對(duì)象排序,java提供了包含compare()和equals()兩個(gè)方法的Comparator接口。compare()方法用來給兩個(gè)輸入?yún)?shù)排序,返回負(fù)數(shù),0,正數(shù)表明第一個(gè)參數(shù)是小于,等于,大于第二個(gè)參數(shù)。equals()方法需要一個(gè)對(duì)象作為參數(shù),它用來決定輸入?yún)?shù)是否和comparator相等。只有當(dāng)輸入?yún)?shù)也是一個(gè)comparator并且輸入?yún)?shù)和當(dāng)前comparator的排序結(jié)果是相同的時(shí)候,這個(gè)方法才返回true。
9、HashSet和TreeSet的區(qū)別?
HashSet是由一個(gè)hash表來實(shí)現(xiàn)的,元素是無序的,add()\remove()\contain()。TreeSet是由樹形結(jié)構(gòu)來實(shí)現(xiàn)的,內(nèi)部元素是有序的,add()\remove()\contain().
10、String s=new String("xyz");創(chuàng)建了幾個(gè)字符串對(duì)象?
答:兩個(gè)對(duì)象,一個(gè)是靜態(tài)區(qū)的xyz,一個(gè)是用new創(chuàng)建在堆中的對(duì)象。
11、final、finally、finalize的區(qū)別?
答:final:修飾符(關(guān)鍵字)聲明類:意味著不能再派生新的子類,不可被繼承。聲明變量:可以保證在使用中不可被改變,一旦賦值不可修改,聲明方法:子類中不可被重寫。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? finally:總是最后執(zhí)行的代碼塊,finally{//釋放外部資源的代碼塊}。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? finalize:Object類中定義的方法,java中允許使用finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除的工作,這個(gè)方法是由垃圾收集器在銷毀對(duì)象時(shí)調(diào)用的,通過重寫finalize()方法可以整理系統(tǒng)資源或者執(zhí)行其他清理工作。
12、Collection和Collections的區(qū)別?
答:Collection是一個(gè)接口,它是Set、List等容器的父接口;Collections是個(gè)一個(gè)工具類,提供了一系列的靜態(tài)方法來輔助容器操作,這些方法包括對(duì)容器的搜索、排序、線程安全化等等。
13、啟動(dòng)一個(gè)線程是調(diào)用start()還是調(diào)用run()?
答:?jiǎn)?dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)制處于可以允許狀態(tài),這并不意味著線程就會(huì)立即運(yùn)行。run()方法是線程啟動(dòng)后進(jìn)行回調(diào)的方法。
14、簡(jiǎn)述synchronized和java.util.concurrent.locks.Lock的異同?
答:Lock是Java 5以后引入的新的API,和關(guān)鍵字synchronized相比主要相同點(diǎn):Lock 能完成synchronized所實(shí)現(xiàn)的所有功能;主要不同點(diǎn):Lock有比synchronized更精確的線程語義和更好的性能,而且不強(qiáng)制性的要求一定要獲得鎖。synchronized會(huì)自動(dòng)釋放鎖,而Lock一定要求程序員手工釋放,并且最好在finally 塊中釋放(這是釋放外部資源的最好的地方)。
15、java如何實(shí)現(xiàn)序列化?
答:序列化就是一種用來處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化。可以對(duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決對(duì)象流讀寫操作時(shí)可能引發(fā)的問題(如果不進(jìn)行序列化可能會(huì)存在數(shù)據(jù)亂序的問題)。
要實(shí)現(xiàn)序列化,需要讓一個(gè)類實(shí)現(xiàn)Serializable接口,該接口是一個(gè)標(biāo)識(shí)性接口,標(biāo)注該類對(duì)象是可被序列化的,然后使用一個(gè)輸出流來構(gòu)造一個(gè)對(duì)象輸出流并通過writeObject(Object)方法就可以將實(shí)現(xiàn)對(duì)象寫出(即保存其狀態(tài));如果需要反序列化則可以用一個(gè)輸入流建立對(duì)象輸入流,然后通過readObject方法從流中讀取對(duì)象。序列化除了能夠?qū)崿F(xiàn)對(duì)象的持久化之外,還能夠用于對(duì)象的深度克隆。
16、java中有幾種流?
答:字節(jié)流和字符流。字節(jié)流繼承于InputStream、OutputStream,字符流繼承于Reader、Writer。在java.io 包中還有許多其他的流,主要是為了提高性能和使用方便。關(guān)于Java的I/O需要注意的有兩點(diǎn):一是兩種對(duì)稱性(輸入和輸出的對(duì)稱性,字節(jié)和字符的對(duì)稱性);二是兩種設(shè)計(jì)模式(適配器模式和裝潢模式)。
17、statement和PreparedStatement的區(qū)別?那個(gè)性能更好?
答:與Statement相比,①PreparedStatement接口代表預(yù)編譯的語句,它主要的優(yōu)勢(shì)在于可以減少SQL的編譯錯(cuò)誤并增加SQL的安全性(減少SQL注射攻擊的可能性);②PreparedStatement中的SQL語句是可以帶參數(shù)的,避免了用字符串連接拼接SQL語句的麻煩和不安全;③當(dāng)批量處理SQL或頻繁執(zhí)行相同的查詢時(shí),PreparedStatement有明顯的性能上的優(yōu)勢(shì),由于數(shù)據(jù)庫可以將編譯優(yōu)化后的SQL語句緩存起來,下次執(zhí)行相同結(jié)構(gòu)的語句時(shí)就會(huì)很快(不用再次編譯和生成執(zhí)行計(jì)劃)。
18、事務(wù)的ACID是指什么?
答:原子性(Atomic):事務(wù)中各項(xiàng)操作,要么全做要么全不做,任何一項(xiàng)操作的失敗都會(huì)導(dǎo)致整個(gè)事務(wù)的失敗;一致性(Consistent):事務(wù)結(jié)束后系統(tǒng)狀態(tài)是一致的;隔離性(Isolated):并發(fā)執(zhí)行的事務(wù)彼此無法看到對(duì)方的中間狀態(tài);持久性(Durable):事務(wù)完成后所做的改動(dòng)都會(huì)被持久化,即使發(fā)生災(zāi)難性的失敗。通過日志和同步備份可以在故障發(fā)生后重建數(shù)據(jù)。
19、如何通過反射創(chuàng)建對(duì)象?
答:方法1:通過類對(duì)象調(diào)用newInstance()方法,例如:String.class.newInstance();方法2:通過類對(duì)象的getConstructor()或getDeclaredConstructor()方法獲得構(gòu)造器(Constructor)對(duì)象并調(diào)用其newInstance()方法創(chuàng)建對(duì)象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);
20、下次:講述面試中遇到的框架問題:Spring、SpringMVC、Hibernate、Mybatis\ibatis、Struts、SpringBoot、SpringCloud等。