java試題

一、簡答題

1、語言的執行方式簡單說?

答:語言根據執行方式的不同分類:第一是編譯執行,如C,它把源程序由特定平臺的編譯器一次性編譯爲平臺相關的機器碼,它的優點是執行速度快,缺點是無法跨平臺;第二是解釋執行,如HTML,JavaScript,它使用特定的解釋器,把代碼一行行解釋爲機器碼,類似於同聲翻譯,它的優點是可以跨平臺,缺點是執行速度慢,暴露源程序;第三種是從Java開始引入的“中間碼+虛擬機”的方式,它既整合了編譯語言與解釋語言的優點,同時如虛擬機又可以解決如垃圾回收,安全性檢查等這些傳統語言頭疼的問題,所以其後微軟的.NET平臺也使用的這種方式。

jdk(.class)->jre->jvm(跨平臺)->java解釋器

2、什麼是Java虛擬機?爲什麼Java被稱作是“平臺無關的編程語言”?

答:JVM 的主要工作是解釋自己的指令集(即字節碼)並映射到本地的 CPU 的指令集或 OS 的系統調用。Java語言是跨平臺運行的,其實就是不同的操作系統,使用不同的JVM映射規則,讓其與操作系統無關,完成了跨平臺性。JVM 對上層的 Java 源文件是不關心的,它關注的只是由源文件生成的類文件( class file )。類文件的組成包括 JVM 指令集,符號表以及一些輔助信息。

    java所謂的跨平臺就是在不同平臺上安裝了不同的jvm,而在不同平臺上生成的.class文件都是一樣的,而.class文件再由對應平臺的jvm解釋成對應平臺的機器碼執行。

3、JDK和JRE的區別是什麼?

答:

Java運行時環境(JRE)。它包括Java虛擬機、Java核心類庫和支持文件。它不包含開發工具(JDK)--編譯器、調試器和其他工具。
Java開發工具包(JDK)是完整的Java軟件開發包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java調試器),可以讓開發者開發、編譯、執行Java應用程序。
4、”static”關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者是static的方法?
答:“static”關鍵字表明一個成員變量或者成員方法可以在沒有所屬類的實例變量的情況下被訪問。
static修飾的方法是基於編譯時靜態綁定的,而方法覆蓋是爲了實現多態,是運行時動態綁定static方法跟類的任何實例都不相關,所以static修飾的方法不需要被覆蓋。
java中也不可以覆蓋private的方法,因爲private修飾的變量和方法只能在當前類中使用,如果是其他的類繼承當前類是不能訪問到private變量或方法的
5、是否可以在static環境中訪問非static變量?

答:不可以。因爲靜態的成員屬於類,隨着類的加載而加載到靜態方法區內存,當類加載時,此時不一定有實例創建,沒有實例,就不可以訪問非靜態的成員。類的加載先於實例的加載,因此靜態環境中,不可以訪問非靜態。
6、Java支持的數據類型有哪些?什麼是自動拆裝箱?
答:八種基本數據類型:byte,short,int,long,float,double,boolean,char.
      自動裝箱是java編譯器在基本數據類型和對應包裝類型的轉化。int->integer
      自動拆箱:integer->int;
      string是引用類型不是基本類型,引用變量是指該變量在棧內存中實際存儲的是一個引用地址,實際值在堆中。string類還是final修飾的。
      爲什麼要有基本數據類型到引用類型之間的轉換?
      引用類型可以new對象,調用包裝類中封裝好的方法,還有就是如果集合中想存放基本類型,泛型的限定類型只能是對應的包裝類型。
7、Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什麼意思?
答:覆蓋是類與類之間實現多態,並且類之間是繼承關係;子類重新定義了父類中的方法,必須有相同的方法名,參數列表和返回類型。
       重寫是類中實現多態,同一個類裏兩個或者多個方法的方法名相同但是參數不同的情況。
8、Java中,什麼是構造函數?什麼是構造函數重載?什麼是複製構造函數?
答:當新對象被創建的時候,構造函數會被調用。每一個類都有構造函數。在程序員沒有給類提供構造函數的情況下,Java編譯器會爲這個類創建一個默認的構造函數。
Java中構造函數重載和方法重載很相似。可以爲一個類創建多個構造函數。每一個構造函數必須有它自己唯一的參數列表。
Java不支持像C++中那樣的複製構造函數,這個不同點是因爲如果你不自己寫構造函數的情況下,Java不會創建默認的複製構造函數。
9、接口和抽象類的區別是什麼?
答:Java提供和支持創建抽象類和接口。從設計層面來說,抽象是對類的抽象,是一種模板設計,接口是行爲的抽象,是一種行爲的規範。
 它們的實現有共同點,不同點在於:

   1、接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
   2、類可以實現很多個接口,但是隻能繼承一個抽象類

   3、類可以不實現抽象類和接口聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
   4、抽象類可以在不提供接口方法實現的情況下實現接口。

   5、Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
   6、Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。

   7、接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的。
