有一到五年開發經驗的JAVA程序員需要掌握的知識與技能!

JAVA是一種平臺,也是一種程序設計語言,如何學好程序設計不僅僅適用於JAVA,對C++等其他程序設計語言也一樣管用。有編程高手認爲,JAVA也好C也好沒什麼分別,拿來就用。爲什麼他們能達到如此境界?我想是因爲編程語言之間有共通之處,領會了編程的精髓,自然能夠做到一通百通。如何學習程序設計理所當然也有許多共通的地方。

一、Java特點

1、 面向對象

儘管受到其前輩的影響,但Java沒被設計成兼容其他語言源代碼的程序。這允許Java開發組自由地從零開始。這樣做的一個結果是,Java語言可以更直接、更易用、更實際的接近對象。Java的對象模型既簡單又容易擴展,對於簡單數據類型,例如整數,它保持了高性能,但不是對象。

2、 解釋性和高性能

字節碼可以在提供Java虛擬機(JVM)的任何一種系統上被解釋執行。早先的許多嘗試解決跨平臺的方案對性能要求都很高。其他解釋執行的語言系統,如BASIC,Tcl,PERL都有無法克服的性能缺陷。然而,Java卻可以在非常低檔的CPU上順利運行。前面已解釋過,Java確實是一種解釋性語言,Java的字節碼經過仔細設計,因而很容易便能使用JIT編譯技術將字節碼直接轉換成高性能的本機代碼。Java運行時系統在提供這個特性的同時仍具有平臺獨立性,因而“高效且跨平臺”對Java來說不再矛盾。

3、 動態

Java程序帶有多種的運行時類型信息,用於在運行時校驗和解決對象訪問問題。這使得在一種安全、有效的方式下動態地連接代碼成爲可能,對小應用程序環境的健壯性也十分重要,因爲在運行時系統中,字節碼內的小段程序可以動態地被更新。

二、面向對象的編程

2.1 抽象

面向對象編程的一個實質性的要素是抽象。人們通過抽象(abstraction)處理複雜性。

例如,人們不會把一輛汽車想象成由幾萬個互相獨立的部分所組成的一套裝置,而是把汽車想成一個具有自己獨特行爲的對象。這種抽象使人們可以很容易地將一輛汽車開到雜貨店,而不會因組成汽車各部分零件過於複雜而不知所措。傳統的面向過程程序的數據經過抽象可用若干個組成對象表示,程序中的過程步驟可看成是在這些對象之間進行消息收集。這樣,每一個對象都有它自己的獨特行爲特徵。你可以把這些對象當作具體的實體,讓它們對告訴它們做什麼事的消息作出反應。這是面向對象編程的本質。面向對象的概念是Java 的核心。

2.2面向對象編程的3個原則

所有面向對象的編程語言都提供幫助你實現面向對象模型的機制,這些機制是封裝,繼承及多態性。現在讓我們來看一下它們的概念。

封裝

封裝(Encapsulation)是將代碼及其處理的數據綁定在一起的一種編程機制,該機制保證了程序和數據都不受外部干擾且不被誤用。理解封裝性的一個方法就是把它想成一個黑匣子,它可以阻止在外部定義的代碼隨意訪問內部代碼和數據。對黑匣子內代碼和數據的訪問通過一個適當定義的接口嚴格控制。

Java封裝的基本單元是類。儘管類將在以後章節詳細介紹。現在仍有必要對它作一下簡單的討論。類是一種邏輯結構,而對象是真正存在的物理實體。如果你對C/C++熟悉,可以這樣理解:Java程序員所稱的方法,就是C/C++程序員所稱的函數(function)。在完全用Java編寫的程序中,方法定義如何使用成員變量。這意味着一個類的行爲和接口是通過方法來定義的,類這些方法對它的實例數據進行操作。

繼承

繼承(Inheritance)是一個對象獲得另一個對象的屬性的過程。繼承很重要,因爲它支持了按層分類的概念。使用了繼承,一個對象就只需定義使它在所屬類中獨一無二的屬性即可,因爲它可以從它的父類那兒繼承所有的通用屬性。

