JAVA基礎知識總結

JAVA概述

1、java之父php

詹姆斯·高斯林

2、java體系css

一、javaSE,標準版,各應用平臺的基礎,桌面開發和低端商務應用的解決方案。

二、javaEE,企業版,以企業爲環境而開發應用程序的解決方案。

三、javaME,微型版,致力於消費產品和嵌入式設備的最佳方案。

3、java能夠作什麼html

一、開發桌面應用程序。

二、開發面向Internet的web應用程序。

三、提供各行業的解決方案。

四、開發android手機應用程序。

4、java的特性java

一、一種面向對象的編程語言。

二、一種與平臺無關的語言(根據JVM實現的)。

三、一種健壯性語言。

四、具備較高的安全性。

5、java應用程序的運行機制android

先編譯(.class),在解釋運行。 

6、java程序開發的三個步驟程序員

一、編寫源程序,java源代碼文件。

二、編譯源程序,編譯器編譯編譯成java字節碼文件。

三、運行,java虛擬機(JVM)。

7、垃圾回收器(GC)web

在java運行過程當中自動啓動,程序員沒法干預。

8、JDK和JRE正則表達式

JDK:java開發工具包

    先編譯(編譯器javec),後運行(解釋器java)

JRE:java運行環境

    加載代碼(加載器),校驗代碼(校驗器),執行代碼(解釋器)

9、java虛擬機算法

java虛擬機實際上只是一層接口,一層Java程序和操做系統通信的接口。java文件編譯生成class文件, 而java虛擬機就是這些class文件可以在上面運行的一個平臺,你把class文件當作一個軟件,java虛擬機就是這個軟件能夠運行的操做系統。 

10、開發java應用的要點sql

一、一個源文件中只能有一個public修飾的類,其餘類個數不限。 二、一個源文件有n個類時,編譯結果的class文件就有n個。 三、源文件的名字必須和public修飾的類名相同 四、java語言中單詞拼寫大小寫嚴格區分。 五、main方法入口 六、每一句以分號(;)結束 

11、註釋

一、單行註釋// 二、多行註釋/* */ 三、java文檔註釋/** */ 

Java編程基礎

1、標識符

一、命名規則:由字母、下劃線、數字和美圓符號組成,不能以數字開頭,區分大小寫,不能是關鍵字和保留字(goto、const),長度通常不超過15個字符。 二、駝峯式命名: 類名:單個單詞,首字母大寫,多個單詞,首字母都大寫。 方法名、參數名、變量名:單個單詞,首字母小寫,多個單詞,第一單詞首字母小寫,其餘單詞首字母大寫。 包名:所有小寫。 

2、java數據類型劃分

一、基本數據類型: 數值型:byte 1字節 8位 -128~127 short 2字節 16位 -32768~32767 int 4字節 32位 -2^31~2^31-1 long 8字節 64位 2^63~2^63-1 浮點類型: float 4字節 32位 double 8字節 64位 字符型:char 2字節 16位 0~65535 布爾型:boolean true false 二、引用類型: 字符串 String、 類 class 、枚舉 enum、接口interface 

3、普及二進制

一、計算機中的數據都以二進制數據保存。 二、計算機信息的存儲單位: 位(bit):是計算機存儲處理信息的最基本的單位 字節(byte):一個字節有8個位組成。 

4、轉義字符

\n 換行  \r 回車  \t 水平製表  ' 單引號  " 雙引號  \斜槓

5、基本數據類型之間的轉換

一、自動類型轉換:範圍小→範圍大 byte→short→int→long→float→double; char→int→long→float→double 二、強制類型轉換:範圍大→範圍小 須要增強制轉換符 

6、變量

一、數據類型劃分:

    基本類型變量:數據的值

    引用類型變量:數據的地址

二、聲明的位置劃分:

    局部變量

    全局變量

        區別:

        一、默認值

            局部沒有默認值,使用前必須初始化。

            全局有默認值,默認爲0,沒必要須初始化。

        二、聲明位置

            局部在方法內。

            全局在方法外類內。

        三、做用位置

            局部只能在本身聲明的方法裏。

            全局在整個類中

7、java中的運算符

算術運算符:+ 、 - 、 * 、 / 、 % 、 ++ 、 -- 賦值運算符:= 、 += 、 -= 、 *= 、 /= 、 %= 關係運算符:> 、 < 、 >= 、 <= 、 == 、 != 邏輯運算符:! 、 & (只要有一個false 最終結果就是false) 、 | (但凡是有一個true 最終結果就是true) 、 ^ (若是兩邊同樣 最終結果爲false 若是兩邊不一樣 最終結果爲true)、 &&(若是第一個是false 那第二個不執行 最終結果是false)、 ||(若是第一個表達式的結果是true 那第二個表達式 就不去計算了 ,最終結果是true) 位運算符: ~ 、 >> 、 << 、 >>> 字符串鏈接運算符:+ 三目運算符:X ? Y : Z X爲boolean類型表達式,先計算x的值,若爲true,整個三目運算的結果爲表達式Y的值,不然整個運算結果爲表達式Z的值。 

8、程序流程控制

結構化程序的三種結構:

    順序、選擇(分支)、循環

9、if語句

一、if(){} 二、if(){}else{} 三、if(){}else if(){} 四、if(){if(){}else()} 五、if()執行語句 esle 執行語句 注意:執行語句只有一條語句的時候.能夠將if esle 的大括號省略 注意:()內是boolean類型表達式,{}是語句塊 比較字符串用equals,比較內容。比較數值用==,比較地址。 基本數據類型:變量名、變量值在棧中。 引用數據類型:變量名在棧中,變量值在常量池中。 

10、switch語句

switch(表達式expr){ case const1: statement1; break; … … case constN: statementN; break; [default: statement_dafault; break;] } 注意:一、表達式必須是int、byte、char、short、enmu、String類型 二、constN必須是常量或者finall變量,不能是範圍 三、全部的case語句的值不能相同,不然編譯會報錯 四、default可要可不要 五、break用來執行完一個分支後使程序跳出switch語句塊,不然會一直會執行下去。 

11、if和switch的區別

一、if能夠判斷範圍,也能夠判斷一個值 switch只能判斷指定的值 二、若只判斷指定的值,則使用switch語句,效率快 if判斷範圍,對數據判斷靈活,自身的格式也比較靈活 

12、for循環

for ([循環變量初始值設定]; [循環條件判斷]; [改變循環變量的值]){

        循環體

}

注意:一、表達式2通常不能夠省略,不然死循環

      二、表達式3能夠省略,可是在循環體中必須有語句修改變量,以使表達式2在某一時刻爲false結束循環。

      三、若同時省略表達式1,表表達式3,則至關於while(表達式2)語句

      四、三個表達式均省略 即for(;;)語句,此時至關於while(true)語句

      五、表達式一、表達式3能夠是逗號表達式,以使循環變量值在修改時能夠對其它變量賦值

十3、while

while( 條件表達式語句){ 循環體語句; } [初始條件] do{ 循環體; [迭代] }while( 循環條件判斷); 注意:一、當第一次執行時,若表達式=false時,則while語句不執行,而do/while語句執行一次後面的語句 二、必定要切記在switch循環中,若是沒有break跳出語句,每個case都要執行一遍,在計算最終結果。 

十4、break和continue

break跳出某個循環 continue跳過某個循環 注意:if外有循環能夠用break、continue,單純if不能夠用。 

十5、方法

一、爲何使用方法? 減小重複代碼,提供代碼複用性 使用方法將功能提煉出來 寫在類內 二、聲明格式 [修飾符] 返回值類型 方法名([形式參數列表]){ 程序代碼; [return 返回值;] } 注意:一、方法是給外界提供內容的位置,形式參數是外界提供的 二、方法調用的時候寫的是實際參數 三、實際參數的類型、順序和形參要對應上 四、支持自動轉換類型,不支持強制類型轉換 

十6、return

一、將數據返回給調用者,除了void外,return後必須跟着返回值,只能返回一個。 二、終止方法的執行,返回數據類型必須是void,return後不能添加數據。 注意:一、當return結束方法的時候,要讓其後面的代碼有可能被執行到。 二、一個方法裏能夠有多個return,在void裏不能有返回值,其餘的必須有返回值。 

十7、重載overload

一、在一個類中,方法名字相同,參數類型不一樣。

   參數類型不一樣:個數、數據類型、順序。

注意:

    一、重載和返回值類型,修飾符沒有任何關係。

    二、參數變量名修改也不可以重載

十9、遞歸

一、有返回值

二、有參數

三、可以有跳出循環的控制語句

四、本身調用本身

面向對象編程

1、面向對象和麪向過程

一、面向對象:是以具體的事物爲單位,考慮的是它的特徵(屬性)和行爲(方法)。

二、面向過程:是以具體的流程爲單位,考慮功能的實現。

2、類和對象

一、對象:看得見摸得着的具體事物。 類:抽象化的概念 二、類和對象的關係: 類是對象的模板/抽象化的概念,對象是類的實例。 三、建立類和對象 類: 特徵:全局變量/屬性/成員變量 動做:方法 對象: 類名 對象名=new 類名() 注意:一個類能夠建立多個對象,,每一個對象之間沒有關係。 

3、內存圖

一、棧:先進後出,存放基本數據類型變量名和變量值,引用數據類型的變量名,方法執行的時候進入棧中。 二、堆:先進先出,new出來的對象的實例,包括類的屬性個方法。 

4、構造方法

一、構造方法是new關鍵字調用的,用來幫助構建對象 二、顯示構造對象 三、隱示構造對象(沒有顯示的狀況下存在) 四、構造對象能夠重載,參數類型不一致。 

