java考题_Java考题知识点
挑戰10個最難回答的Java面試題(附答案) - 里奧ii的文章 - 知乎 https://zhuanlan.zhihu.com/p/79186037
1.java的基本編程單元是類,基本存儲單元是變量;
2.對于.java文件而言,一個文件中可以有多個類,但是只能有一個class和.java的文件一致。同時一旦這個.java文件中存在外部的public類,那么這么外部的public類的類名必須和.java的文件名一致。但是考慮到內部類,一個.java文件中可以有多個內部public類,這些的名字也都和.java的名字一樣。
3.AOP? 和? OOP的區別:
(1). 面向方面編程? AOP? 偏重業務處理過程的某個步驟或階段,強調降低模塊之間的耦合度,使代碼擁有更好的移植性。
(2). 面向對象編程? (oop)? 則是對業務分析中抽取的實體進行方法和屬性的封裝。
也可以說? AOP? 是面向業務中的動詞領域,? OOP? 面向名詞領域。
AOP 的一個很重要的特點是源代碼無關性,也就是說如果我們的系統中引用了 AOP 組件,即使我們把該組件去掉,系統代碼也應該能夠編譯通過。要實現這一點,可以使用動態 proxy 模式。
4.java 語言使用的字符碼集是 Unicode。 ?Unicode(統一碼 、萬國碼、單一碼)是計算機科學領域里的一項業界標準,包括字符集、編碼方案等。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制 編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。目前的Unicode字符分為17組編排,0x0000 至 0x10FFFF,每組稱為平面(Plane),而每平面擁有65536個碼位,共1114112個。然而目前只用了少數平面。UTF-8 、UTF-16 、UTF-32 都是將數字轉換到程序數據的編碼方案。
5.(1)HashMap和Hashtable兩個類都實現了Map接口,二者保存K-V對(key-value對) (2):HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。 (3):Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。 (4):由所有HashMap類的“collection 視圖方法”所返回的迭代器都是快速失敗的:在迭代器創建之后,如果從結構上對映射進行修改,除非通過迭代器本身的 remove 方法,其他任何時間任何方式的修改,迭代器都將拋出ConcurrentModificationException。Hashtable和HashMap的區別主要是前者是同步的,后者是快速失敗機制保證 .
6.(1).子父類存在同名成員時,子類中默認訪問子類的成員,可通過super指定訪問父類的成員,格式:super.xx? (注:xx是成員名);
(2).創建子類對象時,默認會調用父類的無參構造方法,可通過super指定調用父類其他構造方法,格式:s uper(yy) (注:yy是父類構造方法需要傳遞的參數)
7. Java中的多線程是一種搶占式的機制,而不是分時機制。搶占式的機制是有多個線程處于可運行狀態,但是只有一個線程在運行。 ?wait()和sleep() 共同點 : (1). 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,并返回。 (2). wait()和sleep()都可以通過interrupt()方法 打斷線程的暫停狀態 ,從而使線程立刻拋出InterruptedException。 如果線程A希望立即結束線程B,則可以對線程B對應的Thread實例調用interrupt方法。如果此刻線程B正在wait/sleep/join,則線程B會立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結束線程。 需要注意的是,InterruptedException是線程自己從內部拋出的,并不是interrupt()方法拋出的。對某一線程調用 interrupt()時,如果該線程正在執行普通的代碼,那么該線程根本就不會拋出InterruptedException。但是,一旦該線程進入到 wait()/sleep()/join()后,就會立刻拋出InterruptedException 。 不同點 :? (1).每個對象都有一個鎖來控制同步訪問。Synchronized關鍵字可以和對象的鎖交互,來實現線程的同步。 sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。 (2).wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用 (3).sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常? (4).sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。 (5).wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
(1).sleep()方法 在指定時間內讓當前正在執行的線程暫停執行,但不會釋放“鎖標志”。不推薦使用。 sleep()使當前線程進入阻塞狀態,在指定時間內不會執行。 (2).wait()方法 在其他線程調用對象的notify或notifyAll方法前,導致當前線程等待。線程會釋放掉它所占有的“鎖標志”,從而使別的線程有機會搶占該鎖。 當前線程必須擁有當前對象鎖。如果當前線程不是此鎖的擁有者,會拋出IllegalMonitorStateException異常。 喚醒當前對象鎖的等待線程使用notify或notifyAll方法,也必須擁有相同的對象鎖,否則也會拋出IllegalMonitorStateException異常。
waite()和notify()必須在synchronized函數或synchronized block中進行調用。如果在non-synchronized函數或non-synchronized block中進行調用,雖然能編譯通過,但在運行時會發生IllegalMonitorStateException的常。
(3).yield方法? 暫停當前正在執行的線程對象。 yield()只是使當前線程重新回到可執行狀態,所以執行yield()的線程有可能在進入到可執行狀態后馬上又被執行。 yield()只能使同優先級或更高優先級的線程有執行的機會。
(4).join方法 等待該線程終止。 等待調用join方法的線程結束,再繼續執行。如:t.join();//主要用于等待t線程運行結束,若無此句,main則會執行完畢,導致結果不可預測。
8.管道實際上是一種固定大小的緩沖區,管道對于管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬于某種文件系統,而是自立門戶,單獨構成一種文件系統,并且只存在于內存中。它類似于通信中半雙工信道的進程通信機制,一個管道可以實現雙向 的數據傳輸,而同一個時刻只能最多有一個方向的傳輸,不能兩個方向同時進行。管道的容 量大小通常為內存上的一頁,它的大小并不是受磁盤容量大小的限制。當管道滿時,進程在 寫管道會被阻塞,而當管道空時,進程讀管道會被阻塞。
9.方法的重寫(override)兩同兩小一大原則:
方法名相同,參數類型相同 ? 子類返回類型小于等于父類方法返回類型, ? 子類拋出異常小于等于父類方法拋出異常, ? 子類訪問權限大于等于父類方法訪問權限。
10. 類的加載是由類加載器完成的,類加載器包括:根加載器( BootStrap )、擴展加載器( Extension )、系統加載器( System )和用戶自定義類加載器( java.lang.ClassLoader 的子類)。從 Java 2 ( JDK 1.2 )開始,類加載過程采取了父親委托機制( PDM )。 PDM 更好的保證了 Java 平臺的安全性,在該機制中, JVM 自帶的 Bootstrap 是根加載器,其他的加載器都有且僅有一個父類加載器。類的加載首先請求父類加載器加載,父類加載器無能為力時才由其子類加載器自行加載。 JVM 不會向 Java 程序提供對 Bootstrap 的引用。下面是關于幾個類加載器的說明: ? Bootstrap :一般用本地代碼實現,負責加載 JVM 基礎核心類庫( rt.jar ); ? Extension :從 java.ext.dirs 系統屬性所指定的目錄中加載類庫,它的父加載器是 Bootstrap ; ? system class loader :又叫應用類加載器,其父類是 Extension 。它是應用最廣泛的類加載器。它從環境變量 classpath 或者系統屬性 java.class.path 所指定的目錄中記載類,是用戶自定義加載器的默認父加載器。 ? 用戶自定義類加載器: java.lang.ClassLoader 的子類 父類委托機制是可以修改的,有些服務器就是自定義類加載器優先的。
11.被final修飾的變量是常量 大小規則,從小到大 byte short? int? long?? float? double? char 引用類型轉換: ?向上轉型: ?向下轉型:
12.(1)、一個子類只能繼承一個抽象類(虛類),但能實現多個接口; ?? (2)、一個抽象類可以有構造方法,接口沒有構造方法; ?? (3)、一個抽象類中的方法不一定是抽象方法,即其中的方法可以有實現(有方法體),接口中的方法都是抽象方法,不能有方法體,只有聲明; ?? (4)、一個抽象類可以是public、private、protected、default, ?? 接口只有public; ?? (5)、一個抽象類中的方法可以是public、private、protected、default, ?? 接口中的方法只能是public和default
13.類的加載順序。
(1) 父類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法) ?(2) 子類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 ) ?(3) 父類非靜態代碼塊( 包括非靜態初始化塊,非靜態屬性 ) ?(4) 父類構造函數 (5) 子類非靜態代碼塊 ( 包括非靜態初始化塊,非靜態屬性 ) ?(6) 子類構造函數
14. 重載與重寫: ?首先,重載和重寫都是多態的一種體現方式。重載是編譯期間的活動,重寫是運行期間的活動。 ???? 其次,重載是在一個類中定義相同的名字的方法,方法的參數列表或者類型要互相不同,但是返回值類型不作為是否重載的標準,可以修改可見性; ???? 重寫是不同的,要求子類重寫基類的方法時要與父類方法具有相同的參數類型和返回值,可見性需要大于等于基類的方法
15.在java中一個unicode占2個字節(byte)。 一個字節等于8比特位(bit)。 所以每個Unicode碼占用16個比特位。
16.-Xmx10240m:代表最大堆
-Xms10240m:代表最小堆
-Xmn5120m:代表新生代
-XXSurvivorRatio=3:代表Eden:Survivor = 3??? 根據Generation-Collection算法(目前大部分JVM采用的算法),一般根據對象的生存周期將堆內存分為若干不同的區域,一般情況將新生代分為Eden ,兩塊Survivor;??? 計算Survivor大小, Eden:Survivor = 3,總大小為5120,3x+x+x=5120? x=1024
17.Servlet的生命周期 (1).加載:容器通過類加載器使用Servlet類對應的文件來加載Servlet (2).創建:通過調用Servlet的構造函數來創建一個Servlet實例 (3).初始化:通過調用Servlet的init()方法來完成初始化工作,這個方法是在Servlet已經被創建,但在向客戶端提供服務之前調用。 (4).處理客戶請求:Servlet創建后就可以處理請求,當有新的客戶端請求時,Web容器都會創建一個新的線程來處理該請求。接著調用Servlet的 Service()方法來響應客戶端請求(Service方法會根據請求的method屬性來調用doGet()和doPost()) (5).卸載:容器在卸載Servlet之前需要調用destroy()方法,讓Servlet釋放其占用的資源。
18.(1)線程安全概念: ? 如果代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。 ? 線程安全問題都是由全局變量及靜態變量引起的。 ? 若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則的話就可能影響線程安全。
LinkedList 和 ArrayList 都是不同步的,線程不安全; ? Vector 和 Stack 都是同步的,線程安全; ? Set是線程不安全的;
Hashtable的方法是同步的,線程安全; ? HashMap的方法不是同步的,線程不安全;
(2)Vector & ArrayList 的主要區別 ????? 1) 同步性:Vector是線程安全的,也就是說是同步的 ,而ArrayList 是線程序不安全的,不是同步的 數2。 ????? 2)數據增長:當需要增長時,Vector默認增長為原來一倍 ,而ArrayList卻是原來的50%? ,這樣,ArrayList就有利于節約內存空間。? ????? 如果涉及到堆棧,隊列等操作,應該考慮用Vector,如果需要快速隨機訪問元素,應該使用ArrayList 。
(3)擴展知識: ?1). Hashtable & HashMap ??? Hashtable和HashMap它們的性能方面的比較類似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。 ? ?2). ArrayList & LinkedList ?? ArrayList的內部實現是基于內部數組Object[],所以從概念上講,它更象數組,但LinkedList的內部實現是基于一組連接的記錄,所以,它更象一個鏈表結構,所以,它們在性能上有很大的差別:?? ??????? 從上面的分析可知,在ArrayList的前面或中間插入數據時,你必須將其后的所有數據相應的后移,這樣必然要花費較多時間,所以,當你的操作是在一列數據的后面添加數據而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能; 而訪問鏈表中的某個元素時,就必須從鏈表的一端開始沿著連接方向一個一個元素地去查找,直到找到所需的元素為止,所以,當你的操作是在一列數據的前面或中間添加或刪除數據,并且按照順序訪問其中的元素時,就應該使用LinkedList了。
19.(1). 并發:在 操作系統? 中,是指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個 處理機? 上運行。其中兩種并發關系分別是同步和互斥 ?(2). 互斥:進程間相互排斥的使用臨界資源的現象,就叫互斥。 ?(3). 同步: 進程之間的關系不是相互排斥臨界資源的關系,而是相互依賴的關系。進一步的說明:就是前一個進程的輸出作為后一個進程的輸入,當第一個進程沒有輸出時第二個進程必須等待。具有同步關系的一組并發進程相互發送的信息稱為消息或事件。 ?其中并發又有偽并發和真并發,偽并發是指單核處理器的并發,真并發是指多核處理器的并發。 (4). 并行:在單處理器中多道程序設計系統中,進程被交替執行,表現出一種并發的外部特種;在多處理器系統中,進程不僅可以交替執行,而且可以重疊執行。在多處理器上的程序才可實現并行處理。從而可知,并行是針對多處理器而言的。并行是同時發生的多個并發事件,具有并發的含義,但并發不一定并行,也亦是說并發事件之間不一定要同一時刻發生。 (5). 多線程:多線程是程序設計的邏輯層概念,它是進程中并發運行的一段代碼。多線程可以實現線程間的切換執行。 (6). 異步:異步和同步是相對的,同步就是順序執行,執行完一個再執行下一個,需要等待、協調運行。異步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成后再工作。線程就是實現異步的一個方式。異步是讓調用方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程干其它的事情。 ?? 異步和多線程并不是一個同等關系,異步是最終目的,多線程只是我們實現異步的一種手段。異步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回而可以做其它的事情。實現異步可以采用多線程技術或則交給另外的進程來處理。
20. Math.ceil(d1) ?ceil :如果參數小于0且大于-1.0,結果為 -0
Math.floor(d1) ?floor? :如果是 -0.0,那么其結果是 -0.0 ;
21.異常:(簡答題 (必考)// 程序運行題 finally 一定執行) ?? throwable: ?? ???erro:不管 ?? ???exception: ?? ??????runtimexception:運行時異常,不建議使用異常處理機制來處理。 ?? ??????otherexception:檢查性異常,必須使用異常處理機制來處理。 ?? ???try:捕獲異常 ?? ???catch:(異常類型 e) :處理異常,catch可以有多個,要求子類異常在上,父類異常在下 ?? ???finally:一定會執行 ?? ???throws:拋出異常方案,在方法體外使用 ?? ???throw:拋異常,主動拋出希望處理的異常,方法體內使用 異常分為運行時異常,非運行時異常和error,其中error是系統異常,只能重啟系統解決。非運行時異常需要我們自己補獲,而運行異常是程序運行時由虛擬機幫助我們補獲,運行時異常包括數組的溢出,內存的溢出空指針,分母為0等。
22. java.io.Serializable接口是一個標志性接口,在接口內部沒有定義任何屬性與方法。只是用于標志此接口的實現類可以被序列化與反序列化。
java.lang.Cloneable接口是一個標志性接口,在接口內部沒有定義任何屬性與方法。以指示Object.clone()方法可以合法地對該類實例進行按字段復制。
java.lang.CharSequence接口對許多不同種類的char序列提供統一的只讀訪問接口。CharSequence是char值的一個可讀序列。
java.lang.Comparable接口,此接口強制對實現它的每個類的對象進行整體排序,此序列被稱為該類的自然排序
23.Java 重載的規則: (1)、必須具有不同的參數列表; (2)、可以有不同的返回類型,只要參數列表不同就可以; (3)、可以有不同的訪問修飾符; (4)、可以拋出不同的異常; (5)、方法能夠在一個類中或者在一個子類中被重載。
方法的重寫:? (1)、在子類中可以根據需要對從基類中繼承來的方法進行重寫。 (2)、重寫的方法和被重寫的方法必須具有相同方法名稱、參數列表和返回類型。 (3)、重寫方法不能使用比被重寫的方法更嚴格的訪問權限。
24. A、Semaphore:類,控制某個資源可被同時訪問的個數; B、ReentrantLock:類,具有與使用synchronized方法和語句所訪問的隱式監視器鎖相同的一些基本行為和語義,但功能更強大; C、 Future:接口,表示異步計算的結果; D、 CountDownLatch: 類,可以用來在一個線程中等待多個線程完成任務的類。
25. ?jar???????? 將許多文件組合成一個jar文件 javac??? 編譯 javadoc 它從程序源代碼中抽取類、方法、成員等注釋形成一個和源代碼配套的API幫助文檔。 javah 把java代碼聲明的JNI方法轉化成C\C++頭文件。
26. (1).從地址欄顯示來說 ?forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器. 瀏覽器根本不知道服務器發送的內容從哪里來的,所以它的地址欄還是原來的地址. ?redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.
(2).從數據共享來說 ?forward:轉發頁面和轉發到的頁面可以共享request里面的數據. ?redirect:不能共享數據.
(3).從運用地方來說 ?forward:一般用于用戶登陸的時候,根據角色轉發到相應的模塊. ?redirect:一般用于用戶注銷登陸時返回主頁面和跳轉到其它的網站等.
(4).從效率來說 ?forward:高. ?redirect:低.
27.集合圖 1. List 是一個有序集合,可以存放重復的數據 (有序:存進是什么順序,取出時還是什么順序) ??????????????? (1).ArrayList 底層是數組適合查詢,不適合增刪元素。 ??????????????? (2).LiskedList 底層是雙向鏈表適合增刪元素,不適合查詢操作。 ??????????????? (3).Vector 底層和ArrayList相同,但是Vector是線程安全的,效率較低很少使用 ?? 2. Set 是一個無序集合,不允許放重復的數據 (無序可重復,存進和取出的順序不一樣) ??????????????? (1).HashSet 底層是哈希表/散列表 ??????????????? (2).TreeSet 繼承sartedSet接口(無需不可重復,但存進去的元素可以按照元素的大小自動排序) ?? 3. Map 是一個無序集合,以鍵值對的方式存放數據,鍵對象不允許重復,值對象可以重復。 ??????????????? (1).HashMap實現不同步,線程不安全。? HashTable線程安全 ??????????????? (2).HashMap中的key-value都是存儲在Entry中的。 ??????????????? (3).HashMap可以存null鍵和null值,不保證元素的順序恒久不變,它的底層使用的是數組和鏈表,通過hashCode()方法和equals方法保證鍵的唯一性
28.取值范圍和包裝類? Java中的四類八種基本數據類型 第一類:整數類型? byte short int long 第二類:浮點型? float double 第三類:邏輯型??? boolean(它只有兩個值可取true false) 第四類:字符型? char
29. final final關鍵字
1.final修飾變量,則等同于常量 2.final修飾方法中的參數,稱為最終參數。 3.final修飾類,則類不能被繼承 4.final修飾方法,則方法不能被重寫
30.標識符: ??? 1. 數字,字母,符號(只有_和$兩種),數字不能開頭。 ??? 2. 不能是關鍵字(有兩個保留關鍵字,goto,const,關鍵字都是小寫的)或者顯式常量(null,true,false)。
31.抽象類 特點:? (1).抽象類中可以構造方法? (2).抽象類中可以存在普通屬性,方法,靜態屬性和方法。? (3).抽象類中可以存在抽象方法。? (4).如果一個類中有一個抽象方法,那么當前類一定是抽象類;抽象類中不一定有抽象方法。? (5).抽象類中的抽象方法,需要有子類實現,如果子類不實現,則子類也需要定義為抽象的。? (6),抽象類不能被實例化,抽象類和抽象方法必須被abstract修飾
關鍵字使用注意:? 抽象類中的抽象方法(其前有abstract修飾)不能用private、static、synchronized、native訪問修飾符修飾。
接口 (1).在接口中只有方法的聲明,沒有方法體。? (2).在接口中只有常量,因為定義的變量,在編譯的時候都會默認加上public static final? (3).在接口中的方法,永遠都被public來修飾。? (4).接口中沒有構造方法,也不能實例化接口的對象。(所以接口不能繼承類)? (5).接口可以實現多繼承? (6).接口中定義的方法都需要有實現類來實現,如果實現類不能實現接口中的所有方法則實現類定義為抽象類。? (7).接口可以繼承接口,用extends
兩者的語法區別:
(1).抽象類可以有構造方法,接口中不能有構造方法。 (2).抽象類中可以有普通成員變量,接口中沒有普通成員變量 (3).抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。 (4).抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。 (5).抽象類中可以包含靜態方法,接口中不能包含靜態方法 (6).抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。 (7).一個類可以實現多個接口,但只能繼承一個抽象類。
兩者在應用上的區別: 接口更多的是在系統架構設計方法發揮作用,主要用于定義模塊之間的通信契約。而抽象類在代碼實現方面發揮作用,可以實現代碼的重用,
32.靜態 JAVA的初始化順序: 父類的靜態成員初始化>父類的靜態代碼塊>子類的靜態成員初始化>子類的靜態代碼塊>父類的代碼塊>父類的構造方法>子類的代碼塊>子類的構造方法 注意: 1.靜態成員和靜態代碼塊只有在類加載的時候執行一次,再次創建實例時,不再執行,因為只在方法區存在一份,屬于一整個類。 2.上述的是通用的加載順序,如果沒有則省略
33. Lanbda表達式的主要作用就是代替匿名內部類的繁瑣語法, 它由三部分組成: (1) 形參列表。形參列表允許省略形參類型。如果形參列表中只有一個參數,甚至連形參列表的圓括號也可以省略。 (2) 箭頭(→)。必須通過英文中畫線和大于符號組成。 (3)代碼塊。如果代碼塊只包含一條語句,Lambda表達式允許省略代碼塊的花括號,那么那條語句就不要用花括號表示語句結束。 ?? Lambda代碼塊只有一條return語句,甚至可以省略return關鍵字。 ?? Lambda表達式需要返回值,而它的代碼塊中僅有一套省略了return的語句。 ?? Lambda表達式會自動返回這條語句的值。
34. (1).靜態語句塊中x為局部變量,不影響靜態變量x的值 (2).和y為靜態變量,默認初始值為0,屬于當前類,其值得改變會影響整個類運行。 (3).中自增操作非原子性的 main方法中: 執行x--后 x=-1 調用myMethod方法,x執行x++結果為-1(后++),但x=0,++x結果1,x=1 ,則y=0 x+y+ ++x,先執行x+y,結果為1,執行++x結果為2,得到最終結果為3
35. 時間復雜度 、時間復雜度
(1)時間頻度
一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個算法都上機測試,只需知道哪個算法花費的時間多,哪個算法花費的時間少就可以了。并且一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
(2)時間復雜度
在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什么規律。為此,我們引入時間復雜度概念。
一般情況下,算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間復雜度,簡稱時間復雜度。
在各種不同算法中,若算法中語句執行次數為一個常數,則時間復雜度為O(1),另外,在時間頻度不相同時,時間復雜度有可能相同,如T(n)=n2+3n+4與T(n)=4n2+2n+1它們的頻度不同,但時間復雜度相同,都為O(n2)。
按數量級遞增排列,常見的時間復雜度有:
常數階O(1),對數階O(log2n),線性階O(n),
線性對數階O(nlog2n),平方階O(n2),立方階O(n3),...,
k次方階O(nk),指數階O(2n)。隨著問題規模n的不斷增大,上述時間復雜度不斷增大,算法的執行效率越低。
2、空間復雜度
與時間復雜度類似,空間復雜度是指算法在計算機內執行時所需存儲空間的度量。記作:
S(n)=O(f(n))
我們一般所討論的是除正常占用內存開銷外的輔助存儲單元規模 ? ? ?? 二、常見算法時間復雜度: O(1): 表示算法的運行時間為常量 O(n): 表示該算法是線性算法 O(㏒2n): 二分查找算法 O(n2): 對數組進行排序的各種簡單算法,例如直接插入排序的算法。 O(n3): 做兩個n階矩陣的乘法運算 O(2n): 求具有n個元素集合的所有子集的算法 O(n!): 求具有N個元素的全排列的算法 優
36.訪問控制權限 1)對于public修飾符,它具有最大的訪問權限,可以訪問任何一個在CLASSPATH下的類、接口、異常等。它往往用于對外的情況,也就是對象或類對外的一種接口的形式。 (2)對于protected修飾符,它主要的作用就是用來保護子類的。它的含義在于子類可以用它修飾的成員,其他的不可以,它相當于傳遞給子類的一種繼承的東西。 (3)對于default來說,有點的時候也成為friendly(友員),它是針對本包訪問而設計的,任何處于本包下的類、接口、異常等,都可以相互訪問,即使是父類沒有用protected修飾的成員也可以。 (4)對于private來說,它的訪問權限僅限于類的內部,是一種封裝的體現,例如,大多數的成員變量都是修飾符為private的,它們不希望被其他任何外部的類訪問。
37.運行時數據區包括:虛擬機棧區,堆區,方法區,本地方法棧,程序計數器 虛擬機棧區 :也就是我們常說的棧區,線程私有,存放基本類型,對象的引用和 returnAddress ,在編譯期間完成分配。 堆區 , JAVA 堆,也稱 GC 堆,所有線程共享,存放對象的實例和數組, JAVA 堆是垃圾收集器管理的主要區域。 方法區 :所有線程共享,存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。這個區域的內存回收目標主要是針對常量池的對象的回收和對類型的卸載。 程序計數器 :線程私有,每個線程都有自己獨立的程序計數器,用來指示下一條指令的地址。
38.線程安全的問題全都是由全局變量以及靜態變量引起的,非靜態自然不會存在線程安全問題。
39.類中變量:除了private權限外,其他權限的變量(沒有表示默認default),均可以用“對象.變量名”來調用。對于private變量,即使使用static,也不能用“類.變量名”來調用私有變量。只能通過類中的public get()方法來調用。 ? 類中方法:除了private權限外,其他權限的方法(沒有表示默認default),均可以用“對象.方法名”來調用。private方法可以用java反射機制調用。當然如果用 private修飾方法,該方法只在類的內部調用。其中比較著名的就是單例模式中的私有構造方法。 ? static屬性:static方法在編譯期就已經生成了,其他方法在運行期生成。非私有的static方法可以用“類.方法名”調用。但是私有的static變量和方法都是不可能被調用的,雖然private static這種寫法很少見,但仍然存在,且編譯器不會報錯。題中static? void? method2()? {?? }的權限是默認權限,所以可以用“類.方法名”來調用。
40.排序 (1)冒泡 ????? ?public static void bubbleSort(int[] a) { ?????for (int i = 1; i < a.length; i++) { ???????????? for (int j = 0; j < a.length - i ; j++) { ????????? if (a[j] > a[j + 1]) { ???????????????? int t = a[j]; ???????????????? a[j] = a[j + 1]; ???????????????? a[j + 1] = t; ????????? } ?????????????? } ?????} ????}
(2)選擇: ????? ?int[] arr = {10,3,4,2,999,123,456,768,34,9}; ????int index ; ????for(int j = 0;j<10;j++) { ?????index = 0;??? ?????for(int i = 1;i<=arr.length-1-j;i++ ) { ??????if(arr[index]<=arr[i]) { ???????index = i; ??????} ?????} ??//???System.out.println(index); ?????int temp = 0; ?????temp = arr[index]; ?????arr[index] = arr[arr.length-1-j]; ?????arr[arr.length-1-j] = temp;? ????} ????for (int i : arr) { ?????System.out.print(i+","); ????} https://www.cnblogs.com/guoyaohua/p/8600214.html 具體參考
41:(1),Java 關鍵字列表 (依字母排序 共50組): abstract, assert, boolean, break, byte, case, catch, char, class, const(保留關鍵字), continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留關鍵字), if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while
(2),保留字列表 (依字母排序 共14組),Java保留字是指現有Java版本尚未使用,但以后版本可能會作為關鍵字使用: byValue, cast, false, future, generic, inner, operator, outer, rest, true, var, goto (保留關鍵字) , const (保留關鍵字) , null
42:String,StringBuild和StringBuffer StringBuffer類的對象調用toString()方法將轉換為String類型 ?這個正確 兩個類都有append()方法 ?String類沒有append方法
可以直接將字符串“test”復制給聲明的Stirng類和StringBuffer類的變量 ?引用類型只有String可以直接復制,其他的都要new出來
兩個類的實例的值都能夠被改變 ??StringBuffer類可以直接改變它的內容,不用重新分配地址; String?對象/ 實例 ? 是不可以被改變的。
String: 是對象不是原始類型. 為不可變對象,一旦被創建,就不能修改它的值. 對于已經存在的String對象的修改都是重新創建一個新的對象,然后把新的值保存進去. String 是final類,即不能被繼承.
StringBuffer: 是一個可變對象,當對他進行修改的時候不會像String那樣重新建立對象 它只能通過構造函數來建立, StringBuffer sb = new StringBuffer(); !!!:不能通過賦值符號對他進行付值.? sb = "welcome to here!";//error 對象被建立以后,在內存中就會分配內存空間,并初始保存一個null.向StringBuffer 中賦值的時候可以通過它的append方法. sb.append("hello");
字符串連接操作中StringBuffer的效率要比String高: String str = new String("welcome to "); str += "here"; 的處理步驟實際上是通過建立一個StringBuffer,然后調用append(),最后 再將StringBuffer toSting()(toString方法:StringBuffer類型轉化成String類型);
43: JAVA的JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method)
(1)棧區: 每個線程包含一個棧區,棧中只保存方法中(不包括對象的成員變量)的基礎數據類型和自定義對象的引用(不是對象),對象都存放在堆區中。 每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。 棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。
(2)堆區: 存儲的全部是對象實例,每個對象都包含一個與之對應的class的信息(class信息存放在方法區)。 jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身,幾乎所有的對象實例和數組都在堆中分配。
(3)方法區: 又叫靜態區,跟堆一樣,被所有的線程共享。它用于存儲已經被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。
44:Math類中提供了三個與取整有關的方法:ceil,floor,round,這些方法的作用于它們的英文名稱的含義相對應,例如: ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結果為12,Math.ceil(-11.6)的結果為-11;floor的英文是地板,該方法就表示向下取整,Math.floor(11.6)的結果是11,Math.floor(-11.4)的結果-12; 最難掌握的是round方法,他表示“四舍五入”,算法為Math.floor(x+0.5),即將原來的數字加上0.5后再向下取整,所以,Math.round(11.5)的結果是12,Math.round(-11.5)的結果為-11.
45:
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的java考题_Java考题知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pd 生成mysql语句_PDMan +
- 下一篇: java加法器_javacc例子:加法器