繼承性與封裝性相互作用。如果一個給定的類封裝了一些屬性,那麼它的任何子類將具有同樣的屬性,而且還添加了子類自己特有的屬性。這是面向對象的程序在複雜性上呈線性而非幾何性增長的一個關鍵概念。新的子類繼承它的所有祖先的所有屬性。它不與系統中其餘的多數代碼產生無法預料的相互作用。

多態性

多態性是允許一個接口被多個同類動作使用的特性,具體使用哪個動作與應用場合有關,下面我們以一個後進先出型堆棧爲例進行說明。假設你有一個程序,需要3種不同類型的堆棧。一個堆棧用於整數值,一個用於浮點數值,一個用於字符。儘管堆棧中存儲的數據類型不同,但實現每個棧的算法是一樣的。如果用一種非面向對象的語言,你就要創建3個不同的堆棧程序,每個程序一個名字。但是,如果使用Java,由於它具有多態性,你就可以創建一個通用的堆棧程序集,它們共享相同的名稱。多態性的概念經常被說成是“一個接口,多種方法”。這意味着可以爲一組相關的動作設計一個通用的接口。多態性允許同一個接口被必於同一類的多個動作使用,這樣就降低了程序的複雜性。選擇應用於每一種情形的特定的動作(specific action)(即方法)是編譯器的任務,程序員無需手工進行選擇。你只需記住並且使用通用接口即可。

三、 hashmap hashtable

HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。HashMap 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable接口。

HashMap 的實現不是同步的,這意味着它不是線程安全的。它的key、value都可以爲null。此外,HashMap中的映射不是有序的。HashMap的實例有兩個參數影響其性能:“初始容量” 和 “加載因子”。容量是哈希表中桶的數量,初始容量 只是哈希表在創建時的容量。加載因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。

四. jvm 內存模型

程序計數器

每個線程有要有一個獨立的程序計數器,記錄下一條要運行的指令。線程私有的內存區域。如果執行的是JAVA方法,計數器記錄正在執行的java字節碼地址,如果執行的是native方法,則計數器爲空。

虛擬機棧

線程私有的,與線程在同一時間創建。管理JAVA方法執行的內存模型。

本地方法區

和虛擬機棧功能相似,但管理的不是JAVA方法,是本地方法

方法區

線程共享的,用於存放被虛擬機加載的類的元數據信息:如常量、靜態變量、即時編譯器編譯後的代碼。也稱爲永久代。

JAVA 堆

線程共享的,存放所有對象實例和數組。垃圾回收的主要區域。可以分爲新生代和老年代(tenured)。

如果想學習Java工程化、高性能及分佈式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加Java進階交流羣:810589193,有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。

五、 運行時類型信息(RTTI + 反射)

概念—RTTI:運行時類型信息使得你可以在程序運行時發現和使用類型信息。

使用方式:Java是如何讓我們在運行時識別對象和類的信息的,主要有兩種方式(還有輔助的第三種方式,見下描述):

一種是“傳統的”RTTI,它假定我們在編譯時已經知道了所有的類型,比如Shape s = (Shape)s1;另一種是“反射”機制,它運行我們在運行時發現和使用類的信息,即使用Class.forName()。其實還有第三種形式,就是關鍵字instanceof,它返回一個bool值,它保持了類型的概念,它指的是“你是這個類嗎?或者你是這個類的派生類嗎?”。而如果用==或equals比較實際的Class對象,就沒有考慮繼承—它或者是這個確切的類型,或者不是。

工作原理

要理解RTTI在Java中的工作原理,首先必須知道類型信息在運行時是如何表示的,這項工作是由稱爲Class對象的特殊對象完成的,它包含了與類有關的信息。Java送Class對象來執行其RTTI,使用類加載器的子系統實現。

無論何時,只要你想在運行時使用類型信息,就必須首先獲得對恰當的Class對象的引用

反射與RTTI的區別

RTTI與反射之間真正的區別只在於:對RTTI來說,編譯器在編譯時打開和檢查.class文件(也就是可以用普通方法調用對象的所有方法);而對於反射機制來說,.class文件在編譯時是不可獲取的,所以是在運行時打開和檢查.class文件。