5、關鍵字

一、static調用格式: 一、同一個類中: 靜態的: 方法名 屬性名 類名.方法名 類名.屬性名 對象名.方法名 對象名.屬性名 非靜態的: 對象名.屬性名 對象名.方法名 二、不一樣類中: 靜態的: 對象名.方法名 對象名.屬性名 類名.方法名 類名.屬性名 非靜態的: 對象名.屬性名 類名.方法名 注意:一、static能夠修飾屬性、方法、代碼塊,不能夠修飾類和構造方法。 二、靜態方法隨着類的加載而加載。 三、在靜態方法區內的東西只有一份,全部的對象共享這一份空間,只要有一個對象對屬性進行修改,全部的對象調用都是修改後的數據。 四、代碼塊的執行順序:靜態代碼塊(只被調用一次)>構造代碼塊{}>構造方法>普通方法(需調用) 二、this關鍵字 一、能夠調用屬性和方法。 this.屬性名(全局變量) this.方法名(); 二、在構造方法中: 一、this();括號內的參數個數、順序、類型根據調用的方法來決定。 二、必須放在第一行,只能調用一次。 三、調用構造方法時只能在構造方法中調用,調用屬性和方法時能夠在構造方法中能夠在普通方法中。 四、當全局變量和局部變量有重名字的時候,用this來區分。 三、super關鍵字 一、super指代父類對象。 二、super能夠調用屬性、方法、構造方法。 三、super調用父類的構造方法。 四、super調用構造方法時候必須放在第一行。 四、final最終的 一、能夠修飾全局變量,聲明的時候必須賦值,只能賦值一次。 二、能夠修飾局部變量,聲明時候能夠不賦值,但也只能賦值一次。 三、能夠修飾方法,能夠正常使用,不能被重寫。 四、能夠修飾類,能夠正常使用,不能被繼承。 五、用final修飾的屬性一般叫常量。 六、static final 全局變量。每一個字母都要大寫。 五、this和super的區別 一、this指的是本類建立的對象。 super指代的是父類的對象 二、this能夠調用屬性、方法、構造方法。 super也能夠調用屬性、方法、構造方法。 三、this調用屬性和方法的時候,調用本身本類的屬性和方法。 若是本類沒有,那就用super去父類中找 四、this調用構造方法調用,調用本類的其餘構造方法。 super調用父類的構造方法。 五、this和super在調用構造方法的時候必須放在第一行。 六、this和super不能同時存在 六、最小做用域最強原則: 局域變量在此方法中,比全局變量在此方法中的做用強。 

6、面向對象的三大特徵
一、封裝

做用:提升代碼的安全性

        一、將屬性私有化,並提供對外界的接口(get/set方法)。 二、用private修飾的屬性和方法,只能在本類中使用。 

二、繼承

 做用:提升代碼的複用性,減小重複代碼

    一、子類能夠繼承父類非私有的屬性和方法,不能繼承構造方法和私有的屬性和方法。 二、能夠綜合子類的共同特徵來去提煉父親的類。 三、子類在繼承父類的各類屬性和方法時,也能夠有本身的屬性和方法。 四、一個子類只能有一個父類,java只能單繼承,不能多繼承,由於多個類中的方法名相同,方法體不一樣,不知使用哪一個。 五、一個類繼承最頂端叫作基類或者超類,全部的超類叫作object 。 六、在繼承關係中,若是父類沒有無參數的構造方法,如何解決? 1>子類中添加一個和父類構造方法參數列表相同的構造方法,經過super參數傳遞給父類的構造方法 2>若是父類容許修改的時候,能夠在父類中建立一個無參的構造方法 七、在繼承關係中,代碼塊的執行順序:父靜>子靜>父構造代碼塊>父構造方法>子構造代碼塊>子構造方法 

三、多態

一、分類 編譯時多態:在編譯過程當中察覺的多態,重載,向上轉型。 運行時多態:在運行過程當中察覺的多態,向下轉型。 二、向上轉型、向下轉型是在繼承關係中,向下轉型必須在向上轉型的基之上。 三、在繼承關係中,父類的對象能夠指向子類的實例,父類引用實體方法的時候,是調用子類重寫之後的方法。 四、向上轉型 父類的引用指向子類的實體 父類類名 對象名=new 子類類(); 優勢:減小重複代碼,提升代碼的複用性 缺點:父類的引用沒法調用子類特有的屬性和方法 解決方案:向下轉型 五、向下轉型: 子類對象的父類引用賦給子類 子類類名 對象名=(子類類名)父類對象; 六、 instanceof 判斷左邊的對象是否屬於右邊的類 對象名 instanceof 類名(子類類名) 七、匿名對象 new 類名() 只有堆空間,沒有棧空間,只能屬於一次,爲了節省代碼。 

7、抽象abstract

做用:節省代碼,提升代碼的複用性

一、抽象類格式:訪問權限修飾符 abstract class 類名{} 二、抽象方法格式:訪問權限修飾符 abstract 返回值類型 方法名(形式參數列表); 注意: 一、若是一個類裏有抽象方法,那麼這個類必須聲明成抽象類。 二、一個類裏面能夠沒有抽象方法,能夠有非抽象方法, 三、類繼承抽象類: 把子類也用abstract修飾,變成抽象類。 子類重寫父類的抽象的方法 四、抽象類不能建立對象。 五、抽象類能夠有構造方法,在建立子類的時候,super隱式調用父類的構造方法,將父類的屬性和方法放到子類的對象空間裏。 六、在繼承你關係中,子類可以繼承抽象類的各類屬性和方法,除了私有的和構造方法。 七、只有公開的才能夠和abstract連用,static final private 都不能夠。 static屬於類方法,不容許覆蓋,abstract必須被覆蓋。final不能被重寫。 

8、接口interface

做用:規範了代碼,提升代碼的拓展性

一、格式:訪問權限修飾符 interface 接口名稱{} 二、實現類的格式:訪問權限修飾符 class 實現類名 implements 接口名{必須重寫接口中的全部的抽象方法} 三、接口中只有全局常量和抽象方法。 四、書寫的時候能夠省略部分修飾符,系統會默認給添上。 五、接口在實現的同時去繼承,extends在implement前面。 六、接口能夠多實現,實現的也必須是接口,方法名能夠重複,實現類實現一個就好了,由於沒有方法體,不會發生衝突。 

9、抽象和接口的區別

一、關鍵字:抽象類 abstract 接口interface 二、抽象類繼承 extends 接口實現 implements 三、子類繼承抽象類和 實現類實現接口的格式不一樣 四、接口中只有全局變量和抽象方法 抽象類中有各類屬性和方法 五、抽象類只能單繼承 接口能夠多實現 六、抽象類的子類只能繼承一個父類 實現類能夠實現多個接口,而且還能夠繼承父類 七、抽象類的做用:提升代碼的複用性 接口的做用:一、規範代碼二、提升代碼的拓展新 

10、方法重寫override 覆蓋(多態)

1.在子類中。

二、返回值相同、方法名相同、參數列表相同。

三、訪問權限修飾符不能比父類更嚴格。

四、父類的方法不可以知足子類需求的時候,子類須要重寫父類的方法。

11、重寫和重載的區別:

一、重寫是在繼承關係中             重載是在同一個類中

二、重寫是方法名、參數列表和父類相同      重載,方法名相同,參數列表不相同(個數、類型、順序)

三、重寫返回值類型和父類相同          重載和返回值無關

四、重寫訪問權限修飾符不能比父類更加嚴格 重載沒有要求

12、訪問權限修飾符

本類中       本包中        其餘包子類       其餘包非子類

  public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × × 

十3、equals

object中的equals比較的是地址,底層封裝的是== ==比較的是基本數據類型,比較的是內容 引用數據類型比較的是地址 String中也有equals,String中的equals被重寫過了,比較的是內容。 

十4、空指針異常

一、聲明瞭對象名,但沒有給對象初始化,而後使用這個對象

二、遇到了類類型做爲屬性的時候,就必須初始化,不然就會報錯

十5、內部類

分類:成員內部類、靜態內部類、局部內部類、匿名內部類

一、成員內部類: 一、能夠用四種訪問權限修飾符修飾 二、能夠有本身的屬性和方法,除了靜態的。 三、可使用外部類的全部屬性和方法,包括私有的。 四、建立對象 一、經過建立外部類對象的方式建立對象 外部類 外部類對象=new 外部類(); 內部類 對象名=外部類對象.new 內部類(); 二、內部類 對象名=new 外部類.new 內部類(); 二、靜態內部類 一、格式:static class 類名{} 二、能夠聲明靜態的屬性和方法 三、可使用外部的靜態的屬性和方法 四、建立對象 內類名 對象名=new 內類名();(能夠直接建立) 外部類名.內部類 對象名=new 外部類.內部類(); 包名.外部類名.內部類 對象名=new 包名.外部類.內部類(); 五、外部類與內部類同名時,默認是使用內部類對象調用外部類屬性 this表明內部類對象 六、要想使用外部類屬性,須要使用外部類對象調用 三、局部內部類 一、在方法中聲明 二、只能用default修飾 三、能夠聲明屬性和方法,但不能是靜態的 四、建立對象,必須在聲明內部類的方法內建立 五、調用方法的時候,局部內部類纔會被執行 四、匿名內部類 一、匿名內部類只是用一次 二、格式: 父類或接口名 對象名=new 父類或接口名(參數列表){ 重寫抽象方法 } 調用抽象方法:對象名.方法名 

十6、模式

