概述
1991年由sun公司開發的名稱爲Oak的語言,1994年改名爲Java。html
JDK:Java Development Kit,Java的開發和運行環境,Java的開發工具和JRE。java
JRE:Java Runtime Environment,Java程序的運行環境,Java運行的所需的類庫和JVM(Java虛擬機)。設計模式
Java經常使用命令:javac 是負責編譯的部分,當執行javac時,會啓動java的編譯器程序。對指定擴展名的.java文件進行編譯,生成了jvm能夠識別的字節碼文件,即class文件,也就是java的運行程序。java 負責運行的部分,會啓動jvm加載運行時所需的類庫,並對class文件進行執行。一個文件要被執行,必需要有一個執行的起始點,這個起始點就是main函數。數組
語法基礎
數據類型:基本數據類型(四類八種) 引用數據類型(數組 類 接口)安全
基本數據類型:整數 byte short int long 小數 float double 字符 char 布爾 boolean,所佔字節數分別爲 1 2 4 8 4 8 2 1數據結構
數據度量單位:比特(位),bit 是計算機晶體管的一種狀態(通電與斷電)就是0與1,真與假,是計算機最基本的傳輸單位;字節 Byte 是計算機信息技術用於計量存儲容量的一種計量單位,1Byte = 8bit ,1KB = 1024 Byte;字符 一個字符是一個單位的字形、類字形單位或符號的基本信息,UTF-8編碼中,一個英文字母佔1Byte,一個漢字佔3-4Byte。app
Java程序在運行時,須要在內存中分配空間,爲了提升效率,就對數據進行了不一樣的空間劃分,具體分爲5種內存空間:jvm
寄存器(程序計數器):保證線程切換後能恢復到原來的執行位置;函數
本地方法區:爲虛擬機執行使用到的Native方法服務;工具
棧(虛擬機棧):存儲的都是局部變量,方法被調用時,建立棧幀,只要數據運算完成所在的區域結束,該數據就會被釋放;
堆:用於存儲數組和對象,也就是實體。每一個實體都有內存首地址值,堆內存中的變量都有默認初始化值,由於數據類型不一樣,值也不同;
方法區:存儲被虛擬機加載的類信息,常量,靜態常量,靜態方法等。(參考文檔http://www.javashuo.com/article/p-knegedir-bq.html)
面向對象
面向對象的三大特性:封裝 繼承 多態。
關鍵字 static 是一個修飾符,用於修飾成員(成員變量和成員函數)。特色:能夠實現對象中的共性數據的對象共享,被靜態修飾的成員能夠直接被類名所調用,靜態隨着類的加載而加載。靜態方法只能訪問靜態成員,不能夠訪問非靜態成員,緣由是靜態方法加載時,優先於對象,因此沒法訪問對象中的成員。靜態方法中不能使用this super關鍵字,由於this表明對象,而靜態在時,有可能沒有對象,因此this沒法使用。主函數是靜態的。
成員變量和靜態變量的區別:成員變量屬於對象,也稱實例變量;靜態變量屬於類,也稱爲類變量;成員變量存在於堆內存中;靜態變量存在方法區中;成員變量隨着對象建立而存在,隨着對象被回收而消失;靜態變量隨着類加載而存在,隨着類的消失而消失;成員變量只能被對象所調用,靜態變量能夠被對象調用,也能夠被類名調用。因此,成員變量能夠稱爲對象的特有數據,靜態變量稱爲對象的共享數據。靜態的生命週期很長。
靜態代碼塊:就是一個有靜態關鍵字標示的一個代碼塊區域。定義在類中。能夠完成類的初始化,靜態代碼塊隨着類的加載而執行,並且只執行一次(new多個對象時就只執行一次),若是和主函數在同一類,優先於主函數執行。
靜態代碼塊、構造代碼塊、構造函數同時存在時的執行順序:靜態代碼塊 〉 構造代碼塊 〉 構造函數。
關鍵字 final 是一個修飾符,能夠修飾類(修飾後不能夠被繼承)、變量(修飾後是一個常量,只能賦值一次)、方法(不能夠被重載)。
內部類:直接將A類定義在B類中,A類就稱爲內部類。內部類能夠直接訪問外部類的成員,而外部類想要訪問內部類,必需要創建內部類對象。
匿名內部類:沒有名字的內部類,就是內部類的簡化形式。通常只用一次就能夠用這種形式。匿名內部類其實就是一個匿名之類對象。想要定義匿名內部類:內部類必須繼承一個類或者實現接口。
匿名內部類的格式:new 父類名或接口名 ( ) { 定義之類成員或者覆蓋父類方法 }.方法名( );
異常
異常:程序在運行時候出現的不正常狀況。Error:錯誤,須要修正程序解決;Exception:異常,能夠有針對性處理方式。
線程
進程:正在進行中的程序。其實進程就是一個應用程序運行時的內存分配空間。
線程:進程中一個程序執行控制單元,一條執行路徑。進程負責的是應用程序的空間標示,線程負責的是應用程序的執行順序。
隨機性原理:由於cpu的快速切換,哪一個線程獲取到了cpu的執行權,哪一個線程就執行。
線程的五種狀態:
新建狀態(New):線程對象被建立;
就緒狀態(Runnable):可執行狀態,隨時可被cpu調度執行;
運行狀態(Running):線程獲取cpu權限進行執行;
阻塞狀態(Blocked):阻塞狀態是線程由於某種緣由放棄cpu使用權,暫時中止運行,直到線程進入就緒狀態,纔有機會轉到運行狀態;
消亡狀態(Dead):線程執行完成了或者因異常退出了run()方法,該線程結束生命週期。
字符串
Java中,字符串一但被初始化,就不能夠被改變,存放在方法區的常量池中。
StringBuffer 字符串緩衝區:構造一個其中不帶字符的字符串緩衝區,初始容量爲16個字符char,是一個長度可變的且能夠存儲任意類型數據的容器,since 1.0。
StringBuilder 字符串緩衝區:和StringBuffer相似,用在字符串緩衝區被單個線程是用的時候,兩者區別,StringBuilder效率高,線程不安全,since 1.6。
一旦一個 String 對象在內存(堆)中被建立出來,它就沒法被修改。String 類的全部方法都沒有改變字符串自己的值,都是返回了一個新的對象。
若是你須要一個可修改的字符串,應該使用 StringBuffer 或者 StringBuilder。不然會有大量時間浪費在垃圾回收上,由於每次試圖修改都有新的 String 對象被建立出來。
對於 String s = "a" + 變量 這樣的能夠用 StringBuilder 的 append() 方法替代,最後調用 toString() 方法(底層就是一個 new String())。
集合
集合是用於存儲數據的容器。
集合和數組的區別:數組固定長度,集合可變長度;數組能夠存儲基本數據類型 或 引用數據類型,集合只能存儲引用數據類型;數組存儲的元素必須是同一類型,集合存儲的元素能夠是不一樣數據類型。
數據結構:就是容器中存儲數據的方式。
Collection :List 有序(ArrayList LinkedList Vector) 和 Set 無序(HashSet LinkedHashSet TreeSet)。
Iterator 迭代器:是一個接口,做用:用於取集合中的元素。
Map:
Hashtable: 底層是哈希表數據結構,線程安全,不可存 null 鍵 null 值, since 1.0;
HashMap:底層是哈希表數據結構,線程不安全,不能夠存 null 鍵 null 值, since 1.2;
TreeMap:底層是二叉樹結構,能夠對Map集合中的鍵進行指定順序的排序, since 1.2。
IO流
流能夠理解爲數據的流動,就是一個數據流。IO流最終要以對象來體現,對象都存在IO包中。
流的分類:輸入流和輸出流;因處理的數據不一樣又能夠分爲字節流和字符流。
字節流:處理字節數據的流對象。設備上的數據不管是圖片或者dvd,文字,它們都以二進制存儲的。二進制的最終都是以一個8位爲數據單元進行體現,因此計算機中的最小數據單元就是字節。意味着,字節流能夠處理設備上的全部數據,因此字節流同樣能夠處理字符數據。
那麼爲何要有字符流呢?由於字符每一個國家都不同,因此涉及到了字符編碼問題,那麼GBK編碼的中文用unicode編碼解析是有問題的,因此須要獲取中文字節數據的同時指定的編碼表才能夠解析正確數據。爲了方便於文字的解析,因此將字節流和編碼表封裝成對象,這個對象就是字符流。只要操做字符數據,優先考慮使用字符流體系。
流的體系由於功能不一樣,可是有共性內容,不斷抽取,造成繼承體系。該體系一共有四個基類,並且都是抽象類。
字節流:InputStream OutputStream 字符流:Reader Writer
在這四個系統中,它們的子類,都有一個共性特色:子類名後綴都是父類名,前綴名都是這個子類的功能名稱。
close( )和flush( )的區別:
flush( ):將緩衝區的數據刷到目的地中後,流可使用。
close( ):將緩衝區的數據刷到目的地中後,流就關閉了,該方法主要用於結束調用的底層資源。這個動做必定作。
設計模式
單例:保證一個類在內存中的對象惟一性。
單例的其中兩種建立方式:餓漢式 私有化構造函數,建立私有並靜態的本類對象,定義公有並靜態的方法,返回該對象;懶漢式 延遲加載方式
拓展閱讀: