java 内存 开发 经验_有一到五年开发经验的JAVA程序员需要掌握的知识与技能!...
JAVA是一種平臺(tái),也是一種程序設(shè)計(jì)語(yǔ)言,如何學(xué)好程序設(shè)計(jì)不僅僅適用于JAVA,對(duì)C++等其他程序設(shè)計(jì)語(yǔ)言也一樣管用。有編程高手認(rèn)為,JAVA也好C也好沒(méi)什么分別,拿來(lái)就用。為什么他們能達(dá)到如此境界?我想是因?yàn)榫幊陶Z(yǔ)言之間有共通之處,領(lǐng)會(huì)了編程的精髓,自然能夠做到一通百通。如何學(xué)習(xí)程序設(shè)計(jì)理所當(dāng)然也有許多共通的地方。
一、Java特點(diǎn)
1、 面向?qū)ο?/p>
盡管受到其前輩的影響,但Java沒(méi)被設(shè)計(jì)成兼容其他語(yǔ)言源代碼的程序。這允許Java開發(fā)組自由地從零開始。這樣做的一個(gè)結(jié)果是,Java語(yǔ)言可以更直接、更易用、更實(shí)際的接近對(duì)象。Java的對(duì)象模型既簡(jiǎn)單又容易擴(kuò)展,對(duì)于簡(jiǎn)單數(shù)據(jù)類型,例如整數(shù),它保持了高性能,但不是對(duì)象。
2、 解釋性和高性能
字節(jié)碼可以在提供Java虛擬機(jī)(JVM)的任何一種系統(tǒng)上被解釋執(zhí)行。早先的許多嘗試解決跨平臺(tái)的方案對(duì)性能要求都很高。其他解釋執(zhí)行的語(yǔ)言系統(tǒng),如BASIC,Tcl,PERL都有無(wú)法克服的性能缺陷。然而,Java卻可以在非常低檔的CPU上順利運(yùn)行。前面已解釋過(guò),Java確實(shí)是一種解釋性語(yǔ)言,Java的字節(jié)碼經(jīng)過(guò)仔細(xì)設(shè)計(jì),因而很容易便能使用JIT編譯技術(shù)將字節(jié)碼直接轉(zhuǎn)換成高性能的本機(jī)代碼。Java運(yùn)行時(shí)系統(tǒng)在提供這個(gè)特性的同時(shí)仍具有平臺(tái)獨(dú)立性,因而“高效且跨平臺(tái)”對(duì)Java來(lái)說(shuō)不再矛盾。
3、 動(dòng)態(tài)
Java程序帶有多種的運(yùn)行時(shí)類型信息,用于在運(yùn)行時(shí)校驗(yàn)和解決對(duì)象訪問(wèn)問(wèn)題。這使得在一種安全、有效的方式下動(dòng)態(tài)地連接代碼成為可能,對(duì)小應(yīng)用程序環(huán)境的健壯性也十分重要,因?yàn)樵谶\(yùn)行時(shí)系統(tǒng)中,字節(jié)碼內(nèi)的小段程序可以動(dòng)態(tài)地被更新。
二、面向?qū)ο蟮木幊?/p>
2.1 抽象
面向?qū)ο缶幊痰囊粋€(gè)實(shí)質(zhì)性的要素是抽象。人們通過(guò)抽象(abstraction)處理復(fù)雜性。
例如,人們不會(huì)把一輛汽車想象成由幾萬(wàn)個(gè)互相獨(dú)立的部分所組成的一套裝置,而是把汽車想成一個(gè)具有自己獨(dú)特行為的對(duì)象。這種抽象使人們可以很容易地將一輛汽車開到雜貨店,而不會(huì)因組成汽車各部分零件過(guò)于復(fù)雜而不知所措。傳統(tǒng)的面向過(guò)程程序的數(shù)據(jù)經(jīng)過(guò)抽象可用若干個(gè)組成對(duì)象表示,程序中的過(guò)程步驟可看成是在這些對(duì)象之間進(jìn)行消息收集。這樣,每一個(gè)對(duì)象都有它自己的獨(dú)特行為特征。你可以把這些對(duì)象當(dāng)作具體的實(shí)體,讓它們對(duì)告訴它們做什么事的消息作出反應(yīng)。這是面向?qū)ο缶幊痰谋举|(zhì)。面向?qū)ο蟮母拍钍荍ava 的核心。
2.2面向?qū)ο缶幊痰?個(gè)原則
所有面向?qū)ο蟮木幊陶Z(yǔ)言都提供幫助你實(shí)現(xiàn)面向?qū)ο竽P偷臋C(jī)制,這些機(jī)制是封裝,繼承及多態(tài)性。現(xiàn)在讓我們來(lái)看一下它們的概念。
封裝
封裝(Encapsulation)是將代碼及其處理的數(shù)據(jù)綁定在一起的一種編程機(jī)制,該機(jī)制保證了程序和數(shù)據(jù)都不受外部干擾且不被誤用。理解封裝性的一個(gè)方法就是把它想成一個(gè)黑匣子,它可以阻止在外部定義的代碼隨意訪問(wèn)內(nèi)部代碼和數(shù)據(jù)。對(duì)黑匣子內(nèi)代碼和數(shù)據(jù)的訪問(wèn)通過(guò)一個(gè)適當(dāng)定義的接口嚴(yán)格控制。
Java封裝的基本單元是類。盡管類將在以后章節(jié)詳細(xì)介紹。現(xiàn)在仍有必要對(duì)它作一下簡(jiǎn)單的討論。類是一種邏輯結(jié)構(gòu),而對(duì)象是真正存在的物理實(shí)體。如果你對(duì)C/C++熟悉,可以這樣理解:Java程序員所稱的方法,就是C/C++程序員所稱的函數(shù)(function)。在完全用Java編寫的程序中,方法定義如何使用成員變量。這意味著一個(gè)類的行為和接口是通過(guò)方法來(lái)定義的,類這些方法對(duì)它的實(shí)例數(shù)據(jù)進(jìn)行操作。
繼承
繼承(Inheritance)是一個(gè)對(duì)象獲得另一個(gè)對(duì)象的屬性的過(guò)程。繼承很重要,因?yàn)樗С至税磳臃诸惖母拍睢J褂昧死^承,一個(gè)對(duì)象就只需定義使它在所屬類中獨(dú)一無(wú)二的屬性即可,因?yàn)樗梢詮乃母割惸莾豪^承所有的通用屬性。
繼承性與封裝性相互作用。如果一個(gè)給定的類封裝了一些屬性,那么它的任何子類將具有同樣的屬性,而且還添加了子類自己特有的屬性。這是面向?qū)ο蟮某绦蛟趶?fù)雜性上呈線性而非幾何性增長(zhǎng)的一個(gè)關(guān)鍵概念。新的子類繼承它的所有祖先的所有屬性。它不與系統(tǒng)中其余的多數(shù)代碼產(chǎn)生無(wú)法預(yù)料的相互作用。
多態(tài)性
多態(tài)性是允許一個(gè)接口被多個(gè)同類動(dòng)作使用的特性,具體使用哪個(gè)動(dòng)作與應(yīng)用場(chǎng)合有關(guān),下面我們以一個(gè)后進(jìn)先出型堆棧為例進(jìn)行說(shuō)明。假設(shè)你有一個(gè)程序,需要3種不同類型的堆棧。一個(gè)堆棧用于整數(shù)值,一個(gè)用于浮點(diǎn)數(shù)值,一個(gè)用于字符。盡管堆棧中存儲(chǔ)的數(shù)據(jù)類型不同,但實(shí)現(xiàn)每個(gè)棧的算法是一樣的。如果用一種非面向?qū)ο蟮恼Z(yǔ)言,你就要?jiǎng)?chuàng)建3個(gè)不同的堆棧程序,每個(gè)程序一個(gè)名字。但是,如果使用Java,由于它具有多態(tài)性,你就可以創(chuàng)建一個(gè)通用的堆棧程序集,它們共享相同的名稱。多態(tài)性的概念經(jīng)常被說(shuō)成是“一個(gè)接口,多種方法”。這意味著可以為一組相關(guān)的動(dòng)作設(shè)計(jì)一個(gè)通用的接口。多態(tài)性允許同一個(gè)接口被必于同一類的多個(gè)動(dòng)作使用,這樣就降低了程序的復(fù)雜性。選擇應(yīng)用于每一種情形的特定的動(dòng)作(specific action)(即方法)是編譯器的任務(wù),程序員無(wú)需手工進(jìn)行選擇。你只需記住并且使用通用接口即可。
三、 hashmap hashtable
HashMap 是一個(gè)散列表,它存儲(chǔ)的內(nèi)容是鍵值對(duì)(key-value)映射。HashMap 繼承于AbstractMap,實(shí)現(xiàn)了Map、Cloneable、java.io.Serializable接口。
HashMap 的實(shí)現(xiàn)不是同步的,這意味著它不是線程安全的。它的key、value都可以為null。此外,HashMap中的映射不是有序的。HashMap的實(shí)例有兩個(gè)參數(shù)影響其性能:“初始容量” 和 “加載因子”。容量是哈希表中桶的數(shù)量,初始容量 只是哈希表在創(chuàng)建時(shí)的容量。加載因子 是哈希表在其容量自動(dòng)增加之前可以達(dá)到多滿的一種尺度。當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時(shí),則要對(duì)該哈希表進(jìn)行 rehash 操作(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),從而哈希表將具有大約兩倍的桶數(shù)。
四. jvm 內(nèi)存模型
程序計(jì)數(shù)器
每個(gè)線程有要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,記錄下一條要運(yùn)行的指令。線程私有的內(nèi)存區(qū)域。如果執(zhí)行的是JAVA方法,計(jì)數(shù)器記錄正在執(zhí)行的java字節(jié)碼地址,如果執(zhí)行的是native方法,則計(jì)數(shù)器為空。
虛擬機(jī)棧
線程私有的,與線程在同一時(shí)間創(chuàng)建。管理JAVA方法執(zhí)行的內(nèi)存模型。
本地方法區(qū)
和虛擬機(jī)棧功能相似,但管理的不是JAVA方法,是本地方法
方法區(qū)
線程共享的,用于存放被虛擬機(jī)加載的類的元數(shù)據(jù)信息:如常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼。也稱為永久代。
JAVA 堆
線程共享的,存放所有對(duì)象實(shí)例和數(shù)組。垃圾回收的主要區(qū)域。可以分為新生代和老年代(tenured)。
如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加Java進(jìn)階交流群:725633148,有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。
五、 運(yùn)行時(shí)類型信息(RTTI + 反射)
概念—RTTI:運(yùn)行時(shí)類型信息使得你可以在程序運(yùn)行時(shí)發(fā)現(xiàn)和使用類型信息。
使用方式:Java是如何讓我們?cè)谶\(yùn)行時(shí)識(shí)別對(duì)象和類的信息的,主要有兩種方式(還有輔助的第三種方式,見(jiàn)下描述):
一種是“傳統(tǒng)的”RTTI,它假定我們?cè)诰幾g時(shí)已經(jīng)知道了所有的類型,比如Shape s = (Shape)s1;另一種是“反射”機(jī)制,它運(yùn)行我們?cè)谶\(yùn)行時(shí)發(fā)現(xiàn)和使用類的信息,即使用Class.forName()。其實(shí)還有第三種形式,就是關(guān)鍵字instanceof,它返回一個(gè)bool值,它保持了類型的概念,它指的是“你是這個(gè)類嗎?或者你是這個(gè)類的派生類嗎?”。而如果用==或equals比較實(shí)際的Class對(duì)象,就沒(méi)有考慮繼承—它或者是這個(gè)確切的類型,或者不是。
工作原理
要理解RTTI在Java中的工作原理,首先必須知道類型信息在運(yùn)行時(shí)是如何表示的,這項(xiàng)工作是由稱為Class對(duì)象的特殊對(duì)象完成的,它包含了與類有關(guān)的信息。Java送Class對(duì)象來(lái)執(zhí)行其RTTI,使用類加載器的子系統(tǒng)實(shí)現(xiàn)。
無(wú)論何時(shí),只要你想在運(yùn)行時(shí)使用類型信息,就必須首先獲得對(duì)恰當(dāng)?shù)腃lass對(duì)象的引用
反射與RTTI的區(qū)別
RTTI與反射之間真正的區(qū)別只在于:對(duì)RTTI來(lái)說(shuō),編譯器在編譯時(shí)打開和檢查.class文件(也就是可以用普通方法調(diào)用對(duì)象的所有方法);而對(duì)于反射機(jī)制來(lái)說(shuō),.class文件在編譯時(shí)是不可獲取的,所以是在運(yùn)行時(shí)打開和檢查.class文件。
六. 即時(shí)編譯器技術(shù) — JIT
Java虛擬機(jī)中有許多附加技術(shù)用以提升速度,尤其是與加載器操作相關(guān)的,被稱為“即時(shí)”(Just-In-Time,JIT)編譯器的技術(shù)。這種技術(shù)可以把程序全部或部分翻譯成本地機(jī)器碼(這本來(lái)是JVM的工作),程序運(yùn)行速度因此得以提升。當(dāng)需要裝載某個(gè)類時(shí),編譯器會(huì)先找到其.class文件,然后將該類的字節(jié)碼裝入內(nèi)存。此時(shí),有兩種方案可供選擇:
(1)一種就是讓即時(shí)編譯器編譯所有代碼。
(2)另一種做法稱為惰性評(píng)估(lazy evaluation),意思是即時(shí)編譯器只在必要的時(shí)候才編譯代碼,這樣,從不會(huì)被執(zhí)行的代碼也許就壓根不會(huì)被JIT所編譯。
七、 final關(guān)鍵字
對(duì)final關(guān)鍵字的誤解
當(dāng)final修飾的是基本數(shù)據(jù)類型時(shí),它指的是數(shù)值恒定不變(就是編譯期常量,如果是static final修飾,則強(qiáng)調(diào)只有一份),而對(duì)對(duì)象引用而不是基本類型運(yùn)用final時(shí),其含義會(huì)有一點(diǎn)令人迷惑,因?yàn)橛糜趯?duì)象引用時(shí),final使引用恒定不變,一旦引用被初始化指向一個(gè)對(duì)象,就無(wú)法再把它指向另一個(gè)對(duì)象。然而,對(duì)象其自身卻是可以被修改的,Java并未提供使任何對(duì)象恒定不變的途徑(但可以自己編寫類以取得使對(duì)象恒定不變的效果),這一限制同樣適用數(shù)組,它也是對(duì)象。
從事java十余年,現(xiàn)在把架構(gòu)師必須具備的一些技術(shù)總結(jié)出來(lái)一套思維導(dǎo)圖和錄制了一些相關(guān)視頻,分享給大家,供大家參考。
需要相關(guān)資料可以關(guān)注+轉(zhuǎn)發(fā)+私信我(七七)就能獲取
八、還需要一套系統(tǒng)全面的知識(shí)體系
1. 高性能架構(gòu)
1.1. 分布式架構(gòu)思維
1.2. Zookeeper分布式環(huán)境指揮官
1.3. Nginx高并發(fā)分流進(jìn)階實(shí)戰(zhàn)
1.4. ActiveMq消息中間件
1.5. RabbitMq消息中間件
1.6. Kafka百萬(wàn)級(jí)吞實(shí)戰(zhàn)
1.7. Memcached進(jìn)階實(shí)戰(zhàn)
1.8. Redis高性能緩存數(shù)據(jù)庫(kù)
1.9. MongoDB進(jìn)階實(shí)戰(zhàn)
1.10. 高性能緩存開發(fā)實(shí)戰(zhàn)
1.11. Mysql高性能存儲(chǔ)實(shí)戰(zhàn)
1.12. FastDFS分布式文件存儲(chǔ)實(shí)戰(zhàn)
1.13. 高并發(fā)場(chǎng)景分布式解決方案實(shí)戰(zhàn)
2. 微服務(wù)架構(gòu)
2.1. 服務(wù)的前世今生
2.2. 基于分布式思想下的RPC解決方案
2.3. Dubbo應(yīng)用及源碼解讀
2.4. SpringBoot
2.5. SpringCloud應(yīng)用及源碼解讀
2.6. Docker虛擬化技術(shù)
3. 開源框架
3.1. spring5概述
3.2. Spring5 Framework體系結(jié)構(gòu)
3.3. Spring5環(huán)境搭建
3.4. IOC源碼解析
3.5. AOP源碼解析
3.6. Spring MVC
3.7. Mybatis
4. 架構(gòu)師基礎(chǔ)
4.1. JVM性能調(diào)優(yōu)
4.2. Java程序性能優(yōu)化
4.3. Tomcat
4.4. 并發(fā)編程進(jìn)階
4.5. Mysql
4.6. 高性能Netty框架
4.7. Linux基礎(chǔ)與進(jìn)階
5. 團(tuán)隊(duì)協(xié)作開發(fā)
5.1. Git
5.2. Maven
5.3. Jenkins
5.4. Sonar
6. B2C商城項(xiàng)目
6.1. 系統(tǒng)設(shè)計(jì)
6.2. 用戶管理子系統(tǒng)
6.3. 商品管理子系統(tǒng)
6.4. 搜索子系統(tǒng)
6.5. 訂單子系統(tǒng)
6.6. 支付系統(tǒng)
6.7. 分布式調(diào)度系統(tǒng)
6.8. 后臺(tái)系統(tǒng)
高清思維導(dǎo)圖及相關(guān)視頻資料獲取方式
私信關(guān)鍵詞 【七七】即可獲取!
重要的事情說(shuō)三遍,私信、私信、私信后再發(fā)私信,才可以拿到!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java 内存 开发 经验_有一到五年开发经验的JAVA程序员需要掌握的知识与技能!...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 备案费是什么(备案工本费)
- 下一篇: java quartz没执行完_quar