一、單例模式 分類:懶漢式、餓漢式 一、構造方法私有化 二、在本類中建立本類對象 三、保證對象的惟一性final 四、給外界提供獲得對象的方法 static 五、在多線程中,餓漢式安全,懶漢式不安全 二、簡單工廠模式 批量建立對象 1 建立工廠類 : 建立對象的方法 2 果汁類 是全部種類果汁的父類 3 在工廠類的方法中返回果汁類 4 根據測試類中傳遞的字符串判斷到底返回哪一種果汁 5 測試類經過工廠類返回果汁對象 三、建造者模式 內部類使用場景 目的:靜態內部類建立外部類對象 一、 建立外部類,在其中建立一個靜態內部類 二、靜態內部類中寫屬性,構造方法和set get方法 三、靜態內部類中寫一個方法,必須返回外部類對象 四、 給外部類建立對象,傳遞參數。 四、裝飾者模式 一、在處理流中使用 二、子類重寫父類的方法,提升父類方法的功能及效率 三、爲了儘量減小重複代碼,在重寫的方法中用父類的對象調用父類原來的方法 四、獲得父類對象能夠經過將父類對象做爲子類屬性,經過子類構造方法傳遞父類對象 

數組及經常使用算法

1、一維數組

一、聲明: int a[]; int []b; 二、初始化: 動態初始化:一、a=new int[2]; int[0]=1;... 動態初始化:二、b=new b[]{3,4}; 靜態初始化:int [] c={5,6}; 三、數組經常使用的方法: 排序:Array.sort(); 查找:Array.binarySearch(); 打印:Array.toString(); 複製:Array.copyof(); 四、經常使用操做 一、冒泡排序 for(int i=0;i<a.length-1;i++){//控制外循環的次數 for(int j=0;j<a.length-1-i;j++){//控制內循環次數,比外循環少一次,與下一個比較 if(a[j]>a[j+1]){ int temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } 二、選擇排序 for (int i = 0; i < a.length-1; i++) { int k=i; for (int j = i; j < a.length-1; j++) { if (a[k]>a[j+1]) { k=j+1; } } if(i!=k){ int temp=a[i]; a[i]=a[k]; a[k]=temp; } } 三、順序查找 public static int find(int []b,int a){ for (int i = 0; i < b.length; i++) { if (a==b[i]) { return i; } } return -1; } 四、二分查找 public static int find(int b[],int a){ int max=b.length-1; int min=0; for (int i = 0; i < b.length; i++) { int midle=(max+min)/2; if(a==b[midle]){ return midle; }else if(a>b[midle]){ min=midle+1; }else if(a<b[midle]){ max=midle-1; } } return -1; } 

Java經常使用類

1、裝箱拆箱

一、裝箱:把基本數據類型轉成包裝類類型。 二、拆箱:把包裝類類型轉成基本數據類型。 三、爲何要包裝類? 八種基本數據類型不知足面向對象的思想,不包括屬性和方法。若是給基本數據類型添加功能,只能建立其包裝類,將方法和屬性封裝進去。 jdk5.0之後出現了自動拆箱,裝箱。 四、Integer支持字符串,但字符串必須是數字。Integer integer3=new Integer("2"); compareTo(); 比較大小,大返回整數,小於返回負數,相等返回0 toBinaryString(); 將十進制數轉成二進制,返回String字符串的表現形式 toHexString(); 將十進制轉成十六進制 toOctalString(); 將十進制轉成八進制 toString(); 將int類型數據轉成String字符串 Integer.valueOf(); 將int轉成integer類型對象 new Integer(); 將int轉成integer類型對象 parseInt(); 將Integer轉成int intValue(); 將Integer轉成int 

2、String字符串

== 比較地址 .equals() 比較內容 .equalsIgnoreCase() 忽略大小寫比較是否相同 .charAt(); 字符串截取出指定的下標開始 .compareTo() 比較大小 .compareToIgnore() 忽略大小比較 .concat() 將參數字符串鏈接到指定字符串後面 .contains() 是否包含參數字符串 .startsWith() 以指定前綴開頭 .endsWith() 以指定後綴結尾 .indexOf("/") 第一次出現 .indexOf("/", 3) 指定位置開始索引 .lastIndexOf("/") 最後一次出現 .substring(string11.lastIndexOf("/")+1);截取指定位置 .substring(string11.lastIndexOf("/")+1, string11.lastIndexOf("."));//截取字符串,指定開始位置和結束位置 .replace('a', 'b') 替換指定字符串,替換全部的 .toUpperCase() 所有轉爲大寫 .toLowerCase() 所有轉成小寫 .trim() 去掉字符串先後的空格,中間的去不掉 

3、StringBuffer

.append("abckjc"); 追加 .insert(2, "mmm"); 插入 .delete(2, 4); 刪除,參數1是起始下標,參數2是結束下標,左閉右開 .reverse(); 逆順反轉 String 長度不可變 StringBuffer 長度可變 線程安全 速度慢 StringBuilder 長度可變 線程不安全 速度快 

4、Charcter

.isLetter('a');     判斷是否爲字母

.isLetter('a');     判斷是否爲小寫字母

isUpperCase('A');   判斷是否爲大寫字母

toLowerCase('D');   將大寫字母轉成小寫字母  若是自己是小寫字母 則轉換完仍是小寫字母

toUpperCase('f');   將字母專程爲大寫字母

5、Boolean

Boolean boolean1=new Boolean("false"); System.out.println(boolean1);// true boolean中就是true,寫的不是true boolean全都是false 

6、正則表達式

字符類

[abc] a、b、c其中任意一個 [^abc] 除了a、b、c中的任意一個 [a-zA-Z] a-z或A-Z範圍中的任意一個 [a-zA-Z0-9] a-z A-Z 0-9 其中任意一個 [……] 能夠本身定義範圍 預約字符類 \d 數字0-9 \D 非數字0-9 \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:\s \w 單詞字符:[a-zA-Z_0-9] \W 非單詞字符\w 數量詞 ? 一次或者一次也沒有 * 0次到屢次 + 一次或者屢次 {n} 剛好n次 {n,} 至少n次 {n,m} 至少n次但不超過m次 .matches(); 匹配是否適合 .spil(); 拆分 

7、時間相關的類

一、Date類 .getTime();計算毫秒 二、SimpleDateFormat類 格式化時間 .format();返回的是String字符串 三、Calendar接口 日曆字段之間的轉換提供了一些方法 .get(Calendar.YEAR); .get(Calendar.MONTH);// 默認是當前月份減一 從0開始的 .get(Calendar.DAY_OF_MONTH); .get(Calendar.DAY_OF_WEEK); Calendar calendar = Calendar.getInstance(); Date date = calendar.getTime(); 四、Runtime運行時時間 .freeMemory(); 當前的系統剩餘空間 五、System.exit(0);退出程序,參數是0 是正常退出 System.gc();調用垃圾回收器 ,不必定可以起來 ,只是起到一個促進的做用 

Java異常處理機制

1、異常

一、在運行時期出現的不正常的事件,從繼承的角度看,throwable是錯誤和異常的超類 二、錯誤Error:程序員沒法處理的嚴重性問題,資源耗盡,jvm系統內部的錯誤 異常Exception:程序員能夠處理的通常性問題,偶然的外界因素,編程的邏輯性錯誤 三、處理的必要性角度: 受檢異常:編譯時期就能發現的異常,必需要去處理的異常,繼承自Exception 非受檢異常:運行時期發現的異常,不是必需要去處理的,繼承自RuntimeException 四、異常的處理機制: 當運行代碼的時候首先先碰到異常,首先產生異常對象,拋出給jvm,jvm會攜帶異常對象,去找代碼可以處理或者捕獲異常代碼, 若是找到了,則交給這個代碼去處理,沒有找打,則程序中止運行。 五、異常處理的兩種方式 一、捕獲異常 try{可能會產生異常的代碼}catch(異常類 異常對象){處理異常的代碼} try{}catch(){}catch(){}... catch中子類異常放在父類異常的上面 try{]catch(){}finally{} finally中的代碼必定會被執行到 try{}finally{} 1> 若是不去捕獲異常,發生異常,異常後面的代碼都不會被執行到 2> 若是捕獲異常 try/catch後面的代碼會被執行到 3> 捕獲異常,try塊中異常後面的代碼不會被執行到 二、拋出異常 產生異常的位置不去處理異常,由調用此方法的調用者去處理異 throws 方法的聲明後面 後面跟的是異常的類名 能夠跟多個類名之間用逗號隔開 能夠拋出受檢異常和非受檢異常 throw 方法的內部 異常的對象名 一個對象 拋出非受檢異常 六、自定義異常 自定義 受檢異常繼承Exception 非受檢異常 RuntimeException 

2、final finally finalize區別

final 最終的,可修飾類,方法,屬性 類:不能被繼承 方法:不能被重寫,能夠被繼承 屬性:全局變量:聲明是必須初始化。局部變量:聲明的時候能夠不初始化。但都只能賦值一次 finally 跟try/catch後面,不管是否發生異常都會被執行。關閉數據庫,關閉數據流。 finalize 由系統調用,垃圾回收器回收以前作一些清理的工做。 

集合

數組:長度固定,數據類型相同

集合:長度不固定,數據類型能夠不一樣,只能存對象

collection  

List           Set          Vector

ArrayList      HashSet

LinkedList     TreeSet

Map

HashMap

TreeMap

1、Collection

一、添加元素 add(Objectobj); //add方法的參數類型是Object。以便於接收任意類型對象。 二、刪除元素 remove(Objectobj); removeAll(另外一集合);//調用者只保留另外一集合中沒有的元素。 clear();//清空集合 三、判斷元素 contains(Objectobj);//判斷是否存在obj這個元素 isEmpty();//是否爲空 null 沒有初始化 只有棧空間沒有堆空間 empty 已經初始化了對象 這個容器中沒有數據 四、獲取個數,集合長度 size(); 五、取交集 retainAll(另外一集合);//調用者只保留兩集合的共性元素。 

2、List

List:元素是有序的,元素能夠重複。由於該集合體繫有索引。

        |--ArrayList:底層的數據結構使用的是數組結構。特色:查詢速度很快。可是增刪稍慢。線程不一樣步。 |--LinkedList:底層使用的是鏈表數據結構。特色:增刪速度很快,查詢稍慢。 |--Vector:底層是數組數據結構。線程同步。被ArrayList替代了。 ArrayList: 增:add();addAll(0,list2); 獲取:get(1); 修改:set(); 截取:subList(0, 2);左閉右開 LinkedList: 增:addFirst(); addLast(); jdk1.6後 offFirst(); offLast(); 獲取:getFirst(); getLast(); peekFirst(); peekLast(); 刪除:removeFirst(); removeLast(); pollFirst(); pollLast(); 壓棧:push(); 彈棧:pop(); 逆序輸出:linkedList.descendingIterator() 

3、Set

Set:元素是無序(存入和取出的順序不必定一致),元素不能夠重複。     

       |--HashSet:底層數據結構是哈希表。線程不一樣步。 保證元素惟一性的原理:判斷元素的hashCode值是否相同。若是相同,還會繼續判斷元素的equals方法,是否爲true。 |--TreeSet:能夠對Set集合中的元素進行排序。默認按照字母的天然排序。底層數據結構是二叉樹。保證元素惟一性的依據:compareTo方法return 0。 Set集合的功能和Collection是一致的 一、HashSet: 哈希表 一、能夠經過元素的兩個方法,hashCode和equals來完成保證元素惟一性。若是元素的HashCode值相同,纔會判斷equals是否爲true。 若是元素的hashCode值不一樣,不會調用equals。 二、hashcode是內存地址經過必定運算的到的int類型的數值。返回值是int類型的數據,各個屬性的hash值。 相加 三、hashcode值相同,也不必定是同一個對象 四、調用hashcode方法能夠幫助去過濾調用徹底不可能相同的 對象,提升執行效率 五、equals最終肯定兩個對象是否相同的 @Override public int hashCode() { // TODO Auto-generated method stub int code=name==null?0:name.hashCode(); return code; } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub if(obj==this){ return true; } if (obj==null) { return false; } if (obj instanceof Person) { Person person=(Person)obj; if (this.name.equals(person.name)) { return true; } } return false; } 

二、LinkedHashSet:

一、有序不重複

三、TreeSet:紅黑樹

一、天然排序,實現Comparable接口,重寫compareTo方法 ,系統自動調用 public int compareTo(Student o) { // TODO Auto-generated method stub if (this.score<o.score) { return 1; }else if(this.score>o.score){ return -1; }else { if(this.age<o.age){ return 1; }else if(this.age>o.age){ return -1; }else{ CollationKey collator=Collator.getInstance().getCollationKey(this.name); CollationKey collator2=Collator.getInstance().getCollationKey(o.name); return collator.compareTo(collator2); } } } 二、定製排序,單獨一個類實現Comparator接口,重寫compare方法(也可用內部類的方法寫) o1 至關於 天然排序中this o2 至關於天然排序中的參數對象 public class ComparatorDemo implements Comparator<Person>{ public int compare(Person o1, Person o2) { //o1原本對象 o2參數對象 //本類比參數大返回1 升序 //本類比參數小返回-1降序 if (o1.getAge()>o2.getAge()) { return -1; }else if(o1.getAge()<o2.getAge()){ return 1; }else { CollationKey collationKey=Collator.getInstance().getCollationKey(o1.getName()); CollationKey collationKey2=Collator.getInstance().getCollationKey(o2.getName()); return collationKey.compareTo(collationKey2); } } } 調用格式:TreeSet<Person> treeSet=new TreeSet<Person>(new ComparatorDemo()); 內部類的寫法: TreeSet<Person> treeSet2=new TreeSet<Person>(new Comparator<Person >() { public int compare(Person o1, Person o2) { // TODO Auto-generated method stub if (o1.getAge()>o2.getAge()) { return -1; }else if(o1.getAge()<o2.getAge()){ return 1; }else { CollationKey collationKey=Collator.getInstance().getCollationKey(o1.getName()); CollationKey collationKey2=Collator.getInstance().getCollationKey(o2.getName()); return collationKey.compareTo(collationKey2); } } }); 三、主要: 天然排序 測試的TreeSet集合 用無參數的構造方法 定製排序的時候 new TreeSet(Comparator接口對象的) 

4、Map

1)該集合存儲鍵值對,一對一對往裏存 2)要保證鍵的惟一性 Map |--Hashtable:底層是哈希表數據結構,不能夠存入null鍵null值。該集合是線程同步的。JDK1.0,效率低。 |--HashMap:底層是哈希表數據結構。容許使用null鍵null值,該集合是不一樣步的。JDK1.2,效率高。 |--TreeMap:底層是二叉樹數據結構。線程不一樣步。能夠用於給Map集合中的鍵進行排序。 初始容量16,加載因子0.75 Map和Set很像。其實Set底層就是使用了Map集合。 一、添加 Vput(K key,V value);//添加元素,若是出現添加時,相同的鍵,那麼後添加的值會覆蓋原有鍵對應值,並put方法會返回被覆蓋的值。 voidputAll(Map <? extends K,? extends V> m);//添加一個集合 二、刪除 clear();//清空 Vremove(Object key);//刪除指定鍵值對 三、判斷 containsKey(Objectkey);//判斷鍵是否存在 containsValue(Objectvalue)//判斷值是否存在 isEmpty();//判斷是否爲空 四、獲取 Vget(Object key);//經過鍵獲取對應的值 size();//獲取集合的長度 一、HashMap HashSet底層封裝HashMap,因此HashSet中的規律都是用於HashMap的鍵。值容許重複,容許多個null,鍵只容許一個null 若是自定義類做爲鍵,須要重寫hashcode的和equals方法,保證事物惟一性。若是做爲值,則不重寫 @Override public int hashCode() { // TODO Auto-generated method stub int code=name==null?0:name.hashCode(); int code2=age; int code3=sex.hashCode(); return code+code2+code3; } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub if (this==obj) { return true; } if (obj==null) { return false; } if (obj instanceof Person) { Person person=(Person) obj; if (this.name.equals(person.name)) { if(this.age==person.age){ if (this.sex.equals(person.sex)) { return true; } } } } return false; } 二、TreeMap 一、天然排序 public int compareTo(Person o) { // TODO Auto-generated method stub if (this.age<o.age) { return 1; }else if (this.age>o.age) { return -1; }else { CollationKey collationKey=Collator.getInstance().getCollationKey(this.name); CollationKey collationKey2=Collator.getInstance().getCollationKey(o.name); return collationKey.compareTo(collationKey2); } } 二、定製排序 單獨寫一個類 public class GirlCom implements Comparator<Girl> { @Override public int compare(Girl o1, Girl o2) { // TODO Auto-generated method stub if(o1.age>o2.age){ return 1; }else if(o1.age<o2.age){ return -1; }else { if(o1.weight>o2.weight){ return 1; }else if(o1.weight<o2.weight){ return -1; }else { CollationKey collationKey=Collator.getInstance().getCollationKey(o1.name); CollationKey collationKey2=Collator.getInstance().getCollationKey(o2.name); return collationKey.compareTo(collationKey2); } } } } 調用格式:TreeMap< Girl,String > treeMap=new TreeMap< Girl,String>(new GirlCom()); 

三、Hashtable

若是自定義類做爲鍵,則重寫compato方法,若是做爲值,則不重寫

四、遍歷集合的方式:

一、keySet();只得出來值 Set<String> set = map.keySet();//鍵的集合 //一、迭代 Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { String key = iterator.next(); System.out.println(map.get(key)); } //二、fore for (String string2 : set) { System.out.println(map.get(string2));// String2是鍵 } 二、entrySet();鍵-值對方式 Set<Entry<String, String>> set2=map.entrySet(); //迭代 Iterator<Entry<String, String>> iterator3=set2.iterator(); while (iterator3.hasNext()) { Entry<String, String> kEntry=iterator3.next(); System.out.println(kEntry); } //fore for (Entry<String, String> entry : set2) { System.out.println(entry); } 

Java I/O

一、File類 建立:File file = new File(路徑字符串); .exists();文件是否存在 .delete();刪除文件 .getPath();路徑 .isFile());是文件嗎 .isDirectory();是目錄嗎 .getName();名稱 .getAbsolutePath();絕對路徑 .lastModified();最後修改時間 .length();文件大小,不能判斷目錄/文件夾 .getParent();父路徑,獲得指定目錄的前一級目錄 .getAbsoluteFile();獲得文件絕對路徑文件 建立: .createNewFile();建立文件 .mkdir();建立一層文件夾 .mkdirs();建立多層文件夾 File(String path) 經過將給定路徑名字符串轉換爲抽象路徑名來建立一個新 File 實例 File(String path,String child) 根據 parent 抽象路徑名和 child 路徑名字符串建立一個新 File 實例。 File(File file,String child) list() 返回一個字符串數組,這些字符串目錄中的文件和目錄。 list(FileNameFilter) 返回一個字符串數組,這些字符串指知足指定過濾器的文件和目錄。 listFiles 返回一個抽象路徑名數組,這些路徑名目錄中的文件。 listFiles(FileNameFilter) 返回抽象路徑名數組,這些路徑名知足指定過濾器的文件和目錄。 

二、遍歷文件夾是用遞歸。

三、流的分類

按流分向:

    輸入流:從數據源到程序中的流   

    輸出流:從程序到數據源的流

按數據傳輸的單位:

    字節流:以字節爲單位傳輸數據的流

    字符流:以字符爲單位傳輸數據的流

按功能分:

    節點流:直接與數據源打交道的流

    處理流:不直接與數據源打交道,與其餘流打交道

四、流類

字節流                       字符流

輸入流      InputStream  超類,抽象類       Reader 超類,抽象類

輸出流       OutputStream 超類,抽象類       Write  超類,抽象類

五、流

read() 一個字節一個字節的讀 返回值是讀取到得數據的int表現形式 read(byte[]) 把字節讀取到數組中 返回 的是讀取到的個數 返回:讀入緩衝區的字節總數,若是由於已經到達文件末尾而沒有更多的數據,則返回 -1。 read(byte[],int offset,int length) 指定的數組中偏移的個數 指定的數組的下標 存儲數據的長度 

字符流

FileInputStream   字節流 輸入流 節點流 直接操做文件的

                read(); read(byte[]); read(byte[],off,,len); (byte[]接受數據,返回值!=-1) FileOutputStream 字節流 輸出流 節點流 write(int); write(byte[]); write(bute[],off,len); File file = new File("E:\ceshi.wmv");// 源文件 File file2 = new File("E:\aaa\ceshi.wmv");// 目標文件 // 一、建立流對象 FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(file2); // 二、讀取文件 byte[] bs = new byte[1024]; int num = 0; while ((num = fis.read(bs)) != -1) { fos.write(bs); } // 三、刷新 fos.flush(); // 四、關閉流 