也可以參考JDK8中抽象類和接口的區別
10、什麼是值傳遞和引用傳遞?
答:對於函數參數中的基本數據類型:傳入的是變量的真正值,在函數內部改變參數的值是不會改變傳入變量的值;
       對於函數參數中的引用數據類型:在java中傳入的是變量的地址值副本,實際上在棧內存中就同時有兩個引用指向了堆內存中的某個對象。
       如:public void add(int a) { int b = a; } 這個可以看作是值傳遞,a是基本數據類型,他把他的值傳給了b public void add(Object obj) { Object objTest = obj; } 這個可以看作是址傳遞,obj是引用數據類型,是把他棧中指向堆中的對象的地址值賦值給了objTest. 這時候就同時有兩個引用指向了堆中的某個Object對象 其實這樣看來,java應該只有值傳遞的。如果是基本數據類型,傳遞的就是實際的值. 如果是引用數據類型,傳遞的就是該引用的地址值.
     詳細講解:http://guhanjie.iteye.com/blog/1683637
11、進程和線程的區別是什麼?
答:1、進程是執行着的應用程序,而線程是進程內部的一個執行序列。
       2、一個進程可以有多個線程。線程又叫做輕量級進程。
       3、線程的劃分小於進程,線程隸屬於某個進程。
       4、 進程是資源分配的基本單位,線程是調度的基本單位。進程是程序的一種動態形式,是CPU、內存等資源佔用的基本單位,而線程是不能佔有這些資源的。
       5、 進程之間相互獨立,通信比較困難,而線程之間共享一塊內存區域,通信比較方便。
       6、 進程在執行的過程中,包含比較固定的入口,執行順序,出口,而線程的這些過程會被應用程序所控制
12、創建線程有幾種不同的方式?你喜歡哪一種?爲什麼?
答:

①繼承Thread類(真正意義上的線程類),是Runnable接口的實現。

②實現Runnable接口,並重寫裏面的run方法。

③使用Executor框架創建線程池。Executor框架是juc裏提供的線程池的實現。

4、還有一種方式是實現Callable接口

調用線程的start():啓動此線程;調用相應的run()方法

繼承於Thread類的線程類,可以直接調用start方法啓動線程(使用static也可以實現資源共享).一個線程(對象)只能夠執行一次start(),而且不能通過Thread實現類對象的run()去啓動一個線程。

實現Runnable接口的類需要再次用Thread類包裝後才能調用start方法。(三個Thread對象包裝一個類對象,就實現了資源共享)。

線程的使用的話,注意鎖和同步的使用。(多線程訪問共享資源容易出現線程安全問題)

一般情況下,常見的是第二種。

* Runnable接口有如下好處:

*①避免點繼承的侷限,一個類可以繼承多個接口。

*②適合於資源的共享

