Java面试日常总结大杂烩
日常總結大雜燴:
一。 取出特定行數的數據
1. select*?from?表名 limit m,n;
2. select *?from?表名? limit?[offset,]?rows;
1. m代表從m+1條記錄行開始檢索,n代表取出n條數據。(m可設為0)如:select *?from表名 limit 6,5;表示:從第7條記錄行開始算,取出5條數據?
2.值得注意的是,n可以被設置為-1,當n為-1時,表示從m+1行開始檢索,直到取出最后一條數據。如:SELECT * FROM 表名 limit 6,-1;表示:取出第6條記錄行以后的所有數據。?
3.若只給出m,則表示從第1條記錄行開始算一共取出m條如:SELECT * FROM 表名 limit 6;表示:取出前6條記錄行。
二。?ArrayList list = new ArrayList(20);中的list擴充幾次()
A 0 ? ? B 1 ? ? C 2 ? ?? D 3
答案:A
ArrayList動態擴容機制
初始化:有三種方式1. 默認的構造器,將會以默認的大小來初始化內部的數組:public?ArrayList();
2. 用一個ICollection對象來構造,并將該集合的元素添加到ArrayList:??public?ArrayList(Collection<? extends E> c)
3. 用指定的大小來初始化內部的數組:?public?ArrayList(int initialCapacity)?
??
這里我們來重點關注一下無參數構造器的實現過程:
ArrayList list=new ArrayList(); 這種是默認創建大小為10的數組,每次擴容大小為1.5倍?(10*1.5=15)
ArrayList list=new ArrayList(20); 這種是指定數組大小的創建,創建時直接分配其大小,沒有擴充。?
所以,擴充為0次
鏈接:https://www.nowcoder.com/questionTerminal/85bf28c36fa14484b950f07d269dcd49
來源:牛客網
| 123456789 | void addEntry(int hash, K key, V value, int bucketIndex) {????if ((size >= threshold) && (null != table[bucketIndex])) {????????resize(2 * table.length);????????hash = (null != key) ? hash(key) : 0;????????bucketIndex = indexFor(hash, table.length);????}????createEntry(hash, key, value, bucketIndex);} |
4.補充:hashtable是2倍+1,concurrenthashmap也是2倍
三。List list=new ArrayList()怎么理解????
List是接口,ArrayList是List的實現類。
至于為什么是寫成List list = new ArrayList()而不是ArrayList arrayList = new ArrayList()有如下的原因:
?1 接口有什么好處,這種定義方式就有什么好處當然你可以用 ArrayList ? list ? = ? new ? ArrayList()但是一般不這么用
?2 設計模式中有對依賴倒置原則。程序要盡量依賴于抽象,不依賴于具體。從Java語法上,這種方式是使用接口引用指向具體實現。
比如,你若希望用LinkedList的實現來替代ArrayList的話,只需改動一行即可:List ? list ? = ? new ? LinkedList();而程序中的其它部分不需要改動,這樣比較靈活
這個如果你想把存儲結構該為LinkedList的時候,只要把List? list=new ArrayList()改為List list=new LinkedList()而其他的所有的都不需要改動。這也是一種很好的設計模式.一個接口有多種實現,當你想換一種實現方式時,你需要做的改動很小.
?3 面向接口編程
?4 提高程序寬展性,以后修改維護好些
總結一下:
ArrayList不是繼承List接口,是實現了List接口。
你寫成ArrayList arrayList = new ArrayList();這樣不會有任何問題。和List list = new ArrayList();相比這2個寫是有區別的。
? ? ? arrayList是一個ArrayList對象,它可以使用ArrayList的所有方法。(包括list接口中沒有定義的方法)
? ? ? List是接口,它是不可以被實例化的(接口是個抽象類),所以必須以它的實現類去實例化它。list對象雖然也是被實例化為ArrayList但是它實際是List對象,list只能使用ArrayList中已經實現了的List接口中的方法,ArrayList中那些自己的、沒有在List接口定義的方法是不可以被訪問到的。
? ? ? 我們說,用接口去做是有它的好處的,如果你把類型定義成ArrayList(也就是一個具體的實現類)那么你就只能接收這一種類型的數據了,如果你要是定義為List那么你不僅可以接收ArrayList的對象還可以接收LinkedList的對象,這樣你的程序就靈活了
參考:https://blog.csdn.net/llayjun/article/details/46812151
四。?,下列說法正確的是()
A.一個文件里可以同時存在兩個public修飾的類
B.構造函數可以被重寫(override)
C.子類不能訪問父類非public和protected修飾的屬性
D.final修飾的類可以被繼承
答案:C
????????一個Java源文件中最多只能有一個public類,當有一個public類時,源文件名必須與之一致,否則無法編譯,如果源文件中沒有一個public類,則文件名與類中沒有一致性要求。至于main()不是必須要放在public類中才能運行程序。
重寫是子類繼承父類后對父類的方法進行修改。方法名,參數,返回值必須一樣。 不能重寫被標示為final的方法。如果不能繼承一個方法,則不能重寫這個方法。
擴展:重寫override,重載overload的區別
??java的方法重載
????????就是在類中可以創建多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用哪個方法,而且返回值類型可以相同也可以不相同,這也是面向對象的多態性。
? java的方法重寫
????????父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。
????????若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
????????子類函數的訪問修飾權限不能少于父類的;
????????重寫方法只能存在于具有繼承關系中,重寫方法只能重寫父類非私有的方法。
五。?關于 JAVA 堆,下面說法錯誤的是( )
A.所有類的實例和數組都是在堆上分配內存的
B.對象所占的堆內存是由自動內存管理系統回收
C.堆內存由存活和死亡的對象,空閑碎片區組成
D.數組是分配在棧中的
答案:D
????????首先數組是分配在堆中的,故D的說法不正確。
????????Java堆的結構:JVM的堆是運行時數據區,所有類的實例和數組都是在堆上分配內存。它在JVM啟動的時候被創建。對象所占的堆內存是由自動內存管理系統也就是垃圾收集器回收。堆內存是由存活和死亡的對象組成的。存活的對象是應用可以訪問的,不會被垃圾回收。死亡的對象是應用不可訪問尚且還沒有被垃圾收集器回收掉的對象。一直到垃圾收集器把這些對象回收掉之前,他們會一直占據堆內存空間。
六。?在使用super 和this關鍵字時,以下描述正確的是()
A.在子類構造方法中使用super()顯示調用父類的構造方法;
????super()必須寫在子類構造方法的第一行,否則編譯不通過
B.super()和this()不一定要放在構造方法內第一行
C.this()和super()可以同時出現在一個構造函數中
D.this()和super()可以在static環境中使用,包括static方法和static語句塊
答案:A
????????Java關鍵字this只能用于方法方法體內。當一個對象創建后,Java虛擬機(JVM)就會給這個對象分配一個引用自身的指針,這個指針的名字就是this。因此,this只能在類中的非靜態方法中使用,靜態方法和靜態的代碼塊中絕對不能出現this。
????????super關鍵字和this作用類似,是被屏蔽的成員變量或者成員方法或變為可見,或者說用來引用被屏蔽的成員變量和成員成員方法。????????不過super是用在子類中,目的是訪問直接父類中被屏蔽的成員,注意是直接父類(就是類之上最近的超類)
七。?下列語句哪一個正確()
A.Java程序經編譯后會產生machine code
B.Java程序經編譯后會產生byte code
C.Java程序經編譯后會產生DLL
D.以上都不正確
答案:B
????????Java字節碼是Java源文件編譯產生的中間文件
????????java虛擬機是可運行java字節碼的假想計算機 java的跨平臺性也是相對與其他編程語言而言的 。
????????先介紹一下c語言的編譯過程:c的文件經過C編譯程序編譯后生成windows可執行文件exe文件然后在windows中執行。
????????再介紹java的編譯過程:java的文件由java編譯程序將java字節碼文件(class文件)在java虛擬機中執行。機器碼是由CPU來執行的;Java編譯后是字節碼。
????????電腦只能運行機器碼。Java在運行的時候把字節碼變成機器碼。C/C++在編譯的時候直接編譯成機器碼
?八。??下列哪一種敘述是正確的()
A.abstract修飾符可修飾字段、方法和類
B.抽象方法的body部分必須用一對大括號{ }包住
C.聲明抽象方法,大括號可有可無
D.聲明抽象方法不可寫出大括號
答案:D
????????abstract修飾符用來修飾類和成員方法?
????????用abstract修飾的類表示抽象類,抽象類位于繼承樹的抽象層,抽象類不能被實例化。?
????????用abstract修飾的方法表示抽象方法,抽象方法沒有方法體。抽象方法用來描述系統具有什么功能,但不提供具體的實現。?
????????Abstract是Java中的一個重要關鍵字,可以用來修飾一個類或者一個方法。
????????修飾一個方法時,表示該方法只有特征簽名(signature),沒有具體實現,而是把具體實現留給繼承該類的子類,所以不能有大括號。
九。?下列說法正確的有()
A.class中的constructor不可省略
B.constructor必須與class同名,但方法不能與class同名
C.constructor在一個對象被new時執行
D.一個class只能定義一個constructor
答案:C?
????????這里可能會有誤區,其實普通的類方法是可以和類名同名的,和構造方法唯一的區分就是,構造方法沒有返回值。?
十。?GC線程是否為守護線程()
答案:是
????????線程分為守護線程和非守護線程(即用戶線程)。
????????只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就全部工作;只有當最后一個非守護線程結束時,守護線程隨著JVM一同結束工作。
????????守護線程最典型的應用就是 GC (垃圾回收器)
十一。??關于sleep()和wait(),以下描述錯誤的一項是( )
A. sleep是線程類(Thread)的方法,wait是Object類的方法;
B. sleep不釋放對象鎖,wait放棄對象鎖;
C. sleep暫停線程、但監控狀態仍然保持,結束后會自動恢復;
D. wait后進入等待鎖定池,只有針對此對象發出notify方法后獲得對象鎖進入運行狀態。
答案:D
????????sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。
????????wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
十二。?
方法resume()負責恢復哪些線程的執行( )
A,通過調用stop()方法而停止的線程。
B,通過調用sleep()方法而停止的線程。
C,通過調用wait()方法而停止的線程。
D,通過調用suspend()方法而停止的線程。
答案:D
????????suspend可以掛起一個線程,就是把這個線程暫停了,它占著資源,但不運行,用resume是恢復掛起的線程,讓這個線程繼續執行下去。
十三。?Hashtable和HashMap的異同
同:都使用哈希表來存儲鍵值對,在數據結構上基本相同,都創建了一個繼承自Map.Entry的私有內部類Entry,每一個Entry對象表示存儲在哈希表中的一個鍵值對。
1.?Hashtable是同步的,線程安全的(就是一些公開的方法比如get()使用了synchronized描述符,而遍歷視圖比如keySet使用了Collection.synchronizedSet進行同步包裝);而HashMap不是同步的,線程不安全
2.?Hashtable不支持nullkey和nullvalue,它會拋出異常,而HashMap支持,因為HashMap在實現的時候,將null的hashCode值定為0,從而將其存放在哈希表的第0個bucket中
3. 、Hashtable已經被淘汰了,盡量少用,不需要線程安全就用HashMap,需要就用ConcurrentHashMap。
4.,Hashtable產生于JDK1.1,而HashMap產生于JDK1.2,HashMap比Hashtable出現的晚一點
5.?HashMap繼承自抽象類AbstractMap,而Hashtable繼承自抽象類Dictionary,而Dictionary類是一個已經廢棄的類
十四。 并發操作會帶來哪些數據不一致性? A不可修改、不可重復讀、臟讀、死鎖 B丟失修改、臟讀、死鎖 C不可重復讀、臟讀、死鎖
D?丟失修改、不可重復讀、臟讀
臟讀:就是指當一個事務對數據進行了修改但還沒有提交到數據庫時,另一個事務訪問并使用了這個數據。
不可重復讀:在一個事務內兩次讀數據之間,第二個事務訪問該數據并進行了修改。
丟失修改:兩個事務讀入同一數據并修改,T2提交的結果破壞了T1提交的結果。例如T1讀A修改為A-1,T2也讀A修改為A-1(實際上應該是讀A-1,修改為A-2)
幻影讀:同一事務在兩個不同的時間段執行相同的查詢條件得到的結果不一致。
注意區分:
不可重復讀的重點是修改?:?
同樣的條件 , ? 你讀取過的數據 , ? 再次讀取出來發現值不一樣了?
幻讀的重點在于新增或者刪除?
同樣的條件 , ? 第 1 次和第 2 次讀出來的記錄數不一樣。
十五。下列的()原始類型在使用流時可以互換。
A.byte和boolean?
B.char和int
C.byte和char
D.String和char
正確答案:B
B。【解析】本題考查Java語言中字節類型的概念。在Java語言中,byte是字節類型,用1字節表示;boolean是布爾類型,用true和false表示,它們的表示方法并不一樣,也不提供它們之間的轉換,選項A錯誤。Java內部用整數來表示char,通常可以在方法調用和其他語句中互換使用char和int,選項B正確。char用2字節表示,byte字節類型用1字節表示,Java內部也不允許互換使用它們,選項C錯誤。String在Java語言中是一個類,它提供對字符串的一系列操作,而char是Java語言中的一個基本類型,它不是一個類,兩者有本質的區別,故而它們是不能互換使用的,選項D錯誤。需要注意的是,在Java語言中提供的類都是以大寫字母開頭,基本類型都用小寫字母表示。
總結
以上是生活随笔為你收集整理的Java面试日常总结大杂烩的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse使用————Working
- 下一篇: eclipse项目一直显示有错,但是一直