字符流

FileReader        字符流 輸入流 節點流

                read(char[]); (char[]接收數據,返回值!=-1) FileWriter 字符流 輸出流 節點流 write(char,offset,length); 循環讀取判斷 !=-1 File file=new File("E:\22.txt"); File file2=new File("E:\aa\22.txt"); FileReader fileReader=new FileReader(file); FileWriter fileWriter=new FileWriter(file2); char [] ch=new char[4]; int num=0; while((num=fileReader.read(ch))!=-1){ fileWriter.write(ch,0,num); } fileWriter.flush(); 關閉流 

複製文件的流程

一、建立流對象

   二、讀取文件的文件(循環讀取)FileInputStream、FileReader

   三、寫入目標文件 FileOutputStream、FileWriter

   四、刷新關閉

緩衝流

BufferedInoutStream   字節流 輸入流 處理流    (byte[]接受數據,返回值!=-1) BufferedOutputStream 字節流 輸出流 BufferedReader 字符流 輸入流 (String接受數據,返回值!=null)resdLine(); BufferedWriter 字符流 輸出流 readLine();讀取一行,返回值String 循環讀取判斷 !=null newLine();換行 \r\n換行 BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File("E:\ceshi.wmv"))); BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File("E:\aa\ceshi.wmv"))); byte []bs=new byte[1024]; int num=0; long time=System.currentTimeMillis(); while((num=bis.read(bs))!=-1){ bos.write(bs,0,num); } bos.flush(); 關閉流 

轉換流

字節轉字符   InputStreamReader   繼承自Reader (String接收數據,返回值!=null) 字符轉字節 OutputStreamWriter 繼承自Wriiter BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream( new File("E:\ceshi.wmv")))); BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("E:\aa\demo\ceshi.wmv")))); String string=null; while((string=bufferedReader.readLine())!=null){ bufferedWriter.write(string); } bufferedWriter.flush(); 關閉流 

對象流

ObjectInputStream readObject(); ObjectOutputStream writeObject(Object obj); 一、用對象流去存儲對象的前提是 將對象序列化 實現接口Serializable 二、序列化和反序列化(將對象持久化儲存) 將對象轉成字節叫序列化 將字節轉成對象叫反序列化 三、序列化ID,幫助區分版本,可寫可不寫。 四、transient修飾不想被序列化的屬性,存儲默認值 Person person =new Person("秋秋", 22); Person person2=new Person("菜菜", 21); ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(new File("a.txt"))); objectOutputStream.writeObject(person); objectOutputStream.writeObject(person2); objectOutputStream.flush(); if (objectOutputStream!=null) { objectOutputStream.close(); } ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(new File("a.txt"))); Person person3=(Person) objectInputStream.readObject(); System.out.println(person3); Person person4=(Person) objectInputStream.readObject(); System.out.println(person4); if (objectInputStream!=null) { objectInputStream.close(); } 數據包裝流(瞭解)字節流,讀取字節 DataInputStream DataOutputStream 一、新增了不少讀取和寫入基本數據類型的方法 二、讀取的順序和寫入的順序同樣,不然數據內容會和存入時的不一樣 DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(new File("b.txt"))); dataOutputStream.writeInt(22); dataOutputStream.writeLong(34567); dataOutputStream.writeBoolean(true); dataOutputStream.flush(); if (dataOutputStream != null) { dataOutputStream.close(); } DataInputStream dataInputStream = new DataInputStream(new FileInputStream(new File("b.txt"))); System.out.println(dataInputStream.readInt()); System.out.println(dataInputStream.readLong()); System.out.println(dataInputStream.readByte()); if (dataInputStream != null) { dataInputStream.close(); } 

標準輸入/輸出/錯誤流

System.in  會阻塞程序的運行等待用戶輸入

   System.out 將內容打印到控制檯上

   System.err 將內容打印到控制檯上,顏色是紅色

標準輸入/輸出/錯誤流的重定向

System.setIn() System.setOut() System.setErr() 一、重定向的方法必定要放在標準輸入輸出錯誤流的前面 

打印流

PrintStream 字節打印流  能夠new能夠經過System.out獲得 PrintWriter 字符打印流 new 

內存流

ByteArrayInputStream  輸入流  (byte[]接受數據,返回值!=-1) ByteArrayOutputStream 輸出流 一、toByteArray() 返回值是byte,內存輸出流調用的,byte[] bs=byteArrayOutputStream.toByteArray(); //將內存中的數據轉化成byte數組 二、writeTo(OutputStream) 將內存流中的數據直接寫入參數流中 // 一、建立文件輸入流,讀取文件內容 BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File("E:\11.txt"))); // 二、建立內存輸入流,將讀取後的文件存到內存中 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] bs = new byte[1024]; int num = 0; // 三、循環讀取文件內容 while ((num = bufferedInputStream.read(bs)) != -1) { // 四、將文件寫入內存中 byteArrayOutputStream.write(bs,0,num); byteArrayOutputStream.flush(); ////將內存中的數據轉化成byte數組 byte[] bs2 = byteArrayOutputStream.toByteArray();////由於讀取的時候須要數組,因此在這兒寫 System.out.println("---" + new String(bs2)); // 五、建立內存輸入流。讀取內存中的數據 ByteArrayInputStream byteArrayInputStreamnew = new ByteArrayInputStream(bs2); // 七、建立文件輸出流,將內存中的文件 讀取到我文件中 BufferedOutputStream bufferedOutputStream = new BufferedOutputStream( new FileOutputStream(new File("E:\aaa\11.txt"))); byte[] bs3 = new byte[1024]; int num2=0; // 八、循環讀取內存中的數據 while ((num = byteArrayInputStreamnew.read(bs3)) != -1) { System.out.println("~~~" + new String(bs3)); // 九、寫入到文件中 bufferedOutputStream.write(bs3,0,num2); bufferedOutputStream.flush(); } //十、關閉各類流 

隨機讀寫流:在線程中使用較多

RandomAccessFile  字節流,便可以讀又能夠寫

        // 一、文件的長度 File file = new File("E:\ceshi.wmv"); System.out.println(file.length()); int tlen = 0; if (file.exists()) { tlen = (int) file.length(); //判斷文件並計算文件總長度 } int len = tlen % 4 == 0 ? tlen / 4 : tlen / 4 + 1; //計算每一段長度 int last = tlen - len * 3; //最後一段長度=總長度-前三段長度 Copy copy = new Copy(0, len); copy.start(); //第一段長度從0到len Copy copy2 = new Copy(len, len); copy2.start(); Copy copy3 = new Copy(len * 2, len); copy3.start(); Copy copy4 = new Copy(len * 3, len);copy4.start(); } } class Copy extends Thread { int star = 0; int leng = 0; public Copy(int star, int leng) { super(); this.star = star; this.leng = leng; } public void run() { RandomAccessFile read = null; RandomAccessFile write = null; read = new RandomAccessFile(new File("E:\ceshi.wmv"), "rw"); System.out.println(Thread.currentThread().getName() + "開始!!!"); write = new RandomAccessFile(new File("E:\aaa\bb\ceshi.wmv"), "rw"); read.seek(star); write.seek(star); byte[] bs = new byte[1024]; int num = 0; int readlength = 0; while (true) { if (leng - readlength < 1024) { read.read(bs, 0, leng - readlength); write.write(bs, 0, leng - readlength); break; } else { num = read.read(bs); write.write(bs, 0, num); readlength += num; } } System.out.println(Thread.currentThread().getName() + "完成~~~"); 

Java多線程

1、線程和進程

一、線程

注意:多線程。從宏觀角度同時執行了多個線程。

             從微觀角度同一時間只能執行一個線程

          多個線程是競爭關係,搶佔cpu資源,不然只能等待。

二、進程和線程的區別:

進程是應用程序,線程是一條執行路徑

    進程有獨立的內存空間,崩潰不會影響其餘程序,

    線程沒有獨立的空間,多個線程在同一個進程的空間,可能會影響其餘線程

    一個進程中,至少有一個線程

三、主線程子線程

主線程:main方法產生的線程,也叫做UI線程。

    子線程:除了主線程之外的,也叫工做線程。

四、建立線程的兩種方式

一、建立一個類繼承Thread 二、重寫run方法 三、建立線程對象 四、啓動線程 五、Thread.currentThread().getName(),哪一個線程調用,名字就是哪一個現成的名字 getName();super調用父類的getName(),被賦值誰的名字,就打印誰的名字 main方法: Test2 test=new Test2("一號窗口");test.start(); Test2 test2=new Test2("二號窗口");test2.start(); class Test2 extends Thread{ String name; int ticket=10; public Test2(String name) { super(name); this.name = name; } public void run() { while (true) { if (ticket>0) { ticket--; System.out.println(Thread.currentThread().getName()+"還剩下"+ticket); }else { break;} } } 共享資源操做相同 一、共享資源類實現Runable接口 二、重寫run方法 三、建立共享資源對象 四、建立線程對象,將共享資源對象添加到線程中 五、啓動線程 main方法: Test3 test3=new Test3(); Thread thread=new Thread(test3); Thread thread2=new Thread(test3); thread.start(); thread2.start(); class Test3 extends Thread{ String name; int ticket=10; public Test2(String name) { super(name); this.name = name; } public void run() { while (true) { if (ticket>0) { ticket--; System.out.println(Thread.currentThread().getName()+"還剩下"+ticket); }else { break;} } } 貢獻資源操做不相同 一、貢獻資源做爲一個單獨的類 二、由多個操做去實現Runable接口 三、把共享資源做爲多個操做類的屬性 四、建立線程對象,將共享資源對象添加到線程中 五、啓動線程 main方法: Card card=new Card(); Boyfriend boyfriend=new Boyfriend(card); Girlfriend girlfriend=new Girlfriend(card); Thread thread=new Thread(boyfriend); Thread thread2=new Thread(girlfriend); thread.start(); thread2.start(); class Card{ double money; } class Boyfriend implements Runnable{ Card card; public Boyfriend(Card card){ this.card=card; } @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 5; i++) { card.money+=500; System.out.println(Thread.currentThread().getName()+"存500-剩餘金額"+card.money); } } } class Girlfriend implements Runnable{ Card card; public Girlfriend(Card card){ this.card=card; } @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 5; i++) { card.money-=500; System.out.println(Thread.currentThread().getName()+"取500,剩餘金額"+card.money); } } } 

五、run和start的區別

run沒有開闢新的棧空間,沒有新線程,都是主線程在執行

start開闢了新的棧空間,在新的棧空間啓動run()方法

六、線程的調度

setPriority();分配優先級,默認5,最低1,最高10 .join();插隊,阻塞指定的線程等到另外一個線程完成之後再繼續執行 .sleep();須要設置睡眠時間 .yield();禮讓,當執行到這個方法時,會讓出cpu時間,立馬變成可執行狀態 sleep和pield的區別: sleep yeild 線程進入被阻塞的狀態 線程轉入暫停執行的狀態 

(沒有其餘線程運行)等待指定的時間再運行 立刻恢復執行的狀態

其餘線程的執行機會是均等的   將優先級或更高的線程運行

七、打斷線程的終止方式

一、用標記,當終止線程時,會執行完run方法 二、stop()方法,不建議使用,會執行不到特定的代碼 三、interrupt(),只能中斷正在休眠的線程,經過拋異常的方法中斷線程的終止。 InputStream inputStream=System.in; int m=inputStream.read(); myThread2.interrupt();//經過外界輸入打斷 

八、線程是五種狀態

新建    就緒   執行   死亡  阻塞

2、同步

發生在兩個以兩個以上的線程中

解決代碼的重複問題

優勢:提升了線程中數據的安全性

缺點:下降了執行效率

 一、同步代碼塊 synchronized(鎖){同步代碼塊} 注意:鎖分任意鎖和互斥鎖,鎖是對象,瑣是惟一的。 二、同步方法 public synchroinzed 返回值類型 方法名(){同步代碼} 三、在共享資源中: 線程操做相同,瑣是this synchronized (this) {// 同步代碼塊,包含同步代碼塊。任意鎖,互斥鎖。 if (ticket > 0) { System.out.println(Thread.currentThread().getName() + "---" + ticket--); } else { break; } } 線程操做不相同,瑣是共享資源對象 synchronized (card) { card.setMoney(card.getMoney() + 1000); System.out.println("Boy+1000---" + card.getMoney()); } 四、在同步方法中: 共享資源,線程操做相同,資源類中的鎖是this 共享資源,線程操做不相同,資源類中的鎖也是this public synchronized void input(){ money+=100; System.out.println("input+100----"+money); } 

五、在靜態方法中同步:懶漢式

同步代碼塊,瑣是類.class 同步方法,鎖也是類.class public static LazyInstance getInstance(){ if (instance==null) { synchronized (LazyInstance.class) { if (instance==null) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } instance=new LazyInstance(); } System.err.println(instance.hashCode()); } } return instance; } 

3、經典例子:生產者消費者