六. 即時編譯器技術 — JIT

Java虛擬機中有許多附加技術用以提升速度,尤其是與加載器操作相關的,被稱爲“即時”(Just-In-Time,JIT)編譯器的技術。這種技術可以把程序全部或部分翻譯成本地機器碼(這本來是JVM的工作),程序運行速度因此得以提升。當需要裝載某個類時,編譯器會先找到其.class文件,然後將該類的字節碼裝入內存。此時,有兩種方案可供選擇:

(1)一種就是讓即時編譯器編譯所有代碼。

(2)另一種做法稱爲惰性評估(lazy evaluation),意思是即時編譯器只在必要的時候才編譯代碼,這樣,從不會被執行的代碼也許就壓根不會被JIT所編譯。

七、 final關鍵字

對final關鍵字的誤解

當final修飾的是基本數據類型時,它指的是數值恆定不變(就是編譯期常量,如果是static final修飾,則強調只有一份),而對對象引用而不是基本類型運用final時,其含義會有一點令人迷惑,因爲用於對象引用時,final使引用恆定不變,一旦引用被初始化指向一個對象,就無法再把它指向另一個對象。然而,對象其自身卻是可以被修改的,Java並未提供使任何對象恆定不變的途徑(但可以自己編寫類以取得使對象恆定不變的效果),這一限制同樣適用數組,它也是對象。

從事java十餘年,現在把架構師必須具備的一些技術總結出來一套思維導圖和錄製了一些相關視頻,分享給大家,供大家參考。

需要相關資料可以可以加羣:810589193,點擊鏈接加入羣聊【Java架構學習交流羣】:https://jq.qq.com/?_wv=1027&k=5deQUBl),以下架構進階面試專題及答案及更多關於Dubbo、Redis、Netty、zookeeper、Spring cloud、分佈式、高併發等架構技術資料,有需要的朋友可以找我免費領取!希望新的一年裏能給你提供工作上的幫助和知識的進階。

八、還需要一套系統全面的知識體系

1. 高性能架構

1.1. 分佈式架構思維

1.2. Zookeeper分佈式環境指揮官

1.3. Nginx高併發分流進階實戰

1.4. ActiveMq消息中間件

1.5. RabbitMq消息中間件

1.6. Kafka百萬級吞實戰

1.7. Memcached進階實戰

1.8. Redis高性能緩存數據庫

1.9. MongoDB進階實戰

1.10. 高性能緩存開發實戰

1.11. Mysql高性能存儲實戰

1.12. FastDFS分佈式文件存儲實戰

1.13. 高併發場景分佈式解決方案實戰

2. 微服務架構

2.1. 服務的前世今生

2.2. 基於分佈式思想下的RPC解決方案

2.3. Dubbo應用及源碼解讀

2.4. SpringBoot

2.5. SpringCloud應用及源碼解讀

2.6. Docker虛擬化技術

3. 開源框架

3.1. spring5概述

3.2. Spring5 Framework體系結構

3.3. Spring5環境搭建

3.4. IOC源碼解析

3.5. AOP源碼解析

3.6. Spring MVC

3.7. Mybatis

4. 架構師基礎

4.1. JVM性能調優

4.2. Java程序性能優化

4.3. Tomcat

4.4. 併發編程進階

4.5. Mysql

4.6. 高性能Netty框架

4.7. Linux基礎與進階

5. 團隊協作開發

5.1. Git

5.2. Maven

5.3. Jenkins

5.4. Sonar

6. B2C商城項目

6.1. 系統設計

6.2. 用戶管理子系統

6.3. 商品管理子系統

6.4. 搜索子系統

6.5. 訂單子系統

6.6. 支付系統

6.7. 分佈式調度系統

6.8. 後臺系統

高清思維導圖及相關視頻資料獲取方式,有需要的可以加羣:810589193,點擊鏈接加入羣聊【Java架構學習交流羣】:https://jq.qq.com/?_wv=1027&k=5deQUBl裏面有阿里Java高級大牛直播講解知識點,分享知識,課程內容都是各位老師多年工作經驗的梳理和總結,帶着大家全面、科學地建立自己的技術體系和技術認知!


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