13、概括的解釋下線程的幾種可用狀態?
答:
1. 新建( new ):新創建了一個線程對象。
2. 可運行( runnable ):線程對象創建後,其他線程(比如 main 線程)調用了該對象 的 start ()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲 取 cpu 的使用權 
3. 運行( running ):可運行狀態( runnable )的線程獲得了 cpu 時間片( timeslice  ,執行程序代碼。
4. 阻塞( block ):阻塞狀態是指線程因爲某種原因放棄了 cpu 使用權,也即讓出了 cpu timeslice ,暫時停止運行。直到線程進入可運行( runnable )狀態,纔有 機會再次獲得 cpu timeslice 轉到運行( running )狀態。阻塞的情況分三種:
(一). 等待阻塞:運行( running )的線程執行 o . wait ()方法, JVM 會把該線程放 入等待隊列( waitting queue )中。
(二). 同步阻塞:運行( running )的線程在獲取對象的同步鎖時,若該同步鎖 被別的線程佔用,則 JVM 會把該線程放入鎖池( lock pool )中。
(三). 其他阻塞: 運行( running )的線程執行 Thread . sleep ( long ms )或 t . join ()方法,或者發出了 I / O 請求時, JVM 會把該線程置爲阻塞狀態。           
        當 sleep ()狀態超時、 join ()等待線程終止或者超時、或者 I / O 處理完畢時,線程重新轉入可運行( runnable )狀態。
5. 死亡( dead ):線程 run ()、 main () 方法執行結束,或者因異常退出了 run ()方法,則該線程結束生命週期。死亡的線程不可再次復生。

14、同步方法和同步代碼塊的區別是什麼?
答:1、同步鎖不同:
            同步方法默認用this或者當前類class對象作爲鎖;
            同步代碼塊可以選擇以什麼來加鎖,比同步方法要更細顆粒度,我們可以選擇只同步會發生同步問題的部分代碼而不是整個方法;
        2、同步的範圍不同:
       同步方法使用關鍵字
 synchronized修飾方法,而同步代碼塊主要是修飾需要進行同步的代碼,用   synchronized(object){代碼內容}進行修飾;
15、在監視器(Monitor)內部,是如何做線程同步的?程序應該做哪種級別的同步?
答:在 java 虛擬機中, 每個對象( Object 和 class )通過某種邏輯關聯監視器,每個監視器和一個對象引用相關聯, 爲了實現監視器的互斥功能, 每個對象都關聯着一把鎖 .   一旦方法或者代碼塊被 synchronized 修飾, 那麼這個部分就放入了監視器的監視區域, 確保一次只能有一個線程執行該部分的代碼 , 線程在獲取鎖之前不允許執行該部分的代碼   另外 java 還提供了顯式監視器( Lock )和隱式監視器( synchronized )兩種鎖方案
16、什麼是死鎖(deadlock)?
答:
所謂死鎖是指多個進程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。死鎖產生的4個必要條件:
  •     互斥條件:進程要求對所分配的資源(如打印機)進行排他性控制,即在一段時間內某 資源僅爲一個進程所佔有。此時若有其他進程請求該資源,則請求進程只能等待。
  •     不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能 由獲得該資源的進程自己來釋放(只能是主動釋放)。
  •     請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程佔有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
  •     循環等待條件:存在一種進程資源的循環等待鏈,鏈中每一個進程已獲得的資源同時被 鏈中下一個進程所請求。
  • 這四個條件缺一不可,只要破壞了其中一個條件就可以破壞死鎖,其中最簡單的方法就是線程都是以同樣的順序加鎖和釋放鎖,也就是破壞了第四個條件。
  • 17、爲什麼集合類沒有實現Cloneable和Serializable接口?
  • 答:克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。
  • 18、什麼是迭代器(Iterator)?
  • 答:Iterator接口提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代器實例的迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素,但是不可以直接調用集合的remove(Object Obj)刪除,可以通過迭代器的remove()方法刪除。
  • 注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
    1.使用next()獲得序列中的下一個元素。
    2. 使用hasNext()檢查序列中是否還有元素。
    3. 使用remove()將迭代器新返回的元素刪除。
  • 19、Iterator和ListIterator的區別是什麼?
  • 答:1、Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
           2、Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向。
           3、ListIterator實現了Iterator接口,幷包含其他的功能,比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等等。
    20、數組(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?
  • 答:

    ArrayList可以算是Array的加強版,(對array有所取捨的加強)。

    存儲內容比較: 

    Array數組可以包含基本類型和對象類型,

    ArrayList卻只能包含對象類型。

    但是需要注意的是:Array數組在存放的時候一定是同種類型的元素。ArrayList就不一定了,因爲ArrayList可以存儲Object。

    空間大小比較: 

    它的空間大小是固定的,空間不夠時也不能再次申請,所以需要事前確定合適的空間大小。

    ArrayList的空間是動態增長的,如果空間不夠,它會創建一個空間比原空間大一倍的新數組,然後將所有元素複製到新數組中,接着拋棄舊數組。而且,每次添加新的元素的時候都會檢查內部數組的空間是否足夠。(比較麻煩的地方)。arraylist的大小是自動變化的,如果在初始化的時候沒有定義它的默認容量大小,那麼默認是10,之後的增長規則是:((舊容量* 3) / 2) + 1

    方法上的比較: 
    ArrayList作爲Array的增強版,當然是在方法上比Array更多樣化,比如添加全部addAll()、刪除全部removeAll()、返回迭代器iterator()等。

    適用場景: 
    如果想要保存一些在整個程序運行期間都會存在而且不變的數據,我們可以將它們放進一個全局數組Array裏,但是如果我們單純只是想要以數組的形式保存數據,而不對數據進行增加等操作,只是方便我們進行查找的話,那麼,我們就選擇ArrayList。而且還有一個地方是必須知道的,就是如果我們需要對元素進行頻繁的移動或刪除,或者是處理的是超大量的數據,那麼,使用ArrayList就真的不是一個好的選擇,因爲它的效率很低,使用數組進行這樣的動作就很麻煩,那麼,我們可以考慮選擇LinkedList

  • 21Comparable和Comparator接口是幹什麼的?列出它們的區別。

  • 答:Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明已經存在的對象小於,等於,大於輸入對象。
    Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入參數排序,返回負數,0,正數表明第一個參數是小於,等於,大於第二個參數。equals()方法需要一個對象作爲參數,它用來決定輸入參數是否和comparator相等。只有當輸入參數也是一個comparator並且輸入參數和當前comparator的排序結果是相同的時候,這個方法才返回true。
  •  22,

    創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

    結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

    行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

  • 23,如何權衡是使用無序的數組還是有序的數組?
  • 有序數組最大的好處在於查找的時間複雜度是O(log n),而無序數組是O(n)。
  • 有序數組的缺點是插入操作的時間複雜度是O(n),因爲值大的元素需要往後移動來給新元素騰位置。相反,無序數組的插入時間複雜度是常量O(1)。
  • 24,Enumeration接口和Iterator接口的區別有哪些?
  • public interface Enumeration<E> {
        boolean hasMoreElements();
        E nextElement();
    }
    public interface Iterator<E> {
        boolean hasNext();
        E next();
        void remove();
    }

    (1) 函數接口不同
    Enumeration 只有2個函數接口。通過Enumeration,我們只能讀取集合的數據,而不能對數據進行修改。
    Iterator 3個函數接口。 Iterator除了能讀取集合的數據之外,也能數據進行刪除操作。

    (2) Iterator 支持 fail-fast 機制,而 Enumeration 不支持
    Enumeration JDK 1.0添加的接口。使用到它的函數包括VectorHashtable等類,這些類都是JDK 1.0中加入的,Enumeration存在的目的就是爲它們提供遍歷接口。Enumeration本身並沒有支持同步,而在VectorHashtable實現Enumeration時,添加了同步。

  • Iterator JDK 1.2才添加的接口,它也是爲了HashMapArrayList等集合提供遍歷接口Iterator是支持fail-fast機制的:當多個線程對同一個集合的內容進行操作時,就可能會產生fail-fast事件。

    • 當你的當前線程使用某個集合對象的迭代器訪問集合內容的時候,
      其他線程在你還沒訪問完事就已經更改了集合裏面的內容。
      本來你訪問集合內容很迅速就能完事(可能幾毫秒的事情),居然還有人(線程)比你(當前線程)還快。
      這就叫快速失敗

  • 25,javac.exe是編譯.java文件
          java.exe是執行編譯好的.class文件
          javadoc.exe是生成Java說明文檔
          jdb.exe是Java調試器
          javaprof.exe是剖析工具
    26,throw與throws的區別:
  • 區別一:throw 是語句拋出一個異常;throws 是方法拋出一個異常;
        throw語法:throw <異常對象>
       在方法聲明中,添加throws子句表示該方法將拋出異常。
       throws語法:[<修飾符>]<返回值類型><方法名>([<參數列表>])[throws<異常類>]
        其中:異常類可以聲明多個,用逗號分割。

  • 區別二:throw要麼和try-catch-finally語句配套使用,要麼與throws配套使用。但throws可以單獨使 用,然後再由處理異常的方法捕獲。throws E1,E2,E3 只是告訴程序這個方法可能會拋出這些個異常,方法的調用者可能要處理這些異常。而這些異常E1,E2,E3可能是該函數體產生的。而throw是明確之處這個地方要拋出這個異常。

  • 區別三:throw語句用在方法體內,表示拋出異常,由方法體內的語句處理 
    throws語句用在方法聲明後面,表示再拋出異常,由調用這個方法的上一級方法中的語句來處理
  • throws主要是聲明這個方法會拋出這種類型的異常,使其他地方調用它時知道要捕獲這個異常。
    throw是具體向外拋異常的動作,所以它是拋出一個異常實例。
  • 1)throws出現在方法函數頭;而throw出現在函數體; 
    2)throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是拋出了異常,執行throw則一定拋出了某種異常; 
    3)兩者都是消極處理異常的方式(這裏的消極並不是說這種方式不好),只是拋出或者可能拋出異常,但是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。


  • collectioncollections的區別

    Collection:

    是集合類的上層接口。本身是一個Interface,裏面包含了一些集合的基本操作Collection接口時Set接口和List接口的父接口Collection接口的意義是爲各種具體的集合提供了最大化的統一操作方式。

    Collections

    是一個集合框架的幫助類,裏面包含一些對集合的排序,搜索以及序列化的操作。最根本的是Collections是一個類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架

    Collections.sort(list);//list集合進行排序

    二、collection集合

        |--list  特點:有序,能重複

            |--arraylist 查詢快,增刪慢 底層數據是數組數據結構

            |--linklist 增刪快,查詢慢  底層數據是鏈表數據結構

  •   |--

      java.util.Vector也實現了List接口,其描述的也是可變長度的對象數組。

      Vector類以類似數組的方式順序地存儲數據,但是具有比數組更強大的功能;它是允許不同類型元素共存的變長數組。    

        |--set 特點:無序,不可重複

            |--hashset 底層數據是哈希表  無序

            |--treeset 底層數據是二叉樹 可以對set集合中的元素進行排序

    其中對於arraylisthashset來說,他們的查詢方式不同

        arraylist是依據equals來查詢

        hashset是先依據hashcode進行比較,若相同在進行equals比較來查詢

    因此在使用時一般都要複寫hashcode()方法和equals()方法。

    treeset 在使用時,添加數據會自動進行自然排序,若添加的都是new出來的對象,這個時候就無法排序而進行報錯,處理辦法就是讓對象類實現compare接口並複寫compareTo方法。

    map​集合

      |--hashtable 不允許有nullnull值得情況

      |--hashmap  允許有nullnull值得情況

      |--treemap  可以對鍵進行排序

    map集合特點:該集合存儲 鍵-值 對,且鍵唯一。

     

    簡述Collection Map 的區別,並列舉3種常用Collection類和Map類? 

    答案:容器內每個爲之所存儲的元素個數不同。

    Collection 類型,每個位置只有一個元素。

    Map 類型,持有 key-value對,像個小型數據庫

     

    1、內部類可以隨意調用外部類的成員變量,也可以隨意調用外部類的成員方法。2、內部類不可以用abstract修飾符定義爲抽象類把內部類聲明爲abstract,這意味該類不能夠被直接實例化實際上實例化本類的時候會實例化的內部類,編譯器會報錯.

    3、權限訪問修飾符
        public,protected,default,private,這四種級別的修飾符都可以用來修飾類、方法和字段。

                包外       子類         包內        類內
    public      yes        yes          yes         yes
    protected   no         yes          yes         yes
    default     no         no           yes         yes
    private     no         no           no          yes

    4、請簡述final, finally, finalize三者間的區別。

    1)final:可以作爲修飾符修飾變量、方法和類,被final修飾的變量只能一次賦值;被final修飾的方法不能夠在子類中被重寫(override);被final修飾的類不能夠被繼承。

    2finally用在異常處理中定義總是執行代碼,無論try塊中的代碼是否引發異常,catch是否匹配成功,finally塊中的代碼總是被執行,除非JVM被關閉(System.exit(1)),通常用作釋放外部資源(不會被垃圾回收器回收的資源)

    3finalize()方法是Object類中定義的方法,當垃圾回收器將無用對象從內存中清除時,該對象的finalize()方法被調用。由於該方法是protected方法,子類可以通過重寫(override)該方法以整理資源或者執行其他的清理工作。

    5、JAVA中的包裝類型?

    基本類型的包裝類:

    Integer,Long,Short,Byte,Character,Double,Float,Boolean,BigInteger,

    BigDecmail

    其中BigInteger,BigDecmail沒有相應的基本類型,主要應用於高精度的運算,

    BigInteger支持任意精度的整數。BigDecmail

    支持任意精度帶小數點的運算。

    爲什麼要提供包裝類呢?

    答:是爲了在各種類型間轉化,通過各種方法的調用

    6.JAVAbreakcontinue關鍵字的區別?

    break的作用是跳出當前循環塊(forwhiledo while)或程序塊(switch。在循環塊中的作用是跳出當前正在循環的循環體。在程序塊中的作用是中斷和下一個case條件的比較。

    continue用於結束循環體中其後語句的執行,並跳回循環程序塊的開頭執行下一次循環,而不是立刻循環體。只能用在循環結構

    7,HashMapHashtable的區別。

    答案:Hashtable 繼承自Dictionary 類,而HashMapJava1.2引進的Map interface的一個實現;

    HashMap 允許將null作爲一個entrykey或者value,而Hashtable不允許;

    HashMap Hashtablecontains方法去掉了,改成containsvaluecontainsKey。因爲contains方法容易讓人引起誤解。

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在

    多個線程訪問Hashtable時,不需要自己爲它的方法實現同步,而HashMap就必須爲之提供外同步。

    Hashtable HashMap採用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

  • 8,volatile能保證變量安全,不能保證線程安全;它用在多線程同步中,可保證讀取的可見性;JVM保證從主內存加載到線程工作內存的值是最新的;它能禁止進行指令重排序。

二、選擇題
1、
下列語句正確的是:
形式參數可被字段修飾符修飾
形式參數不可以是對象
形式參數爲方法被調用時真正被傳遞的參數
形式參數可被視爲local variable(局部變量)
答:D;
在Java中修飾符總共有一下幾種: 
1.訪問控制修飾符  
   分別有:public private protected,缺省 
2.其它修飾符 
  分別有:abstract,final,static,native,synchronized,transient,volatile等  

對於形式參數只能用final修飾符,其它任何修飾符都會引起編譯器錯誤 。但是用這個修飾符也有一定的限制,就是在方法中不能對參數做任何修改。 
不過一般情況下,一個方法的形參不用final修飾。只有在特殊情況下,那就是:方法內部類。 
 
一個方法內的內部類如果使用了這個方法的參數或者局部變量的話,這個參數或局部變量應該是final。 
通過以上分析,你應該知道答案了吧。 
因爲字段修飾符包括很多(上面寫的),但是方法修飾符只能用final這一個修飾符。  
所以說這句話不對。 
參數可以是值也可以是對象,且實參纔是真正被傳遞的參數,形參就像局部變量
2、Java中用正則表達式截取字符串中第一個出現的英文左括號之前的字符串。比如:北京市(海淀區)(朝陽區)(西城區),截取結果爲:北京市。正則表達式爲()
A ".*?(?=\\()"
B ".*?(?=\()"
C ".*(?=\\()"
D ".*(?=\()"
1.什麼是正則表達式的貪婪與非貪婪匹配

如:String str="abcaxc";

Patter p="ab*c";

貪婪匹配:正則表達式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結果就是匹配到:abcaxc(ab.*c)。

非貪婪匹配:就是匹配到結果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結果就是匹配到:abc(ab.*?c)。

2.編程中如何區分兩種模式

默認是貪婪模式;

非貪婪模式:在量詞後面直接加上一個問號?。其實,正則表達式裏面通用方法是,在表示重複字符元字符,後面加多一個”?”字符即可。

量詞:{m,n}:m到n個

*:任意多個

+:一個到多個

?:0或一個
以上來自博主的博客,然後這道題目
.表示除\n之外的任意字符
*表示匹配0-無窮
+表示匹配1-無窮
(?=Expression) 順序環視,(?=\\()就是匹配正括號

前面的.*?是非貪婪匹配的意思, 表示找到最小的就可以了
(?=Expression) 順序環視,(?=\\()就是匹配正括號

String text = "北京市(海淀區)(朝陽區)(西城區)";
Pattern pattern = Pattern.compile(".*?(?=\\()");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
3、閱讀如下代碼。 請問,對語句行 test.hello(). 描述正確的有()
packageNowCoder;
classTest {
    publicstaticvoidhello() {
        System.out.println("hello");
    }
}
publicclassMyApplication {
    publicstaticvoidmain(String[] args) {
        // TODO Auto-generated method stub
        Test test=null;
        test.hello();
    }
}
A,能編譯通過,並正確運行
B,因爲使用了未初始化的變量,所以不能編譯通過
C,能編譯通過,但因變量爲null,不能正常運行
A
答:因爲Test類的hello方法是靜態的,所以是屬於類的;當實例化該類的時候,靜態會被優先加載而且只加載一次,所以不受實例化new Test();影響,只要是使用到了Test類,都會加載靜態hello方法。
另外,在其他類的靜態方法中也是可以調用公開的靜態方法,此題hello方法是使用public修飾的所以在MyApplication中調用hello也是可以的。
總結:這裏加載靜態方法跟test是否爲Null沒有關係,所以test數據中包含了Test類的初始化數據。
4、當窗口上下滾動時,能始終固定在視野頂端的是(div的直接父級元素是<body>)()?
<div style=”position:fixed;top:0;”></div>
<div style=”position:absolute;top:0;”></div>
<div style=”position:relative;top:0;”></div>
<div style=”margin-top:0;”></div>
5、以下js表達式返回false的是()
“”==false
false==null
null==undefined
答:undefined和null與任何有意義的值比較返回的都是false,但是null與undefined之間互相比較返回的是trueundefined值是派生自null值的,因此規定對它們的相等性測試要返回true;但null === undefined會返回false,因爲它們是不同類型的值。
6、以下表達式中,正確的是()
  • byte i=128
  • boolean i=null
  • long i=0xfffL
  • double i=0.9239d
CD
A byte ,1字節,值域-128至127; B boolean並非包裝對象Boolean,不能賦值爲null
6、下面哪個是版本控制工具?
safari    svn   git  xcode
正解:svn和git   xcode是用於開發蘋果軟件的
7、下列能實現一個正整數N對256求餘運算的代碼是?
N%256  N<<8  N>>8  N&0XFF
  AD
8、我們用a^b 來表示a的b次冪,那麼下列算是判斷正確的是?
  • 2.1^3.1>3.1^2.1
  • 2.1^3.1<3.1^2.1
  • 2.1^4.1>4.1^2.1
  • 2.1^4.1<4.1^2.1

答:比較a^b 與b^a的大小,可變爲比較ln(a^b) = blna 與ln(b^a)=alnb的大小,則blna/alnb =

(lna/a)/(lnb/b) 

設有f(x) = lnx/x    f'(x) = (1-lnx)/x^2 令f'(x)=0,求出x=e

則,當xe時,遞減。對稱軸爲x=e

故有,a=2.1 b=3.1時,a距離對稱軸>b距離對稱軸  f(a)a^b

 ==> 3.1^2.1 >2.1^3.1

當a=2.1 b=4.1時,a距離對稱軸f(b) 則a^b >b^a

==>2.1^4.1 > 4.1^2.1

根據大於1小於1來判斷
9、下面的程序執行輸出幾個hello?
 
#include<stdio.h>
#include <unistd.h>
intmain( ) {
    fork( );
    fork( );
    fork( );
    printf(“hello\n”);
    return0;
}
  • 3
  • 4
  • 6
  • 8
fork()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個進程也可以做不同的事。
fork調用的一個奇妙之處就是它僅僅被調用一次,卻能夠返回兩次,它可能有三種不同的返回值:
    1)在父進程中,fork返回新創建子進程的進程ID;
    2)在子進程中,fork返回0;
    3)如果出現錯誤,fork返回一個負值;