麪包類:class Bread{屬性和構造方法} 超市類:class Market{ Bread[] breads=new Bread[];//超市裏有面包數組 int index=-1;//一開始沒有面包,下標爲-1; public synchronized void sale(){ if(index<=-1){////若是沒有沒有面包,就等待添加 this.wait(); } ////若是有面包,就打印麪包信息 System.out.println("消費麪包"+breads[index].id+breads[index].name+breads[index].price); index--;//麪包減小一個 this.notify();喚醒添加線程 } public synchronized vide add(Bread bread){ if(index>=4){ this.wait(); } indenx++;//麪包下標+1,存入下一面包位置中 breads[index]=bread;//給數組中的麪包賦值 System.out.println("添加麪包"+breads[index].id+breads[index].name+breads[index].price); this.notify();//喚醒銷售線程 } 工廠類:實現Runnable接口: 將超市類做爲屬性 添加構造方法 重寫run方法,調用超市類add方法 顧客類:實現Runnable接口: 將超市類做爲屬性 添加構造方法 重寫run方法,調用超市類sale方法 

Java網絡編程

一、計算機網絡:

將多態計算機,經過網絡通訊鏈接到一塊兒,實現了資源的共享和信息的傳遞

二、計算機網絡的分類:

廣域網,城域網,局域網。

三、參考模型

四、tcp/ip協議

:tcp、udp、ip

五、tcp特色:

面向鏈接,數據安全可靠,效率偏低,傳輸數據大小無限制

六、 udp特色:

面向無鏈接,數據安全不可靠,執行效率高,數據大小不超過64kb

 注意:tcp和udp只是傳輸協議,只是設定了規範,真正傳輸的數據ip協議。

    ip協議:將數據從源傳遞到目的地

    ipv4:32位 ipv6:128位 ipconfig 查看ip相關信息 ping 查看指定ip或者地址能不能連通 

七、IP編程:

一、InetAddress,  沒有構造方法,只能經過本身的靜態方法建立對象

    二、getLocalHost(),   返回值是InetAddress,獲得本機的主機名和地址

    三、getByName(ip),    返回值是InetAddress,有參數,能夠寫ip,網址,獲得指定的主機

    四、getHostAddress(), 獲得主機的地址

    五、getHostName(),    獲得指定的主機名

八、TCP編程

客戶端:

        一、建立socket對象,指定ip地址和端口號 二、須要從socket中獲得OutputStream 聊天配合字符流輸入流使用,直接轉換輸入輸出便可 文件配合字節流使用,字節流讀,socket輸出。 三、將想要發送的數據寫入到OutputStream中。flush 四、關閉流關閉socket 服務器: 一、建立ServerSocket對象,指定端口號 二、serversocket.accep(),返回一個Socket對象(客戶端發過來的socket) 接收客戶端發送的數據,若是沒有接收到,阻塞程序的運行 三、從Socket中獲得InputStream流,將數據從流中讀取出來 聊天配合字符輸出流使用。 文件配合字節輸出流使用,socket讀,字節流輸出。 四、展現/寫入到另外的地方 五、關閉流,關閉Socket 聊天: 聊天客戶端: Socket socket=new Socket("127.0.0.1", 65499); OutputStream outputStream=socket.getOutputStream(); BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(outputStream)); InputStream inputStream=socket.getInputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); Scanner scanner=new Scanner(System.in); while (true) { System.out.println("客戶端:"); String string=scanner.next(); bufferedWriter.write(string); bufferedWriter.newLine(); bufferedWriter.flush(); if (string.equals("拜拜")) { break; } //接收數據 String string2=null; string2=bufferedReader.readLine() ; System.out.println("服務器回覆:"+string2); } //關閉流和socket 聊天服務器: ServerSocket serverSocket=new ServerSocket(65499); System.out.println("服務器等待中。。。"); Socket socket=serverSocket.accept(); InputStream inputStream=socket.getInputStream(); Scanner scanner=new Scanner(System.in); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); OutputStream outputStream=socket.getOutputStream(); BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(outputStream)); String string=null; while (true) { string=bufferedReader.readLine(); System.out.println("客戶端說"+string); if (string.equals("拜拜")) { break; } System.out.println("服務器回覆:"); String string2=scanner.next(); bufferedWriter.write(string2); bufferedWriter.newLine(); bufferedWriter.flush(); } //關閉各類流和socket等 

九、UDP編程

客戶端:

        一、建立套接字對象,DatagramSocket,不須要指定端口號和地址 (聊天配合字符輸入流),文件配合字節輸入流 二、建立數據報包對象DatagramPacket,使用四個參數,指定數據,數據長度,地址,端口號。 三、send發放發送數據 四、關閉socket 服務器: 一、建立套接字對象DatagramSocket,指定端口號 二、建立數據報包對象DatagramPacket,用兩個參數的。指定數據和數據長度。 三、receice()接收數據,若是接受不到,阻塞程序。 四、根據數據報包進行一系列須要的操做 聊天: 客戶端: DatagramSocket datagramSocket=new DatagramSocket(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("客戶端--:"); String string2=bufferedReader.readLine(); DatagramPacket datagramPacket=new DatagramPacket(string2.getBytes(), string2.getBytes().length, InetAddress.getLocalHost(),65496); datagramSocket.send(datagramPacket); if (string2.equals("拜拜")) { break; } byte []buf=new byte[1024]; DatagramPacket datagramPacket2=new DatagramPacket(buf, buf.length); datagramSocket.receive(datagramPacket2); String string=new String(datagramPacket2.getData(), 0, datagramPacket2.getLength()); System.out.println("服務器--"+string); } 服務器: DatagramSocket datagramSocket = new DatagramSocket(65496); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("客戶端已準備"); byte[] buf = new byte[1024]; while (true) { DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); datagramSocket.receive(datagramPacket); String string = new String(datagramPacket.getData(), 0, datagramPacket.getLength()); if (string.equals("拜拜")) { break; } System.out.println("我說~~"+string); //回覆數據 System.out.println("你說~~:"); String string3 = bufferedReader.readLine(); DatagramPacket datagramPacket2 = new DatagramPacket(string3.getBytes(), string3.getBytes().length, InetAddress.getLocalHost(), datagramPacket.getPort()); if (string3.equals("拜拜")) { break; } datagramSocket.send(datagramPacket2); } 

反射機制

一、反射: 反射是將類中的屬性,方法,構造方法等解剖成一個個小的對象,而且可以調用 二、爲何使用反射: 在一個類中,能夠建立另一個類的對象,調用其的屬性和方法,不管那個類是否被建立了。 三、如何使用反射: 類 Class class=Class.forName(包名.類名),每個類都有惟一的一個類對象,這個類對象能夠的獲得類中的全部信息。 構造方法 class.getConstructor(null); 獲得無參構造方法,返回Constructor class.getConstructor(String.clss,int.class);獲得有參構造方法,返回Constructor constructor2.newInstance("曹菜菜",21); 返回Object類型的對象 class.getConstructors(); 獲得全部構造方法,返回Constructor[]數組 方法 getMethod(); 獲得普通的方法,返回Method,指定方法名 class1.getMethod("eat", null); 無參、無返回值、非私有的方法。 class1.getMethod("play", String.class); 有參、無返回值。非私有方法。參數一,方法名。參數二,參數類型.class method(n).invoke(object,null); 方法的執行,參數一是對象,參數二是傳的參數值。 getMethods(); 獲得子類和父類全部普通的方法,返回Method[]數組 class1.getDeclaredMethod("sleep", null);獲得私有的方法 method6.setAccessible(true); class1.getDeclaredMethods(); 獲得本身類的全部方法,包括私有的,返回Method[] 屬性 getFields(); 獲得public全部屬性,返回Field[] getFileld("name"); 獲得public屬性,返回Field,指定屬性名 field3.set(object5, "菜菜"); Object object6 = field3.get(object5); getDeclareFields(); 獲得全部屬性,包括私有的,返回Field[] getDeclareField(); 獲得屬性,包括私有的,指定屬性名,返回Field 四、反射的優勢 一、提升了java程序的靈活性和擴展性,下降了耦合性,提升了自適應的能力 二、容許程序建立和控制任何類的對象,無需提早編碼目標類 五、反射的缺點 一、性能問題 二、代碼維護問題 

HTML& SQLite

1、HTML

標籤:

    換行<br>、段落<p>、超連接<a href="網址">、圖片 刪除線<del>、下劃線<u>、加粗<b>、傾斜<i>、標題<h1-h6>、文字樣式<font size color> 橫線<hr size width color>、空格&nbsp、 有序列表<ol> <li> </li></ol> 無序列表<ul> <li> </li></ul> 多個列表嵌套<ol><li> <ol><li></li></ol> </li></ol> 

錨點:

<a name="a"><img src=""/></a> <a href="#a">超連接</a> 

form表單:

文本按鈕多選等:<input type="" name=""/> 下拉列表:<select><option>內容</option></select> 多行文本:<textarea conslpan="" rowspan=""></textarea> 表格: <table><tr><td></td></tr></table>可設置跨列跨行 

CSS層疊樣式:

<style> 標籤選擇器:標籤名{} id選擇器:#選擇器的名字 id="#名" 類選擇器:.選擇器的名字 class=".名字" </style> 

JS:

在head標籤中寫,頁面上想要動態的去展現或操做頁面的時候

2、SQLite

固定語句:

    Class.forName("org.sqlite.JDBC");加載驅動 Connection connection=DriverManager.getConnection("jdbc:sqlite:/e:/SQLite/day0919-1.db");建立鏈接 Statement statement=connection.createStatement();建立執行sql語句的對象 一、建立表 create table [if not exists] tablename(_id integer primary key autoincrement,name vachar(15)....); 二、追加列 alter table tablename add 字段名 integer 三、插入數據 insert into tablename(id,name...)values(1,'aa'); 四、查詢數據 select * from tablename where name='aa'; 五、修改數據 update tablename set name='aa' where name='aa'; 六、刪除數據 delete from tablename where name='aa' 七、模糊查詢 select * from tablename where name like '%aa%'; 八、升序 select * from employees order by id ; 九、降序 select * from employees order by id desc; 十、多字段 select * from employees order by department_id desc,salary asc; 十一、and or 執行語句: statement 用於查詢(executequery)刪除(executeupdate)修改(executeupdate) preparastatement 用於插入(executeupdate) 注意:insert into tablename(id,name...)values(?,?,?...); preparedStatement.setString(1, id);//用佔位符的時候須要prepareStatement設置 

Servlet

一、瀏覽器和服務器的交互 請求/響應式交互 1>瀏覽器先發送請求給服務器 2>指定的servlet去接收 (根據method屬性值若是是post則調用doPost,若是不是則 調用doGet) 3>在servlet中動態的執行邏輯代碼,也能夠動態給瀏覽器發送數據 4>服務器響應瀏覽器的請求 二、C/S結構:客戶端/服務器 優點:充分利用兩端硬件的優點,提升了執行效率 劣勢:必須安裝客戶端軟件,維護客戶端的更新 三、B/S結構:瀏覽器/服務器 優點:操做簡單,不須要下載軟件。只須要網絡 劣勢:將全部的操做所有交給服務器處理,增長了服務器的壓力。 四、頁面跳轉: request.getRequestDispatcher("new.jsp").forward(request, response); 地址欄顯示servelet的名字?屬性名=屬性值&...,能夠將前一個網頁的值傳遞過去。 五、重定向: response.sendRedirect("new.jsp"); 地址欄中顯示指定頁面的值。不能傳遞數據。 六、request request.getParameter("useName");括號內寫的是輸入框的名字。 request.getParameterValues("hobby");複選框,返回數組。 requst.setAttribute(屬性的名字,屬性值) requst.getAttribute(屬性名字),在另外一個頁面中寫。 doGet() name = new String(name.getBytes("iso-8859-1"),"utf-8") doPost() 給requst設置統一的編碼格式 (要在獲得表單中內容以前調用) request.setCharacterEncoding("utf-8"); 七、response response.sendRedirect("new.jsp");地址欄中顯示的是 指定頁面的地址。 八、請求方式: get: 一、能夠緩存 二、請求保留在瀏覽器的歷史中 三、能夠收藏爲書籤 四、處理敏感數據時不能用 五、數據的長度有限制 六、數據在URL中對全部人可見 七、數據類型必須使用ASCII編碼。 八、安全性差 post: 一、不能夠緩存 二、請求不保留在瀏覽器的歷史中 三、不能夠收藏爲書籤 四、數據的長度無限制 五、數據在URL中不可見 六、數據類型無限制 七、安全在好 九、生命週期: http請求→解析請求→建立servlet實例→調用init()方法→調用service方法→輸出響應信息→響應 十、錯誤提示 404沒有找到頁面 500服務器發生錯誤,通常代碼有誤 200正確鏈接 

HttpClient& HttpURLConnection&OkHttpClient

1、HttpClient

一、get方法 一、建立對象 HttpClient client = new DefaultHttpClient(); 二、建立請求方式對象,參數是地址 HttpGet get = new HttpGet("path"); 三、客戶端發出請求,服務器進行響應 HttpResponse response = client.execute(get); 四、判斷是否成功,獲得狀態信息 if(response.getStatusLine().getStatusCode()==200){ 五、獲取數據,entity 獲得返回數據的"實體" HttpEntity entity = response.getEntity(); InputStream inputStream = entity.getContent(); // 經過entityUtils工具類能夠將 返回數據直接 格式化成 String字符串 String result = EntityUtils.toString(httpEntity); // 能夠將entity轉化成byte數組 (下載圖片) byte[] bs = EntityUtils.toByteArray(entity); 

二、post方法

一、建立httpclient對象 HttpClient client = new DefaultHttpClient(); 二、建立請求方式對象,參數是地址 HttpPost post = new HttpPost(path); 三、建立BasicNameValuePair對象 BasicNameValuePair pair = new BasicNameValuePair("useName", "李四"); 四、建立能夠盛放參數的對象 List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>(); 五、將參數封裝到 httpEntity中 HttpEntity entity = new UrlEncodedFormEntity(list); 六、將帶有參數的實體放入進httpPost中 post.setEntity(entity); 七、客戶端請求數據 ,服務器端做出相應 HttpResponse response = client.execute(post); 八、 判斷是否成功 if(response.getStatusLine().getStatusCode()==200){ HttpEntity entity2 = response.getEntity(); String result = EntityUtils.toString(entity2); 

2、HttpURLConnection

一、get方法 一、統一資源定位符 URL url=new URL(path); 二、打開鏈接,向下轉型 HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection(); 三、設置請求方式 httpURLConnection.setRequestMethod("GET"); 四、鏈接服務器,可寫可不寫 httpURLConnection.connect(); 五、接收數據,先判斷是否正確鏈接 if (httpURLConnection.getResponseCode()==200) { 六、從從httpURLConnection取得數據 InputStream inputStream=httpURLConnection.getInputStream(); 七、讀取數據等其餘操做 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream, "utf-8")); 二、post 一、統一資源定位符 URL url=new URL(path); 二、打開鏈接,向下轉型 HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection(); 三、設置請求方式 httpURLConnection.setRequestMethod("GET"); 四、設置post屬性 httpURLConnection.setDoOutput(true); httpURLConnection.setDoInput(true);、 五、設置傳遞的數據(輸出流) OutputStream outputStream=httpURLConnection.getOutputStream(); outputStream.write(string.getBytes()); outputStream.flush(); 六、判斷服務器響應碼 if(httpURLConnection.getResponseCode()==200){ 七、從httpURLConnection取得數據 InputStream inputStream=httpURLConnection.getInputStream(); 八、讀取數據等其餘操做 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream, "utf-8")); 

3、OkHttpClient

一、get方法 一、建立客戶端對象 OkHttpClient okHttpClient=new OkHttpClient(); 二、建立請求,使用構建起模式,經過本身的靜態內部類建立對象並賦值 Request request=new Request.Builder().url(path).build(); 三、經過客戶端發送請求,獲取響應 Response reponse=okHttpClient.newCall(request).execute(); 四、判斷是否成功 if(reponse.isSuccessful()){ //經過響應獲得響應的內容 String result=response.body().string();//字符串 byte[] bs=response.body().bytes();//byte數組(圖片,文件等)} 二、post方法 一、建立OkHttpCilent對象 OkHttpClient okHttpClient=new OkHttpClient(); 二、將post請求須要傳遞的參數放置到本身的對象中 RequestBody body=new FormBody.Builder().add("","").add("","").build(); 三、若是想要實現post請求,必須建立requst對象時,調用post方法 傳遞RequstBodyRequest request = new Request.Builder().url(path).post(body).build();調用post方法 證實是post請求 四、客戶端請求,服務端響應 Response response = client.newCall(request).execute(); 五、判斷是否成功 if(reponse.isSuccessful()){ //經過響應獲得響應的內容 String result=response.body().string();//字符串 } 

XML解析&JSON解析

1、XML解析

xml和html的區別:

                HTML            XML

    可擴展性            不具備擴展性  是元標記語言,可定義新的標籤

    側重點         如何顯示信息  如何結構化的描述信息

    語法要求   不要求標記的嵌套配對順序等    嚴格要求標記的嵌套配對順序等

    可讀性可維護性      難閱讀維護      結構清晰便於閱讀維護

    數據和顯示  內容描述和顯示方式融合一塊兒    內容描述和顯示方式相分離

    保值性     不具備保值性      具備保值性

一、xml:可拓展的標記語言。

xml的命名規範:   容許英文字母,數字,

        只容許字母和下劃線開頭,

        不能使用空格,區分大小寫,

        屬性值必須用""引發來,不能交叉使用。

二、解析:

Dom:先將整個文檔所有加載在內存中,而後以樹的結構去解析

        優勢:解析速度快

        缺點:浪費內存

    Sax:

根據結點去解析,不會將這個文檔所有加載內存中

區分文檔開始、標籤開始、數據、標籤結束、文檔結束

        缺點:不會記錄讀取到哪個標籤,須要本身標記

        SAXParserFactory factory=SAXParserFactory.newInstance(); SAXParser parser=factory.newSAXParser(); MyHandler myHandler=new MyHandler(); parser.parse("student2.xml",myHandler); List<Student> list=myHandler.result(); MyHandle List<Student> students=null; Student student=null; String tag=""; public List<Student> result(){ return students; } @Override public void startDocument() throws SAXException { students=new ArrayList<>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //qName當前解析的標籤 //開始標籤 tag=qName; if ("student".equals(qName)) { student=new Student(); //標籤內有多個屬性時 //int count=attributes.getLength(); //for (int i = 0; i < count; i++) { //String name=attributes.getQName(i); //String value=attributes.getValue(i); //if ("id".equals(name)) { //student.setId(Integer.parseInt(value)); //} //} //標籤內只要一個屬性時 student.setId(Integer.parseInt(attributes.getValue(0))); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub //遇到結束標籤進入 if ("student".equals(qName)) { students.add(student); } tag=""; } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub String count=new String(ch, start, length).trim(); if ("id".equals(tag)) { student.setId(Integer.parseInt(count)); }else if ("name".equals(tag)) { student.setName(tag); }else if ("age".equals(tag)) { student.setAge(Integer.parseInt(count)); }else if ("sex".equals(tag)) { student.setSex(count); } } Pull: 

android中的解析方式

解析數據的時候能夠記錄標籤

        一、獲得pull解析對象的工廠對象 XmlPullParseFactory factory=XmlPullParseFactory.newInatance(); 二、經過工廠對象獲得解析對象 XmlPullParse parse=factory.newPullParse(); 三、設置解析數據源 parse.setInput(new FileReader(".xml")); 四、設置解析文件中事件的狀態 int type=parse.getEventType(); 五、存放解析結果的集合 Lst<Student> student=null; 六、聲明解析對象 Student student=null; 七、判斷狀態,根據狀態取得數據。 if(type!=XmlPullParse.END_DOCUMENT){ switch(type){ case XmlPullParse.START_DOCUMENT: student=new ArrayList<>(); break; case XmlPullParse.START_TAG: if("student".queals(parser.getName())){ student=new Student(); }else if("id".equals(parse.getName())) String id=parse.nextInt(); student.setId(Integer.parseInt(id)); ...... } } 八、事件的狀態進行下一個 type=parse.next(); } 九、若標籤中有不少屬性 int count=parser.getAttributeCount(); for (int i = 0; i <count; i++) { String arrName=parser.getAttributeName(i); String arrValue=parser.getAttributeValue(i); if ("id".equals(arrName)) { student.setId(Integer.parseInt(arrValue)); } 

三、用途:結構化的保存信息,經過服務端和服務器交互使用的,設置配置信息。

2、JSON解析

一、JSON

一、對象 JSONObject jsonObject=new JSONObject(string); 二、數組 JSONArray jsonArray=new JSONArray(string); 三、對象裏對象 JSONObject jsonObject2=jsonObject.getJSONObject("dept"); 四、對象裏數組 JSONArray jsonArray=jsonObject.getJSONArray("persons"); 例子: String string="{persons:[{name:'zhangsan',age:20},{name:'lisi',age:21},{name:'wangwu',age:22}]}"; JSONObject jsonObject=new JSONObject(string); JSONArray jsonArray=jsonObject.getJSONArray("persons"); List<Person3> list=new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject2=jsonArray.getJSONObject(i); String name=jsonObject2.getString("name"); int age=jsonObject2.getInt("age"); Person3 person3=new Person3(name, age); list.add(person3); } for (Person3 person3 : list) { System.out.println(person3); } } } class Person3{ String name; int age; public Person3(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "person2 [name=" + name + ", age=" + age + "]"; } } 

