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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

叮!您收到一份超值Java基础入门资料!

發(fā)布時(shí)間:2024/7/23 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 叮!您收到一份超值Java基础入门资料! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java語言有什么特點(diǎn)?如何最大效率的學(xué)習(xí)?深淺拷貝到底有何區(qū)別?阿里巴巴高級(jí)開發(fā)工程師為大家?guī)鞪ava系統(tǒng)解讀,帶你掌握J(rèn)ava技術(shù)要領(lǐng),突破重點(diǎn)難點(diǎn),入門面向?qū)ο缶幊?#xff0c;以詳細(xì)示例帶領(lǐng)大家Java基礎(chǔ)入門!

在學(xué)習(xí)JAVA編程的同學(xué)們,可以加我們的學(xué)習(xí)交流

QQ群:370161306群內(nèi)有相關(guān)學(xué)習(xí)資料

邢凱航(花名:弗止),阿里巴巴Java高級(jí)開發(fā)工程師,香港大學(xué)計(jì)算機(jī)科學(xué)碩士,16年加入阿里巴巴,目前就職于研發(fā)效能事業(yè)部用戶聲音及代碼智能化團(tuán)隊(duì),負(fù)責(zé)代碼中心后端開發(fā)。

以下內(nèi)容根據(jù)演講嘉賓視頻分享以及PPT整理而成。

本文將圍繞一下幾個(gè)方面進(jìn)行介紹:

1.Java語言特點(diǎn)

2.如何學(xué)習(xí)Java

3.JVM概述

4.面向?qū)ο笕腴T

5.示例演示

6.擴(kuò)展閱讀

一. Java語言特點(diǎn)

1.Java是一種面向?qū)ο蟮恼Z言,以對(duì)象為顆粒度,對(duì)象中包含屬性和方法,通過對(duì)象間的繼承和組合構(gòu)建程序世界。在學(xué)習(xí)面向?qū)ο笳Z言時(shí),大家不僅僅應(yīng)該關(guān)注過程,還需要對(duì)待解決的問題進(jìn)行抽象和建模,最終生成易于維護(hù)和擴(kuò)展的設(shè)計(jì)方案。這是一個(gè)由淺入深、循序漸進(jìn)的過程。

  • 其次,Java具有良好的跨平臺(tái)特性。Java程序可以不受計(jì)算機(jī)硬件和操作系統(tǒng)的約束,在任何支持Java虛擬機(jī)(JVM)的環(huán)境下都可以正常運(yùn)行。編寫的Java程序經(jīng)過編譯后生成的字節(jié)碼可以被JVM識(shí)別,JVM為程序運(yùn)行屏蔽了底層操作系統(tǒng)的差異。

  • 第三個(gè)特點(diǎn)是Java具有垃圾回收機(jī)制,簡(jiǎn)稱GC(Garbage Collection)。在Java中不需要關(guān)心內(nèi)存空間的回收問題,這一切都會(huì)交給JVM進(jìn)行處理。JVM會(huì)識(shí)別出哪些對(duì)象不需要再次被使用,進(jìn)而自動(dòng)回收其內(nèi)存空間,不需要手動(dòng)回收,大大提高了開發(fā)效率。

  • 第四個(gè)特性是Java為單根結(jié)構(gòu)。Java中所有的類都繼承成自同一個(gè)基礎(chǔ)類object,如此所有類具有同一個(gè)通用接口,并且在層次結(jié)構(gòu)上都屬于同一類型,這為編程提供了極大的便利。

  • 另外Java在設(shè)計(jì)之初就非常注重安全性,在多個(gè)階段均提供了安全保證。Java中不支持指針,避免了非法內(nèi)存的操作。在編譯運(yùn)行時(shí),提供了多重語法、類型、邊界和字節(jié)碼的檢查。

  • 最后Java語言是解釋型的語言。Java編譯的結(jié)果并不會(huì)在操作系統(tǒng)上運(yùn)行,而是生成一個(gè)中間class文件,被JVM加載并解釋執(zhí)行。早期的Java版本因?yàn)榻忉屵^程,運(yùn)行速度相比C++要慢很多,但隨著Java編譯器的優(yōu)化,某些結(jié)果甚至已經(jīng)表明Java會(huì)比C++運(yùn)行更快,因此如今并沒有統(tǒng)一的定論。

  • 二. 如何學(xué)習(xí)Java

    首先,Java的學(xué)習(xí)有兩條主線——Java語言和JVM。一方面,大家需要學(xué)習(xí)Java語言編程的語法規(guī)則,能夠熟練使用JDK提供的常用的工具類,并通過多線程解決問題。此外還需要熟練掌握一至兩個(gè)框架,快速上手工程的開發(fā)。另一方面,大家需要了解JVM底層,了解Java內(nèi)部的運(yùn)行機(jī)制。

    其次,關(guān)于工具的選擇,這里推薦大家使用在業(yè)界比較流行的IntelliJ IDEA或Eclipse。一個(gè)好的編程工具會(huì)提供很多優(yōu)秀的能力,提升開發(fā)效率。

    第三點(diǎn),建議大家使用較新的JDK版本,例如JDK8及以上。JDK在更新過程中會(huì)出現(xiàn)一些優(yōu)秀的類庫(kù)以及新的語法規(guī)則,及時(shí)更新版本有助于跟上業(yè)界新步伐。最后尤為重要的是需要多看、多思考、多實(shí)踐。多看一些優(yōu)秀的源碼和工程,例如JDK源碼,可以了解好的編碼習(xí)慣和風(fēng)格,并且通過熟悉底層的原理,有助于寫出高性能和健壯的程序;再例如Tomcat源碼,阿里Dubbo源碼等,從中學(xué)習(xí)軟件設(shè)計(jì)思維。最后還需要多練習(xí)實(shí)踐。

    三. JVM概述

    1.Java內(nèi)存區(qū)域管理

    Java內(nèi)存區(qū)域包括兩部分:由所有線程共享的數(shù)據(jù)區(qū)和線程隔離的數(shù)據(jù)區(qū),如圖所示:

    在線程隔離的數(shù)據(jù)區(qū)中,包括虛擬機(jī)棧、本地方法棧和程序計(jì)數(shù)器。程序計(jì)數(shù)器可以指示當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào),字節(jié)碼解釋器會(huì)通過更改計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。每個(gè)線程的程序計(jì)數(shù)器都是獨(dú)立的,確保各線程間計(jì)數(shù)器互不影響。虛擬機(jī)棧也是線程私有的,生命周期和線程相同,每個(gè)方法執(zhí)行時(shí)會(huì)創(chuàng)建一個(gè)棧針、當(dāng)前執(zhí)行方法的局部變量表、操作數(shù)、動(dòng)態(tài)鏈接、方法出口等信息都存儲(chǔ)在該區(qū)域中。方法的調(diào)用和返回對(duì)應(yīng)的棧針在虛擬機(jī)棧中的入棧和出棧操作中。本地方法棧的作用與虛擬機(jī)棧類似,不過本地方法棧存儲(chǔ)的是調(diào)用native方法時(shí)使用的數(shù)據(jù)結(jié)構(gòu)。方法區(qū)是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量和靜態(tài)變量等數(shù)據(jù)。堆也是共享內(nèi)存區(qū)域,存儲(chǔ)對(duì)象實(shí)例、JVM的垃圾回收等。

    2.垃圾回收

    Java的垃圾回收機(jī)制中,首先需要確定哪些對(duì)象需要進(jìn)行垃圾回收,這里通常采用可達(dá)性分析來進(jìn)行判斷。這個(gè)算法的基本思想是設(shè)置一系列對(duì)象作為起點(diǎn),稱為GC Roots節(jié)點(diǎn),搜索建立引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí),則證明此對(duì)象是不可用的。在進(jìn)行可達(dá)性分析時(shí),需要讓整個(gè)系統(tǒng)凍結(jié)在某個(gè)時(shí)間點(diǎn),對(duì)外則表現(xiàn)為所有工作進(jìn)程都停止,如此才可以準(zhǔn)確獲取所有GC Roots,這個(gè)過程稱為stop the world。此外,引用計(jì)數(shù)器算法也可以判斷對(duì)象是否存活,雖然該算法效率較高,但如果存在對(duì)象間的循環(huán)引用,即使這些對(duì)象不可訪問,也存在無法回收的情況。

    在回收對(duì)象實(shí)例時(shí),有多種算法可供選擇。第一種標(biāo)記-清除算法,分為兩個(gè)階段,首先標(biāo)記出所有需要回收的對(duì)象,然后統(tǒng)一進(jìn)行回收。第二種復(fù)制算法,針對(duì)方法一中內(nèi)存碎片過多的缺點(diǎn),復(fù)制算法將內(nèi)存按照容量劃分為大小相同的兩塊,每次只使用其中的一塊,當(dāng)一塊用完后,將仍存活的對(duì)象復(fù)制到另一塊中,然后將使用的那塊空間一次性清理,如此反復(fù)使用。第三種標(biāo)記-整理算法,針對(duì)方法二中內(nèi)存利用率不高的缺點(diǎn)進(jìn)行改進(jìn),過程和方法一類似,首先對(duì)對(duì)象進(jìn)行標(biāo)記,然后將仍存活的對(duì)象向一端移動(dòng),然后清理邊界以外的內(nèi)存區(qū)域。方法四分代收集算法,將堆劃分為新生代和老年代,根據(jù)對(duì)象的生命周期,分別放入不同的內(nèi)存區(qū)域中,同時(shí)針對(duì)不同垃圾回收特點(diǎn)的對(duì)象采用不同的回收策略。新生代分為一塊較大的Eden區(qū)和兩個(gè)較小的survival區(qū),因?yàn)樾律蟛糠謱?duì)象都需要回收,所以采用復(fù)制算法進(jìn)行回收。而老年代中需要回收的對(duì)象較少,因此采用標(biāo)記-清除或者標(biāo)記-整理算法進(jìn)行回收。基于上述垃圾回收算法,JVM實(shí)現(xiàn)了多個(gè)垃圾收集器,可以通過一些參數(shù)進(jìn)行設(shè)定(具體內(nèi)容可參考擴(kuò)展閱讀)。

    四. 面向?qū)ο笕腴T

    在Java語言中,所有類都擁有一個(gè)共同的父類Object,即便沒有顯式聲明。接下來展示Object的一些方法,如下圖所示:

    首先,它包含一個(gè)private方法refisterNatives(),該方法與本地注冊(cè)有關(guān),這里不做詳細(xì)討論。其次,它包含notify()和notifyAll()方法,這兩種方法比較類似,歸并為一類,另包含三種wait()方法,也歸為一類。因此Object類共包含8種方法,分為以下四類進(jìn)行講解。

    他們分別回答了四個(gè)問題:我是誰,我從哪里來,我到哪里去,我與外界如何互相作用的。getClass和hashCode分別讓外界知曉當(dāng)前對(duì)象的類型和一個(gè)獨(dú)一無二的標(biāo)識(shí)。equals告訴外界當(dāng)前對(duì)象是否和另一個(gè)對(duì)象相等。toString用字符串標(biāo)識(shí)當(dāng)前對(duì)象信息。clone方法可以讓外界獲得當(dāng)前對(duì)象的一個(gè)拷貝。finalize方法可以實(shí)現(xiàn)對(duì)象被回收前最后的清理工作。notify()和notifyAll()方法用于喚醒一個(gè)等待在該對(duì)象上的一個(gè)線程或所有線程。wait方法是讓當(dāng)前線程進(jìn)入等待狀態(tài),直至被喚醒或者等待時(shí)間結(jié)束。注意這里clone方法和finalize方法使用灰色表示,因?yàn)槎叨紝儆趐rotected方法,如果需使用則需要重寫其實(shí)現(xiàn)。另外在重寫clone還要注意深拷貝和淺拷貝的問題,finalize方法使用時(shí)具有不確定性,這里不推薦大家使用。

    五. 示例演示

    1.整體示例

    在類Phone中,定義了兩個(gè)屬性brand和serialNum,代表品牌和序列號(hào)。在構(gòu)造函數(shù)中,為兩個(gè)屬性初始化值。同時(shí)實(shí)現(xiàn)了clone接口,覆蓋了父類實(shí)現(xiàn)。

    在main函數(shù)中,定義了phone1和phone2,phone2是phone1的拷貝,然后打印出兩個(gè)變量的基本信息,包括手機(jī)的類名稱、hashCode、表示當(dāng)前手機(jī)的字符串和對(duì)比兩個(gè)手機(jī)是否相同。運(yùn)行結(jié)果如下所示:

    由運(yùn)行結(jié)果可見,二者屬于同一個(gè)類,但hashCode不同,并且字符串表示也不相同。接下來仔細(xì)介紹每個(gè)方法。hashCode方法為native,表明調(diào)用的本地方法,代碼由非Java代碼寫出。hashCode返回一個(gè)int數(shù)值,代表內(nèi)存空間中的一個(gè)地址。

    equals方法如下所示,用雙等號(hào)來對(duì)比兩個(gè)對(duì)象,注意因?yàn)榇颂巸勺兞慷紴橐妙愋?#xff0c;因此這里雙等號(hào)對(duì)比的是二者引用的內(nèi)存地址是否一致。上例中由打印出的hashCode可見二者內(nèi)存地址不一致,因此equals方法返回false。

    toString方法中,首先打印類名稱,加上@,還有內(nèi)存地址空間的十六進(jìn)制表示。

    但某些情況下我們認(rèn)為如果phone的品牌和序列號(hào)一致即為二者一致,此時(shí)便需要嘗試修改一些方法的實(shí)現(xiàn)。這里可以使用IDE工具自動(dòng)生成generate的部分代碼(具體操作詳見視頻),如下所示:

    此時(shí)在equals中,首先比較二者的內(nèi)存地址空間,如果一致返回true;若不一致則進(jìn)一步比較二者的類信息,若類不一致,則返回false,若一致,則需要繼續(xù)比較其屬性值,若屬性值都一致,則可以認(rèn)為二者是相同的對(duì)象。hashCode中也類似,使用其兩個(gè)屬性值生成hashCode。

    類似的也可以生成toString的實(shí)現(xiàn),使用StringBuffer類來拼接字符串,打印出相關(guān)屬性值。此時(shí)再運(yùn)行主函數(shù),得出結(jié)果如下:

    此時(shí)兩個(gè)變量的hashCode值已經(jīng)一致,用字符串表示時(shí)也會(huì)打印出一些屬性信息,對(duì)比結(jié)果也返回true。

    2.深淺拷貝示例

    類Screen中,包含屬性值size,表示屏幕大小。并且有g(shù)etSize方法獲取屏幕大小以及setSize方法設(shè)置size。toString方法將size值打印出來。

    接著在上例Phone類中加入屬性值Screen,并且更新構(gòu)造函數(shù),加入獲取和更新屏幕的方法,如下所示:

    重新編寫main()函數(shù)。首先定義了大小為5的屏幕,phone1和phone2與上例一致,只是phone1新增了參數(shù)變量screen。分別打印出兩個(gè)phone的屏幕大小,然后更改screen的值,再打印一次,運(yùn)行結(jié)果如下所示:

    由結(jié)果可見,在更改screen大小之前,兩個(gè)phone的屏幕大小都為5,更改完成后都變?yōu)?。這表明此處默認(rèn)的clone方法實(shí)現(xiàn)的為淺拷貝。因?yàn)閟creen中存儲(chǔ)的為內(nèi)存地址空間,拷貝后的對(duì)象存儲(chǔ)的依然是該地址,因此改變屏幕size時(shí)二者同時(shí)變化。下面展示深拷貝,代碼如圖所示:

    首先從super.clone中獲得phone變量,為其重新設(shè)置屏幕大小,設(shè)置的值為調(diào)用當(dāng)前screen的clone方法,最后返回變化后的拷貝。運(yùn)行結(jié)果如下所示:

    此時(shí)可以看到在第二次更改完size之后,只有phone1的屏幕大小變?yōu)?,而phone2的屏幕大小仍然為之前的值。

    在學(xué)習(xí)JAVA編程的同學(xué)們,可以加我們的學(xué)習(xí)交流

    QQ群:370161306群內(nèi)有相關(guān)學(xué)習(xí)資料

    總結(jié)

    以上是生活随笔為你收集整理的叮!您收到一份超值Java基础入门资料!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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