<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          不騙你,給女朋友看的超級(jí)精華Java問(wèn)題總結(jié)!

          共 8188字,需瀏覽 17分鐘

           ·

          2021-03-26 10:43

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          76套java從入門(mén)到精通實(shí)戰(zhàn)課程分享


          1、一個(gè)".java"源文件中是否可以包括多個(gè)類(lèi)(不是內(nèi)部類(lèi))?有什么限制?

          可以有多個(gè)類(lèi),但只能有一個(gè)public的類(lèi),并且public的類(lèi)名必須與文件名相一致。

          2、short s1= 1; s1= s1+1; 有沒(méi)有錯(cuò)?

          s1+1運(yùn)算時(shí)會(huì)自動(dòng)提升類(lèi)型,結(jié)果是int,賦值給s1時(shí),將報(bào)告需要強(qiáng)轉(zhuǎn)類(lèi)型的錯(cuò)誤。

          3、short s1= 1; s1 += 1;有沒(méi)有錯(cuò)?

          +=是java規(guī)定的運(yùn)算符,編譯器會(huì)對(duì)它進(jìn)行特殊處理,因此可以正確編譯。

          4、使用final關(guān)鍵字修飾一個(gè)變量時(shí),引用的內(nèi)容一定不能變?

          使用final修飾變量時(shí),是引用變量(也就是地址)不能變,引用變量所指向的對(duì)象中的內(nèi)容還是可以改變的

          5、是否可以從static方法內(nèi)對(duì)非static方法調(diào)用?為什么?

                  不可以。因?yàn)榉莝tatic方法是與對(duì)象關(guān)聯(lián)的,必須創(chuàng)建一個(gè)對(duì)象,才可以在該對(duì)象上進(jìn)行方法調(diào)用(對(duì)象.方法)。而static方法調(diào)用時(shí)不需要?jiǎng)?chuàng)建對(duì)象,可以直接調(diào)用。如果從一個(gè)static方法中發(fā)出對(duì)非static方法的調(diào)用,那個(gè)非static方法是關(guān)聯(lián)到哪個(gè)對(duì)象上的呢?這個(gè)邏輯無(wú)法成立。

          6、Overload和Override的區(qū)別?

          重載Overload表示同一個(gè)類(lèi)中可以有多個(gè)名稱(chēng)相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個(gè)數(shù)或類(lèi)型不同)。

          重寫(xiě)Override表示子類(lèi)中的方法可以與父類(lèi)中的方法的名稱(chēng)和參數(shù)完全相同,子類(lèi)對(duì)象調(diào)用這個(gè)方法時(shí),將調(diào)用子類(lèi)中的定義方法,這就把父類(lèi)中的方法覆蓋了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。

          7、Overloaded的方法是否可以改變返回值的類(lèi)型?

          如果幾個(gè)重載Overloaded的方法的參數(shù)列表不一樣,它們的返回者類(lèi)型當(dāng)然也可以不一樣。

          如果兩個(gè)方法的參數(shù)列表完全一樣,不管返回值是否相同,都不允許。因?yàn)闊o(wú)法確定編程者倒底是想調(diào)用哪個(gè)方法了,因?yàn)樗麄儽徽{(diào)用時(shí)看起來(lái)完全相同。

          8、接口是否可繼承接口?抽象類(lèi)是否可實(shí)現(xiàn)(implements)接口?抽象類(lèi)是否可繼承具體類(lèi)(concreteclass)?抽象類(lèi)中是否可以有靜態(tài)的main方法?

                  接口可以繼承接口。抽象類(lèi)可以實(shí)現(xiàn)(implements)接口,抽象類(lèi)可以繼承具體類(lèi)。抽象類(lèi)中可以有靜態(tài)的main方法。

                  記住抽象類(lèi)與普通類(lèi)的唯一區(qū)別就是不能創(chuàng)建實(shí)例對(duì)象和允許有abstract方法。

          9、Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?

                  靠的是父類(lèi)(或接口定義)的引用變量可以指向子類(lèi)(或具體實(shí)現(xiàn)類(lèi))的實(shí)例對(duì)象。

          而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對(duì)象的方法,而不是引用變量的類(lèi)型中定義的方法。

          10、abstractclass和interface有什么區(qū)別?

          抽象類(lèi)可以有構(gòu)造方法,接口中不能有構(gòu)造方法。

          抽象類(lèi)中可以有普通成員變量,接口中沒(méi)有普通成員變量

          抽象類(lèi)中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。

          抽象類(lèi)中的抽象方法類(lèi)型可以是public,protected,接口中的抽象方法只能是public類(lèi)型的,并且默認(rèn)為public abstract。

          7. 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類(lèi)。

          11、String s = "Hello";s = s + "world!";執(zhí)行后,原始的String對(duì)象中的內(nèi)容變了沒(méi)有?

                  沒(méi)有。因?yàn)镾tring被設(shè)計(jì)成不可變類(lèi),所以它的所有對(duì)象都是不可變對(duì)象。只是s不再指向舊的對(duì)象了。

          12、下面這條語(yǔ)句一共創(chuàng)建了多少個(gè)對(duì)象:String s="a"+"b"+"c"+"d";

          javac編譯可以對(duì)字符串常量直接相加的表達(dá)式進(jìn)行優(yōu)化直接得出答案,不必要等到運(yùn)行期再去進(jìn)行加法運(yùn)算處理

          這行代碼被編譯器在編譯時(shí)優(yōu)化后,相當(dāng)于直接定義了一個(gè)”abcd”的字符串,所以,上面的代碼應(yīng)該只創(chuàng)建了一個(gè)String對(duì)象。

          13、final, finally, finalize的區(qū)別。

                  final 用于聲明屬性,方法和類(lèi),分別表示屬性不可變,方法不可覆蓋,類(lèi)不可繼承。

                  finally是異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。

                  finalize是Object類(lèi)的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法.

          14、error和exception有什么區(qū)別?

                  error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況。                  exception表示程序還能夠克服和恢復(fù)的問(wèn)題

          15、Java 中堆和棧區(qū)別?
          棧常用于保存方法幀和局部變量,而對(duì)象總是在堆上分配。

          棧通常都比堆小,也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè) JVM 的所有線程共享。

                  棧:在函數(shù)中定義的一些基本類(lèi)型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配,當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java 就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過(guò)變量的作用域后,Java 會(huì)自動(dòng)釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作它用。

                  堆:堆內(nèi)存用來(lái)存放由 new 創(chuàng)建的對(duì)象和數(shù)組,在堆中分配的內(nèi)存,由 Java 虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理。

          16、能將 int 強(qiáng)制轉(zhuǎn)換為 byte 類(lèi)型的變量嗎?(引申到所有大類(lèi)型轉(zhuǎn)小類(lèi)型)
                  實(shí)際中,我們可以做強(qiáng)制轉(zhuǎn)換,不會(huì)報(bào)錯(cuò)。

          但是存在大類(lèi)型轉(zhuǎn)小類(lèi)型的通?。篿nt 是 32 位的,而 byte 是 8 位的,如果強(qiáng)制轉(zhuǎn)化,int 類(lèi)型的高 24 位將會(huì)被丟棄,所以盡量不要這樣做。

          17、hashCode有什么用?與 a.equals(b) 有什么關(guān)系?
                  hashCode方法對(duì)應(yīng)對(duì)象的 hash 值。它常用于基于 hash 的集合類(lèi),如 Hashtable、HashMap、LinkedHashMap等等。根            據(jù) Java 規(guī)范,兩個(gè)使用 equal() 方法來(lái)判斷相等的對(duì)象,必須具有相同的 hash code。

          18、垃圾回收的優(yōu)點(diǎn)和原理。

                  垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃圾回收器通常是作為一個(gè)單獨(dú)的低級(jí)別的線程運(yùn)行,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)死亡的或者長(zhǎng)時(shí)間沒(méi)有使用的對(duì)象進(jìn)行清除和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收?;厥諜C(jī)制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。

          原理:可以給對(duì)象添加一個(gè)被引用的計(jì)數(shù)器,就可以判斷是否已經(jīng)是無(wú)引用對(duì)象。但是難以解決循環(huán)引用問(wèn)題。


          如果不下小心直接把 Obj1-reference 和 Obj2-reference 置 null。則在 Java 堆當(dāng)中的兩塊內(nèi)存依然保持著互相引用無(wú)法回收。

          可達(dá)性分析法:通過(guò)一系列的 ‘GC Roots’ 的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)出發(fā)所走過(guò)的路徑稱(chēng)為引用鏈。當(dāng)一個(gè)對(duì)象到 GC Roots 沒(méi)有任何引用鏈相連的時(shí)候說(shuō)明對(duì)象不可用。 


          19,java中會(huì)存在內(nèi)存泄漏嗎

          內(nèi)存泄漏:指一個(gè)不再被程序使用的對(duì)象或變量一直被占據(jù)在內(nèi)存中。java中有垃圾回收機(jī)制,它可以保證當(dāng)對(duì)象不再被引用的時(shí)候,對(duì)象將自動(dòng)被垃圾回收器從內(nèi)存中清除掉。

                  由于Java使用有向圖的方式進(jìn)行垃圾回收管理,可以消除引用循環(huán)的問(wèn)題,例如有兩個(gè)對(duì)象,相互引用,只要它們和根進(jìn)程不可達(dá),那么GC也是可以回收它們的。

          java中的內(nèi)存泄露的情況:長(zhǎng)生命周期的對(duì)象持有短生命周期對(duì)象的引用就很可能發(fā)生內(nèi)存泄露.

          盡管短生命周期對(duì)象已經(jīng)不再需要,但是因?yàn)殚L(zhǎng)生命周期對(duì)象持有它的引用而導(dǎo)致不能被回收,這就是java中內(nèi)存泄露的發(fā)生場(chǎng)景。通俗地說(shuō),就是程序員可能創(chuàng)建了一個(gè)對(duì)象,以后一直不再使用這個(gè)對(duì)象,這個(gè)對(duì)象卻一直被引用,即這個(gè)對(duì)象無(wú)用但是卻無(wú)法被垃圾回收器回收的,這就是java中可能出現(xiàn)內(nèi)存泄露的情況,例如,緩存系統(tǒng),我們加載了一個(gè)對(duì)象放在緩存中(例如放在一個(gè)全局map對(duì)象中),然后一直不再使用它,這個(gè)對(duì)象一直被緩存引用,但卻不再被使用。

           

           

          21、線程和進(jìn)程有什么區(qū)別?

          進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是任務(wù)調(diào)度和執(zhí)行的基本單位

          線程是進(jìn)程的子集,一個(gè)進(jìn)程可以有很多線程,每條線程并行執(zhí)行不同的任務(wù)。

          不同的進(jìn)程使用不同的內(nèi)存空間,而所有的線程共享一片相同的內(nèi)存空間。

          22、如何在Java中實(shí)現(xiàn)線程?
          繼承Thread類(lèi)
          class Handler extends Thread{
              public void run(){
                 //方法重寫(xiě)
              }
              public static void main(String[] args){
                  Thread thread = new Handler();//創(chuàng)建線程對(duì)象
                  thread.start();//啟動(dòng)線程
              }
          }
          實(shí)現(xiàn)Runnable接口
          class Handler implements Runnable{
              public void run(){
                 //方法實(shí)現(xiàn)
              }
              public static void main(String[] args){
                  Handler handler = new Handler();
                  Thread thread = new Thread(handler);//創(chuàng)建線程對(duì)象
                  thread.start();//啟動(dòng)線程
              }
          }
          23、Java 關(guān)鍵字volatile 與 synchronized 作用與區(qū)別?

              1,volatile
              它所修飾的變量不保留拷貝,直接訪問(wèn)主內(nèi)存中的。
          在Java內(nèi)存模型中,有main memory,每個(gè)線程也有自己的memory (例如寄存器)。

          為了性能,一個(gè)線程會(huì)在自己的memory中保持要訪問(wèn)的變量的副本。這樣就會(huì)出現(xiàn)同一個(gè)變 量在某個(gè)瞬間,在一個(gè)線程的memory中的值可能與另外一個(gè)線程memory中的值,或者main memory中的值不一致的情況。 

          一個(gè)變量聲明為volatile,就意味著這個(gè)變量是隨時(shí)會(huì)被其他線程修改的,因此不能將它c(diǎn)ache在線程memory中。
              2,synchronized

          當(dāng)它用來(lái)修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。

          一、當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。

          二、當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊。

          三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。

          24、線程生命周期?

          新建一個(gè)線程時(shí),它的狀態(tài)是New。當(dāng)我們調(diào)用線程的start()方法時(shí),狀態(tài)被改變?yōu)镽unnable。線程調(diào)度器會(huì)為Runnable線程池中的線程分配CPU時(shí)間并且將它們的狀態(tài)改變?yōu)镽unning。其他的線程狀態(tài)還有Waiting,Blocked 和Dead。

          25、死鎖?

          指多個(gè)進(jìn)程在運(yùn)行過(guò)程中因爭(zhēng)奪資源而造成的一種僵局,當(dāng)處于這種狀態(tài)時(shí),若無(wú)外力作用,它們都將無(wú)法再向前推進(jìn)。

          原因可歸結(jié)為兩點(diǎn):競(jìng)爭(zhēng)資源、 進(jìn)程間推進(jìn)順序非法
          產(chǎn)生死鎖的必要條件:

          互斥條件:在一段時(shí)間內(nèi)某資源僅為一進(jìn)程所占用。
          請(qǐng)求和保持條件:對(duì)已獲得的資源保持不放。
          不剝奪條件:已獲得的資源只能由自己釋放。
          環(huán)路等待條件:存在一個(gè)進(jìn)程--資源的環(huán)形鏈。

          26、什么是線程池?為什么要使用它?

          創(chuàng)建線程要花費(fèi)昂貴的資源和時(shí)間,如果任務(wù)來(lái)了才創(chuàng)建線程那么響應(yīng)時(shí)間會(huì)變長(zhǎng),而且一個(gè)進(jìn)程能創(chuàng)建的線程數(shù)有限。

          線程池實(shí)現(xiàn)了線程重復(fù)利用,節(jié)約了時(shí)間和資源。
          // Java線程池的完整構(gòu)造函數(shù)
          public ThreadPoolExecutor(
            int corePoolSize, // 線程池長(zhǎng)期維持的線程數(shù),即使線程處于Idle狀態(tài),也不會(huì)回收。
            int maximumPoolSize, // 線程數(shù)的上限
            long keepAliveTime, TimeUnit unit, // 超過(guò)corePoolSize的線程的idle時(shí)長(zhǎng),
                                               // 超過(guò)這個(gè)時(shí)間,多余的線程會(huì)被回收。
            BlockingQueue<Runnable> workQueue, // 任務(wù)的排隊(duì)隊(duì)列
            ThreadFactory threadFactory, // 新線程的產(chǎn)生方式
            RejectedExecutionHandler handler) // 拒絕策略

          27、反射?

          JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)實(shí)體類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱(chēng)為java語(yǔ)言的反射機(jī)制。

          28、JDK 、 JRE 、JVM有什么區(qū)別和聯(lián)系?

          JVM :Java 虛擬機(jī)。能夠?qū)?class 文件中的字節(jié)碼指令進(jìn)行識(shí)別并調(diào)用操作系統(tǒng)向上的 API 完成動(dòng)作。所以說(shuō),jvm 是 Java 能夠跨平臺(tái)的核心。

          JRE :Java 運(yùn)行時(shí)環(huán)境。包含兩個(gè)部分,jvm和 Java 的一些基本類(lèi)庫(kù)。

          JDK :Java 開(kāi)發(fā)工具包。jdk 是整個(gè) Java 開(kāi)發(fā)的核心,它集成了 jre 和一些好用的小工具。

          這三者的關(guān)系是:一層層的嵌套關(guān)系。JDK>JRE>JVM。



          29、深拷貝淺拷貝

                數(shù)據(jù)類(lèi)型分為兩種基礎(chǔ)類(lèi)型和引用類(lèi)型:

          基礎(chǔ)類(lèi)型:像Number、String、Boolean等這種為基本類(lèi)型
          引用類(lèi)型:Object和Array

          淺拷貝只是復(fù)制了對(duì)象的引用地址,兩個(gè)對(duì)象指向同一個(gè)內(nèi)存地址,修改其中任意的值,另一個(gè)值會(huì)隨之變化

          深拷貝是將對(duì)象及值復(fù)制過(guò)來(lái),兩個(gè)對(duì)象修改其中任意的值另一個(gè)值不會(huì)改變。

          30、JVM內(nèi)存分為哪幾部分?各個(gè)部分的作用是什么?

          JVM內(nèi)存區(qū)域分為五個(gè)部分,分別是堆,方法區(qū),虛擬機(jī)棧,本地方法棧,程序計(jì)數(shù)器。

          1)堆。

          堆是Java對(duì)象的存儲(chǔ)區(qū)域,任何用new字段分配的Java對(duì)象實(shí)例和數(shù)組。
          2)方法區(qū)。

          它用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息,常量,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù),方法區(qū),從JDK1.8永久代被移除。
          3)虛擬機(jī)棧。

          虛擬機(jī)棧中執(zhí)行每個(gè)方法的時(shí)候,都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。
          4)本地方法棧。

          與虛擬機(jī)棧發(fā)揮的作用相似,相比于虛擬機(jī)棧為Java方法服務(wù),本地方法棧為虛擬機(jī)使用的Native方法服務(wù),執(zhí)行每個(gè)本地方法的時(shí)候,都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。
          5)程序計(jì)數(shù)器。

          指示Java虛擬機(jī)下一條需要執(zhí)行的字節(jié)碼指令。

          總:其中方法區(qū)和堆被JVM中多個(gè)線程共享,比如類(lèi)的靜態(tài)常量就被存放在方法區(qū),供類(lèi)對(duì)象之間共享,虛擬機(jī)棧,本地方法棧,pc寄存器是每個(gè)線程獨(dú)立擁有的,不會(huì)與其他線程共享。

          31、為什么會(huì)出現(xiàn)4.0-3.6=0.40000001這種現(xiàn)象?

          2進(jìn)制的小數(shù)無(wú)法精確的表達(dá)10進(jìn)制小數(shù),在計(jì)算10進(jìn)制小數(shù)的過(guò)程中要先轉(zhuǎn)換為2進(jìn)制進(jìn)行計(jì)算,這個(gè)過(guò)程中出現(xiàn)誤差。

          32、“==”比較的是什么?

          “==”兩邊是對(duì)象,比較地址。

          “==”兩邊是基本類(lèi)型,比較數(shù)值。
          ————————————————
          版權(quán)聲明:本文為CSDN博主「兔兔RabbitMQ?。?!」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
          原文鏈接:
          https://blog.csdn.net/hebtu666/article/details/114818801




          粉絲福利:Java從入門(mén)到入土學(xué)習(xí)路線圖

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒


          感謝點(diǎn)贊支持下哈 

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久黄色短视频 | www国产无码内射 | 久干网| 蜜芽成人网 | 色色五月天网站 |