D
10、下面機制可以用於進程間通信
Socket,Named pipe,Shared memory
# 管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。
# 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關係進程間的通信。
# 信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。
# 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
# 信號 ( signal ) : 信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生。
# 共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。
# 套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。
11、如果某系統15*4=112成立,則系統採用的是幾進制?
  • 6
  • 7
  • 8
  • 9
答:公式:假設採用的是x進制,根據等式有:
(1*x1+5*x0)*4*x0= 1*x2+1*x1+2*x0
解得x=-3或x=6
12,以下哪項陳述是正確的?
垃圾回收線程的優先級很高,以保證不再使用的內存將被及時回收
垃圾收集允許程序開發者明確指定釋放 哪一個對象
垃圾回收機制保證了JAVA程序不會出現 內存溢出
進入”Dead”狀態的線程將被垃圾回收器回收
以上都不對  
答:
A:垃圾回收在jvm中優先級相當相當低。
B:垃圾收集器(GC)程序開發者只能推薦JVM進行回收,但何時回收,回收哪些,程序員不能控制。
C:垃圾回收機制只是回收不再使用的JVM內存,如果程序有嚴重BUG,照樣內存溢出。
D:進入DEAD的線程,它還可以恢復,GC不會回收
13,下列關於Java併發的說法中正確的是?
A,CopyOnWriteArrayList適用於寫多讀少的併發場景
B,ReadWriteLock適用於讀多寫少的併發場景
C,ConcurrentHashMap的寫操作不需要加鎖,讀操作需要加鎖
D,只要在定義int類型的成員變量i的時候加上volatile關鍵字,那麼多線程併發執行i++這樣的操作的時候就是線程安全的了
答:B
      CopyOnWrite適用於讀多寫少的併發場景。ConcurrentHashMap完全允許多個讀操作併發進行,讀操作並不需要加鎖。volatile不是保護線程安全的,它保護的是變量安全。主要的功能是保護變量不被主函數和中斷函數反覆修改造成讀寫錯誤。