二、Gson

Gson gson=new Gson(); Person6 person6=gson.fromJson(string, Person6.class); 例子: String string = "{no:1,name:'android',employees:[{name:'zhangsan',age:20},{name:'lisi',age:21},{name:'wangwu',age:22}]}"; Gson gson=new Gson(); Person6 person6=gson.fromJson(string, Person6.class); System.out.println(person6);、 } } class Person5{ @Override public String toString() { return "Person5 [name=" + name + ", age=" + age + "]"; } String name; int age; } class Person6 { int no; String name; ArrayList<Person5> employees; @Override public String toString() { return "Person6 [no=" + no + ", name=" + name + ", employees=" + employees + "]"; } 

三、FastJson

Person4 person4=JSON.parseObject(string, Person4.class); 例子: String string = "{no:1,name:'android',employees:[{name:'zhangsan',age:20},{name:'lisi',age:21},{name:'wangwu',age:22}]}"; Person4 person4=JSON.parseObject(string, Person4.class); System.out.println(person4); } } class Person3{ String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person3 [name=" + name + ", age=" + age + "]"; } } class Person4{ int no; String name; ArrayList<Person3> employees; public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ArrayList<Person3> getEmployees() { return employees; } public void setEmployees(ArrayList<Person3> employees) { this.employees = employees; } @Override public String toString() { return "Person4 [no=" + no + ", name=" + name + ", employees=" + employees + "]"; } }
做者:鵝鵝鵝曲項向天歌呀 連接:https://www.jianshu.com/p/eae86b35a500 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索