日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 基础知识部分提炼

發(fā)布時間:2023/12/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 基础知识部分提炼 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.new 對象和 聲明對象區(qū)別

People p = new?People (); 和 Poeple p;?

前者是在堆上面創(chuàng)建了內(nèi)存空間而且p指向了該空間。后者只是一個空指針,沒有指向任何存儲地址。

如果 將上述的p = man;那么前者和后者就都一樣了,只是第一種方式聲明的對象空間被丟棄,在垃圾回收的時候被釋放回收。

2.static修飾類

對于內(nèi)部類,為了將其對于其他類可見,而且不用先聲明父類,再調(diào)用這個子類。那么這樣就可以將這個內(nèi)部類聲明稱static。

3.private、protected 和public都可以聲明構(gòu)造方法,對于單例模式一般構(gòu)造方法為private,而newinstance為public static類型,防止使用者直接使用構(gòu)造方法構(gòu)造對象。

4.Java目前有9對應(yīng)jdk是1.9,那么jdk1.5,1.6,1.7,1.8,對應(yīng)Java分別是5,6,7,8。

5.Java幾種垃圾回收器

  • Serial Garbage Collector
  • Parallel Garbage Collector
  • CMS Garbage Collector
  • G1 Garbage Collector

  • 這四種垃圾收集器每一種都有自己的優(yōu)點與不足。最重要的是,我們開發(fā)人員可以選擇Java虛擬機使用的垃圾收集器的類型。我們可以通過傳從參數(shù)的形式,來選擇它們。每一種垃圾收集器都有非常大的特點,都可以提供完全不同的性能。必須嚴謹而準確地理解這集中垃圾收集器,然后基于應(yīng)用的使用情況正確選擇。

    1. Serial Garbage Collector

    Serial Garbage Collector通過暫停所有應(yīng)用的線程來工作。它是為單線程工作環(huán)境而設(shè)計的。它中使用一個線程來進行垃圾回收。這種暫停應(yīng)用線程來進行垃圾回收的方式可能不太適應(yīng)服務(wù)器環(huán)境。它最適合簡單的命令行程序。

    通過?-XX:+UseSerialGC?參數(shù)來選用Serial Garbage Collector。

    2. Parallel Garbage Collector

    Parallel Garbage Collector也被稱為吞吐量收集器(throughput collector)。它是Java虛擬機的默認垃圾收集器。與Serial Garbage Collector不同,Parallel Garbage Collector使用多個線程進行垃圾回收。與Serial Garbage Collector相似的地方時,它也是暫停所有的應(yīng)用線程來進行垃圾回收。

    3. CMS Garbage Collector

    Concurrent Mark Sweep (CMS) Garbage Collector使用多個線程來掃描堆內(nèi)存來標記需要回收的實例,然后再清除被標記的實例。CMS Garbage Collector只有在如下兩種情景才會暫停所有的應(yīng)用線程:

  • 當標記永久代內(nèi)存空間中的對象時;
  • 當進行垃圾回收時,堆內(nèi)存同步發(fā)生了一些變化。
  • 相比Parallel Garbage Collector,CMS Garbage Collector使用更多的CPU資源來確保應(yīng)用有一個更好的吞吐量。如果分配更多的CPU資源可以獲得更好的性能,那么CMS Garbage Collector是一個更好的選擇,相比Parallel Garbage Collector。

    通過?XX:+USeParNewGC?參數(shù)來選用CMS Garbage Collector。

    4. G1 Garbage Collector

    G1 Garbage Collector用于大的堆內(nèi)存區(qū)域。它將堆內(nèi)存分割成多個獨立區(qū)域(Region),然后并發(fā)地對它們進行垃圾回收。在釋放內(nèi)存后,G1還可以壓縮空閑的堆內(nèi)存。但是,CMS Garbage Collector是通過“Stop The World (STW)”來進行內(nèi)存壓縮的。G1優(yōu)先收集可回收更多內(nèi)存的區(qū)域。

    通過?–XX:+UseG1GC?參數(shù)來選用G1 Garbage Collector。

    Java 8 的改進

    在用G1 Garbage Collector時,可以開啟?-XX:+UseStringDeduplication?參數(shù)。它通過將重復(fù)的字符串移動到同一個?char?數(shù)組中來優(yōu)化堆內(nèi)存的使用。該選項在Java 8u20時引用進來。

    上面給出了四種垃圾收集器的介紹,至于選用哪個垃圾收集器,這個要根據(jù)應(yīng)用場景、可用的硬件資源以及吞吐量的要求來確定。

    Java虛擬機中的垃圾回收選項

    下面是與Java收集器相關(guān)的Java虛擬機選項。

    垃圾收集器選擇

    OptionDescription
    -XX:+UseSerialGC Serial Garbage Collector
    -XX:+UseParallelGC Parallel Garbage Collector
    -XX:+UseConcMarkSweepGC CMS Garbage Collector
    -XX:ParallelCMSThreads= CMS Collector – 使用的線程數(shù)
    -XX:+UseG1GC G1 Gargbage Collector

    垃圾回收優(yōu)化選項

    OptionDescription
    -Xms 堆內(nèi)存初始化尺寸
    -Xmx 堆內(nèi)存最大尺寸
    -Xmn 新生代(Young Generation)的尺寸
    -XX:PermSize 永久代(Permanent Generation)初始化尺寸
    -XX:MaxPermSize 永久代(Permanent Generation)最大尺寸

    Java虛擬機垃圾回收選項的使用示例

    java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar 對于內(nèi)存的劃分和管理,一般是操作系統(tǒng)(不管是什么編譯器編譯的程序)。但是對于Java虛擬機需要管理自己的內(nèi)存堆,那么必然對內(nèi)存堆有自己的分區(qū),而且不同版本 的jvm對內(nèi)存的劃分不一樣。

    6.Java 對象數(shù)組

    ?Object[] objArr = new?Object[1000]; ?

    String[] strarry = new String[10]; String[] strarry = {"","","","","",""};

    7.java 中四大引用 -- 強引用,軟引用,弱引用和虛引用。

    強引用:無論內(nèi)存是否足夠,不會回收,即使爆出來oom也不會回收。
    軟引用:內(nèi)存不足時,回收該引用關(guān)聯(lián)的對象。
    弱引用:垃圾回收時,無論內(nèi)存是否足夠,都會回收。
    虛引用:任何時候都可能被垃圾回收器回收。

    強引用只要有指針指向該堆,那么GC就不會回收,即使拋出來oom。這個指針變量可以是局部變量,在所在的方法執(zhí)行完,已經(jīng)出棧,那么局部指針就不存在了,那么GC可以回收。但是一個方法內(nèi)創(chuàng)建很多的局部對象,或者對象數(shù)組,那么方法還沒有出棧,那么GC就算oom也不會回收。除非每執(zhí)行完一個局部指針將指針置為空。 run() { Object obarr = new Object[10000]; Object obarr1 = new Object[10000]; ... }
    軟引用(內(nèi)存不夠即回收),弱引用(垃圾回收即回收)和虛引用(隨時可能回收)在回收的時候首先GC會判斷能不能使用到,有沒有指向到,指向到肯定不會被回收。沒有指向或者調(diào)用,那么就被回收。一般使用這三種引用是在創(chuàng)建較大的存儲空間,如圖片,文件緩存對象,或者較大的對象數(shù)組。
    8.transient 和 volatile 關(guān)鍵字 ?-- 線程安全和防止序列化

    transient

    transient是類型修飾符,只能用來修飾字段。在對象序列化的過程中,標記為transient的變量不會被序列化。

    示例:

    class Test {
    transient int a; // 不會被持久化
    int b; // 持久化
    }

    當類Test的實例對象被序列化(比如將Test類的實例對象 t 寫入硬盤的文本文件t.txt中),變量 a 的內(nèi)容不會被保存,變量 b 的內(nèi)容則會被保存。

    參考:
    把一個對象的表示轉(zhuǎn)化為字節(jié)流的過程稱為串行化(也稱為序列化,serialization),從字節(jié)流中把對象重建出來稱為反串行化(也稱為為反序列化,deserialization)。transient 為不應(yīng)被串行化的數(shù)據(jù)提供了一個語言級的標記數(shù)據(jù)方法。

    volatile
    volatile也是變量修飾符,只能用來修飾變量。volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內(nèi)存中重讀該成員變量的值。而且,當成員變量發(fā)生變化時,強迫線程將變化值回寫到共享內(nèi)存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。

    在此解釋一下Java的內(nèi)存機制:

    Java使用一個主內(nèi)存來保存變量當前值,而每個線程則有其獨立的工作內(nèi)存。線程訪問變量的時候會將變量的值拷貝到自己的工作內(nèi)存中,這樣,當線程對自己工作內(nèi)存中的變量進行操作之后,就造成了工作內(nèi)存中的變量拷貝的值與主內(nèi)存中的變量值不同。

    9.Java 并發(fā)與并發(fā)容器 -- Concurrent

    CopyOnWriteArrayList與Copy-On-Write策略

    Copy-On-Write簡稱COW,是一種用于程序設(shè)計中的優(yōu)化策略。其基本思路是,從一開始大家都在共享同一個內(nèi)容,當某個人想要修改這個內(nèi)容的時候,才會真正把內(nèi)容Copy出去形成一個新的內(nèi)容然后再改,這是一種延時懶惰策略。從JDK1.5開始Java并發(fā)包里提供了兩個使用CopyOnWrite機制實現(xiàn)的并發(fā)容器,它們是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并發(fā)場景中使用到。

    CopyOnWrite容器即寫時復(fù)制的容器。通俗的理解是當我們往一個容器添加元素的時候,不直接往當前容器添加,而是先將當前容器進行Copy,復(fù)制出一個新的容器,然后新的容器里添加元素,添加完元素之后,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行并發(fā)的讀,而不需要加鎖,因為當前容器不會添加任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

    CopyOnWrite容器只能保證數(shù)據(jù)的最終一致性,不能保證數(shù)據(jù)的實時一致性。所以如果你希望寫入的的數(shù)據(jù),馬上能讀到,請不要使用CopyOnWrite容器

    ConcurrentLinkedQueue

    在并發(fā)編程中,有時候需要使用線程安全的隊列或列表。通常實現(xiàn)線程安全有兩種方式,一種是使用阻塞算法,一種是使用非阻塞算法。非阻塞算法實現(xiàn)基礎(chǔ)為循環(huán)CAS(Compare and Swipe 比較和交換)。

    ConcurrentLinkedQueue技術(shù)上的實現(xiàn)與CopyOnWriteArrayList與Copy類似,但是容器只有部分內(nèi)容而不是整個容器可以被復(fù)制和修改。ConcurrentLinkedQueue有head節(jié)點和tail節(jié)點組成,每個節(jié)點由節(jié)點元素(item)和指向下一個結(jié)點(next)的引用組成。節(jié)點之間通過next關(guān)聯(lián)起來,形成一張鏈表結(jié)構(gòu)的隊列。

    ConcurrentHashMap與鎖分段技術(shù)

    ConcurrentHashMap是線程安全且高效的HashMap。多線程環(huán)境下,使用非線程安全的HashMap會導(dǎo)致死循環(huán),而如文章中建議的那樣,HashTable這種過時容器效率低下(使用synchronized來保證線程安全)。ConcurrentHashMap使用鎖分段技術(shù),大大提高了并發(fā)使用的效率。

    鎖分段技術(shù): 假設(shè)容器有多把鎖,每一把鎖用于鎖容器其中一部分數(shù)據(jù),當多線程訪問容器不同數(shù)據(jù)段數(shù)據(jù)時,線程間就不存在鎖競爭,從而提高并發(fā)訪問效率。

    10.public,protected,private 權(quán)限修飾詞,默認的條件下,同一個包內(nèi)是默認public,不在同一個包內(nèi)是private,protected只允許子類訪問。 11.Java 規(guī)則: 高位向地位轉(zhuǎn)換需要強轉(zhuǎn),地位向高位轉(zhuǎn)化,自動轉(zhuǎn)化。 short a=1; 這是對的,可以直接賦值,只要數(shù)值在short范圍內(nèi)。 ? short b =a +1; ?這個是不對的,1默認是整型。 short a +=1;這是對的,Java復(fù)合運算做了優(yōu)化,先是加法short a+1;然后轉(zhuǎn)換short類型。 12.Java switch只能接收 int ,short,byte,char四中數(shù)據(jù)類型。 13.方法重載(多態(tài)):就是在同一個類中,方法的名字相同,但參數(shù)個數(shù)、參數(shù)的類型或返回值類型不同!
    方法重寫:它是指子類和父類的關(guān)系,子類重寫了父類的方法,但方法名、參數(shù)類型、參數(shù)個數(shù)必須相同!


    總結(jié)

    以上是生活随笔為你收集整理的java 基础知识部分提炼的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。