14,子類A繼承父類B, A a = new A(); 則父類B構造函數、父類B靜態代碼塊、父類B非靜態代碼塊、子類A構造函數、子類A靜態代碼塊、子類A非靜態代碼塊 執行的先後順序是?
父類B靜態代碼塊->父類B構造函數->子類A靜態代碼塊->父類B非靜態代碼塊->子類A構造函數->子類A非靜態代碼塊
父類B靜態代碼塊->父類B構造函數->父類B非靜態代碼塊->子類A靜態代碼塊->子類A構造函數->子類A非靜態代碼塊
父類B靜態代碼塊->子類A靜態代碼塊->父類B非靜態代碼塊->父類B構造函數->子類A非靜態代碼塊->子類A構造函數
  • 父類B構造函數->父類B靜態代碼塊->父類B非靜態代碼塊->子類A靜態代碼塊->子類A構造函數->子類A非靜態代碼塊  
     C 先執行靜態代碼塊,因爲靜態代碼塊是類級別的,是在創建對象之前就執行的。因爲子類繼承了父類,所以父類的靜態代碼塊會先執行,接着執行子類的靜態代碼塊。

     因爲構造函數可能要給動態代碼塊的一些成員變量賦值,所以必須在這之前先執行動態代碼塊,要不然構造函數會出現相關的成員屬性無定義。所以會先執行動態代碼塊,在執行構造函數。一般先按父類的執行,再按子類的執行。

15,實現了GBK編碼字節流到UTF-8編碼字節流的轉換
       dst=new String(src,"gbk").getBytes("utf-8");
      String str=new String(new String("中文").getBytes("iso-8859-1"), "utf-8");

16, 有如下4條語句:

Integer i01 = 59;
int i02 = 59;
Integer i03 = Integer.valueOf(59);
Integer i04 = new Integer(59);

以下輸出結果爲false的是?

  • System.out.println(i01==i02);
  • System.out.println(i01==i03);
  • System.out.println(i03==i04);
  • System.out.println(i02==i04);

    ①無論如何,Integer與new Integer不會相等。不會經歷拆箱過程,   ②兩個都是非new出來的Integer,如果數在-128到127之間,則是true,否則爲false。   java在編譯Integer i2 = 128的時候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數會對-128到127之間的數進行緩存 。  從jdk1.5開始,有“自動裝箱”這麼一個機制,在byte(-128到127)範圍內(整型的八位二進制的表示的範圍爲-128到127),如果存在了一個值,再創建相同值的時候就不會重新創建,而是引用原來那個,但是超過byte範圍還是會新建對象③兩個都是new出來的,都爲false   ④int和integer(無論new否)比,都爲true,因爲會把Integer自動拆箱爲int再去比  

    17.   下列Java代碼中的變量abc分別在內存的____存儲區存放。

    class A {

        private String a = aa;

        public boolean methodB() {

            String b = bb;

            final String c = cc;

        }

    }

        堆區、堆區、堆區

        堆區、棧區、堆區

        堆區、棧區、棧區

        堆區、堆區、棧區

        靜態區、棧區、堆區

        靜態區、棧區、棧區

    答:常量區:未經 new的常量

    堆區:成員變量的引用,new出來的變量,接口

    棧區:局部變量的引用

    classA{
        privateString a = “aa”; // a 爲成員變量的引用,在堆區,“aa”爲未經 new 的常量,在常量區
        publicboolean methodB() {
            String b = “bb”; // b 爲局部變量的引用,在棧區,“bb”爲未經 new 的常量,在常量區
            final String c = “cc”; // c 爲局部變量的引用,在棧區,“cc”爲未經 new 的常量,在常量區
        }
    }


17,設int x=1,float y=2,則表達式x/y的值是:()
0   1   2   以上都不是
不同基本數據類型轉化與運算byte-short-int-long-float-double,float=1轉化爲float=1.0,int/float相比先轉化爲同一類型即float(1.0)/float(2.0)=0.5
18,JAVA中,下列哪些是Object類的方法()
synchronized();
wait();
notify();
notifyAll();
sleep();
答:
A    synchronized     Java語言的關鍵字,當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多隻有一個線程執行該段代碼。
B  C   D 都是Object類中的方法     
        notify():  是喚醒一個正在等待該對象的線程。   
        notifyAll(): 喚醒所有正在等待該對象的線程。
E   sleep 是Thread類中的方法
sleep()方法導致了程序暫停執行指定的時間,讓出cpu給其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。
在調用sleep()方法的過程中,線程不會釋放對象鎖。
而當調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法後本線程才進入對象鎖定池準備,獲取對象鎖進入運行狀態。


三,LINUX試題
1、關於linux操作系統中硬鏈接和軟鏈接的描述:可以建立一個空文件的軟鏈接
2、在linux系統中,有一個文件夾裏面有若干文件,通常用哪個命令可以獲取這個文件夾的大小:du-sh

四、填空題




1、對於滿足SQL92標準的SQL語句:

select foo,count(foo)from pokes where foo>10group by foo having count (*)>5 order by foo 

其執行順序應該是?

FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY 2、哪些jvm的垃圾回收方式採用的是複製算法回收
新生代串行收集器,並行收集器,新生代並行回收收集器
3、在網絡7層協議中,如果想使用UDP協議達到TCP協議的效果,可以在會話層做文章。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章