Javase基礎(二)

1.   Java API String

1.1.   什麼是API

Ÿ   API全名:Application Programming InterfaceAPI是應用程序編程接口,指一些預先定義好的類。

Ÿ   例如我們想要一臺電腦,並不需要自己生產每個零件,只要從各個廠商買到組裝電腦的零件就可以,然後根據說明書學會使用,將零件安裝在一起就得到了電腦。電腦就像是我們要的程序,而零件就是API,說明書就是幫助文檔。

1.2.   Java API

Ÿ   Java API就是Sun公司提供給我們使用的類,這些類將底層的實現封裝了起來,我們不需要關心這些類是如何實現的,只需要學習這些類如何使用。

Ÿ   我們可以通過查幫助文檔來了解Java提供的API如何使用

1.3.   Java中常用API

Ÿ   String

              對字符串進行操作通常我們使用String類,相關的還有StringBufferStringBuilder

Ÿ   集合類

              集合是一種容器,用來存取對象(CollectionMap)

Ÿ   包裝類

              Java定義了一組包裝類對基本數據類型進行了包裝(IntegerDoubleBoolean)

Ÿ   時間對象

              Java定義了一些類方便用戶對時間、日期進行處理(DateCalendar)

Ÿ   系統類

              Java定義了一些類針對系統進行操作(SystemRuntime)

Ÿ   IO

              Java定義了一些類對數據傳輸進行了封裝(輸入輸出流、File文件對象)

Ÿ   Socket

              Java定義了一些類方便用戶進行網絡編程(SocketDatagramSocket)

1.4.   String對象的存儲

Ÿ   字符串是常量,一旦創建不能被修改。

Ÿ   字符串在程序中經常使用,虛擬機會將其緩存在String池中。

Ÿ   瞭解 String s = “abc” String s = new String(“abc”) 的區別。

1.5.   String類的構造函數

Ÿ   String(byte[] bytes)

通過指定字節數組構建字符串。

Ÿ   String(byte[] bytes, int offset, int length)

通過指定字節數組、數組元素偏移量和元素個數構建字符串。

Ÿ   String(byte[] bytes, String charsetName)

通過指定字節數組和指定碼錶構建字符串。

Ÿ   String(byte[] bytes, int offset, int length, String charsetName)

通過指定字節數組、數組元素偏移量、元素個數和指定碼錶構建字符串。

Ÿ   String(char[] value)

通過指定字符數組構建字符串。

Ÿ   String(char[] value, int offset, int count)

通過指定字符數組、數組元素偏移量和元素個數構建字符串。

Ÿ   String(StringBuffer buffer)

通過指定StringBuffer構建字符串。

Ÿ   String(StringBuilder builder)

通過指定StringBuffer構建字符串。

1.6.   String類的常用方法

Ÿ   char charAt(int index)

查找指定位置的字符

Ÿ   int indexOf(String str)

判斷字符串出現的位置

Ÿ   int compareTo(String anotherString)

按字典順序比較兩個字符串

Ÿ   String substring(int beginIndex, int endIndex)

截取子字符串       

Ÿ   String[] split(String regex)

字符分割

Ÿ   String replace(CharSequence target, CharSequence replacement)

替換字符串

Ø         字符串練習

Ÿ   設計一個方法, 獲取一個已知文件名的擴展名.

Person.java的擴展名是.javaPerson.java.txt的擴展名是.txt

Ÿ   設計一個方法, 查找一個字符串中子字符串出現的所有位置.

“xxxabcxxxabcxxx”abc出現了2次,索引位置是39

Ÿ   查找一個字符串中出現最多的字符.

“hello world”L出現了3

Ÿ   設計方法,使用System.in.read()讀取一行.

循環讀取一個字節,讀取到\r\n結束。考慮中文問題

Ÿ   已知一個字符串. 設計一個方法, 可以從這個字符串中打印n個字節. 但不能打印出半個中文.

短信一次發送字節140個,如果超過140字節就會分爲兩條。這時如果第140個字節是中文的前半,那麼第一條短信應該發送139字節。

Ÿ   查找兩個字符串中最大相同子串.

“abc”“bcd”的最大相同子串是”bc”

“xyzabcdefxyz”“xxxabcdefooo”的最大相同子串是”abcdef”

2.   集合類

2.1.   集合概念

Ø         爲什麼出現集合類?

Ÿ   在面向對象的編程思想中,都是以對象的形式對事物進行描述的,爲了保證對象的生命週期,我們需要持有對象

Ÿ   在很多情況下,我們不知道在程序中需要創建多少個對象,這時就不能依靠定義引用對象的變量來持有每一個對象

Ÿ   存儲對象的容器就能幫我們解決這樣的問題,而集合便是這樣的容器

Ø         數組和集合類的區別

Ÿ   數組和集合類都是容器,都能存儲對象

Ÿ   集合類的優勢就在於長度可變

Ø         集合類的特點

Ÿ   集合類可用於存儲對象

Ÿ   集合類的長度可變

Ÿ   一個集合可以存儲多種類型的對象

2.2.   集合接口

Ø         Collection接口

Ÿ   一個獨立的元素的序列,這些元素服從一條或多條規則

Ÿ   Collection接口下主要分爲List集合和Set集合

Ÿ   List集合的特點是元素有序、允許有重複元素

Ÿ   Set集合的特點是元素無存儲順序、不允許有重複元素

Ø         Map接口

Ÿ   一組成對的鍵值對對象,允許根據鍵來查找值

Ÿ   Map集合的鍵不允許有重複,所以Map的所有鍵構成了一個Set集合

Ÿ   主要學習HashMapTreeMap

Ø         Iterable接口

Ÿ   JDK1.5新定義的接口作爲Collection的父接口

Ÿ   主要爲了實現增強for循環

2.3.   List

Ø         List特點

Ÿ   元素有序,可重複。

Ÿ   我們主要學習三種:ArrayListVectorLinkedList

Ÿ   這三種都是List接口的實現類,使用上完全一樣,只是實現原理不同,效率不同。

Ø         ArrayList

Ÿ   底層數組實現

Ÿ   查找快,增刪慢

Ÿ   線程不安全

Ø         Vector

Ÿ   ArrayList基本一樣

Ÿ   線程安全(線程同步),效率低

Ø         LinkedList

Ÿ   底層鏈表實現

Ÿ   增刪塊,查找慢

Ø         存取元素

Ÿ   List集合元素存取方法一致

Ÿ   使用add()方法增加元素

Ÿ   由於List集合有序,可以使用get()方法獲取元素

Ÿ   元素的迭代(Iterator)

通過集合對象的iterator()方法獲得迭代器Iterator

通過Iterator迭代器的hasNext()方法判斷是否存在下一個元素

通過Iterator迭代器的next()方法獲取下一個元素

Ÿ   元素的迭代(Enumeration)

迭代Vector集合中的元素可以使用Enumeration

通過EnumerationhasMoreElements()方法判斷是否還有元素

通過EnumerationnextElement()方法返回下一個元素

2.4.   JDK5新特性

Ø         泛型

Ÿ   由於集合可以存儲不同類型的數據,所以取元素時有可能會導致類型轉換錯誤

Ÿ   JDK1.5增加了新特性泛型,爲了減少操作集合時出錯的機率

Ÿ   集合一旦聲明瞭泛型,便只能存儲同一類型的對象了

Ÿ   使用方法:ArrayList<Person> al = new ArrayList<Person>();

Ÿ   使用泛型的好處

提高了程序的安全性

將運行期遇到的問題轉移到了編譯期

省去了類型強轉的麻煩

泛型類的出現優化了程序設計

Ø         增強for循環

Ÿ   新接口Iterable中定義了增強for循環

Ÿ   可以通過增強for循環對數組和集合進行遍歷

Ÿ   語法:for(類型 變量名 :  要遍歷的容器) { …… }

Ø         可變參數

Ÿ   有的時候在設計方法時無法確定將來別人會傳入的參數個數

Ÿ   JDK1.5增加了新特性可變參數,在函數中只聲明參數類型,不規定個數

Ÿ   方法接受的參數實際上是一個數組,可以在方法中遍歷數組

Ÿ   可變參數只能被定義爲函數的最後一個形參

Ÿ   語法格式: 返回值 函數名(參數類型形參名)

2.5.   Set

Ø         Set集合無序,不允許有重複元素

Ÿ   Set集合通過存入對象的equals方法來保證集合中沒有重複元素

Ø         HashSet

Ÿ   HashSetSet的子類,因此也沒有重複元素

Ÿ   底層使用哈希算法保證沒有重複元素

Ÿ   存儲對象時,先調用對象的hashCode()方法計算一個哈希值,在集合中查找是否有哈希值相同的對象。

如果沒有哈希值相同的對象,直接存入。

如果有哈希值相同的對象,則和哈希值相同的對象進行equals()方法比較。

equals()方法比較結果相同則不存,不同就存入。

Ÿ   HashSet集合裏存儲的對象必須正確重寫hashCodeequals方法

Ø         TreeSet

Ÿ   TreeSet集合通過二叉樹算法保證無重複元素,並對元素進行排序

Ÿ   在使用TreeSet時必須指定比較的算法,指定的方式有兩種:

自然順序:將要存儲的類實現Comparable接口,重寫compareTo方法,在方法中指定算法

比較器順序:在創建TreeSet時,傳入一個比較器Comparator,在比較器的compare方法中指定算法

2.6.   Map

Ø         Map集合的特點

Ÿ   Map存儲了一系列鍵值的映射關係

Ÿ   Map集合需要保證鍵的唯一性

Ÿ   可以通過鍵獲得值,反之則不能

Ÿ   Map集合存儲元素使用put(key,value)方法

Ø         Map集合的兩種遍歷方式

Ÿ   通過keySet方法返回由鍵組成的集合,迭代該集合的元素就拿到了所有的鍵,再調用get方法根據鍵拿到值

Ÿ   通過entrySet方法返回鍵值映射關係組成的集合,迭代該集合就拿到了一個個的鍵值映射關係,通過getKey方法拿到鍵,通過getValue方法拿到值。

Ø         HashMap

Ÿ   線程不安全,存取速度快,允許存放null鍵,null值。

Ÿ   通過HashSet原理保證鍵唯一性

Ø         Hashtable

Ÿ   線程安全,速度慢,不允許存放null鍵,null值,已被HashMap替代。

Ø         TreeMap

Ÿ   通過二叉樹算法保證鍵唯一性

Ÿ   對鍵進行排序,排序原理與TreeSet相同。

Ø         Properties

Ÿ   HashTable的子類,所以也是線程安全的

Ÿ   用於讀寫配置文件的,一般配置項等號兩邊都是String,所以該集合中的兩列保存的都是String類型的數據

Ÿ   這個集合中只能存String,所以不需要定義泛型。

3.   其他常用類

3.1.   工具類

Ø         Arrays

Ÿ   工具類,提供了對數組的常用操作

Ÿ   將數組轉成List集合

Ÿ   對數組進行排序

Ÿ   對數組進行二分查找

Ÿ   將數組轉爲字符串顯示形式

Ø         Collections

Ÿ   工具類,提供了對集合的常用操作

Ÿ   對集合進行查找

Ÿ   取出集合中的最大值,最小值

Ÿ   List集合進行排序

3.2.   包裝類

Ø         JDK提供了對所有數據類型的包裝類

Ÿ   byte           >>>        Byte

Ÿ   short          >>>        Short

Ÿ   int             >>>        Integer

Ÿ   long          >>>        Long

Ÿ   double       >>>        Double

Ÿ   float          >>>        Float

Ÿ   char           >>>        Character

Ÿ   boolean      >>>        Boolean

Ø         包裝類的常用方法

Ÿ   toString方法

Ÿ   parseInt方法:Integer.parseInt(String s)

Ÿ   valueOf方法:Double.valueOf(String s)

3.3.   系統類

Ø         System

Ÿ   靜態屬性in爲標準輸入流,屬於InputStream類型,read方法返回一個字節

Ÿ   靜態屬性out爲標準打印流,屬於PrintStream類型,print方法打印字符

Ÿ   可以用set方法修改屬性inout

Ÿ   System.exit()方法退出Java虛擬機

Ÿ   System.gc()垃圾回收

Ÿ   System.getProperties()方法獲得系統屬性

Ø         Runtime

Ÿ   表示系統運行時狀態

Ÿ   exec方法執行命令

3.4.   時間類

Ø         Date

Ÿ   使用new Date()創建時間對象代表當前系統時間

Ÿ   需要使用DateFormat類來進行格式化,才能顯示想符合習慣的格式

Ø         Calendar

Ÿ   使用該類對時間進行操作比較方便

Ÿ   通過常量來表示時間的各種值,如一年中的某一天,一個月的某一天等

Ÿ   將對應的常量作爲形參來調用相應的getaddset方法來操作對象

Ø         練習

Ÿ   計算出某一年的二月份有多少天?

Ÿ   設計一個方法可以計算工作時間,接收一個參數(工作日),方法打印出哪天完工。

4.   IO(Input Output)

4.1.   IO流概念

Ÿ   IO流用來處理設備之間的數據傳輸

Ÿ   Java對數據的操作是通過流的方式

Ÿ   Java用於操作流的對象都在IO包中

Ÿ   流按操作對象分爲兩種:字節流與字符流。  字節流可以操作任何數據,字符流只能操作純字符數據比較方便。

Ÿ   流按流向分爲:輸入流,輸出流。

4.2.   IO流常用基類

Ø         字節流的抽象基類:

Ÿ   InputStream OutputStream

Ø         字符流的抽象基類:

Ÿ   Reader Writer

Ø         由這四個類派生出來的子類名稱都是以其父類名作爲子類名的後綴。

Ÿ   如:InputStream的子類FileInputStream

Ÿ   如:Reader的子類FileReader

Ÿ   InputStreamReaderReader的子類

4.3.   IO程序書寫

Ÿ   使用前,導入IO包中的類

Ÿ   使用時,進行IO異常處理

Ÿ   使用後,釋放資源

4.4.   字符流讀寫文件

Ø         讀取文件

Ÿ   定義字符流關聯指定文件

FileReader reader = new FileReader("Test.txt");

Ÿ   讀取一個字符,返回int,該字符的碼錶值

int ch = reader.read();

Ÿ   關閉流,釋放資源

reader.close();

Ø         寫出文件

Ÿ   定義字符輸出流關聯指定文件

FileWriter writer = new FileWriter("Test.txt");

Ÿ   寫出一個字符,接收int碼錶值

writer.write(97);

Ÿ   關閉流,釋放資源

writer.close();

Ø         注意事項

Ÿ   文件路徑

定義文件路徑時Windows中的目錄符號爲“\”,但這個符號在Java中是特殊字符,需要轉義。

       可以用“\\”或“/”表示。

Ÿ   讀取文件

讀取文件時必須保證文件存在,否則將拋出FileNotFoundException

Ÿ   寫出文件

寫出時文件如不存在時程序會創建新文件,如文件已存在則會清空原文件內容重新寫入。

如需追加內容可調用FileWriter構造函數FileWriter(String fileName, boolean append)

Ÿ   練習

拷貝一個文件

4.5.   字符流緩衝區讀寫

Ø         自定義緩衝區讀寫

Ÿ   爲什麼定義緩衝區

由於單個字符讀寫需要頻繁操作文件,所以效率非常低。

我們可以定義緩衝區將要讀取或寫出的數據緩存,減少操作文件次數。

Ÿ   緩衝區讀取

先定義一個數組,然後調用FileReader讀取一個數組的方法。

int read(char[] cbuf)

Ÿ   緩衝區寫出

將要寫出的數據存放在數組中,調用FileWriter方法,一次寫出一個數組。

void write(char[] cbuf, int off, int len)

Ø         內置緩衝區的BufferedReaderBufferedWriter

Ÿ   Java提供了帶緩衝功能的ReaderWriter類:BufferedReaderBufferedWriter

Ÿ   這兩個類都是提供包裝功能,需要提供其他流來使用,給其他流增加緩衝功能

Ÿ   當我們調用BufferedReader讀取數據時,程序會從文件中一次讀取8192個字符用來緩衝

Ÿ   當我們調用BufferedWriter寫出數據時,程序會先將數據寫出到緩衝數組,直到寫滿8192個才一次性刷出到文件

4.6.   裝飾設計模式(Decorator

Ø         什麼情況下使用裝飾設計模式

當我們需要對一個類的功能進行改進、增強的時候

Ø         裝飾模式的基本格式。

含有被裝飾類的引用

通過構造函數傳入被裝飾類對象

和被裝飾類含有同樣的方法,其中調用被裝飾類的方法,對其進行改進、增強

和被裝飾類繼承同一個類或實現同一個接口,可以當做被裝飾類來使用

Ø         瞭解BufferedReaderBufferedWriter的原理。

BufferedReaderBufferedWriter都是裝飾類,他們可以裝飾一個ReaderWriter,給被裝飾的ReaderWriter提供緩衝的功能。

就像我們用BufferedReaderBufferedWriter裝飾FileReaderFileWriter,使用的讀寫功能還是FileReaderFileWriter的,但給這兩個類的讀寫添加了緩衝功能。

Ø         練習

Ÿ   模擬一個BufferedReader類。

Ÿ   模擬一個LineNumberReader類。

4.7.   字節流

Ÿ   基本操作與字符流相同

Ÿ   字節流可以操作任意類型數據

Ÿ   練習:拷貝一個Jpg文件

4.8.   字節流緩衝區讀寫

Ø         自定義緩衝區讀寫

Ÿ   原理和字符流相同,都是爲了提高效率

Ÿ   定義數組緩衝數據,一次讀取一個數組,一次寫出一個數組,減少操作文件的次數

Ø         BufferedInputStreamBufferedOutputStream

Ÿ   BufferedReaderBufferedWriter原理相同,都是包裝類

Ÿ   BufferedInputStreamBufferedOutputStream包裝InputStreamOutputStream提供緩衝功能

4.9.   轉換流

Ÿ   字符流與字節流之間的橋樑

Ÿ   方便了字符流與字節流之間的操作

Ÿ   字節流中的數據都是字符時,轉成字符流操作更高效

Ÿ   練習:轉換System.in

4.10.       標準輸入輸出流

Ÿ   System類中的成員變量:inout

Ÿ   它們各代表了系統標準的輸入和輸出設備。

Ÿ   默認輸入設備是鍵盤,輸出設備是顯示器。

Ÿ   System.in的類型是InputStream.

Ÿ   System.out的類型是PrintStreamOutputStream的子類FilterOutputStream 的子類.

Ÿ   練習:通過修改標準輸入輸出流,使用System.inSystem.out拷貝文件

4.11.       流基本應用小節

Ÿ   流是用來處理數據的。

Ÿ   處理數據時,一定要先明確數據源,或者數據目的地

Ÿ   數據源可以是文件,可以是鍵盤或者其他設備。

Ÿ   數據目的地可以是文件、顯示器或者其他設備。

Ÿ   而流只是在幫助數據進行傳輸,並對傳輸的數據進行處理,比如過濾處理、轉換處理等。

 

 

字符流

Reader

Writer

InputStreamReader

OutputStreamWriter

FileReader

FileWriter

BufferedReader

BufferedWriter

 

 

 

FileInputStream

字節流

FilterInputStream

FilterOutputStream

BufferedInputStream

BufferedOutputStream

InputStream

OutputStream

FileOutputStream

4.12.       File

Ÿ   用來將文件或者文件夾路徑封裝成對象

Ÿ   方便對文件與文件夾進行操作。

Ÿ   File對象可以作爲參數傳遞給流的構造函數。

Ÿ   瞭解File類中的常用方法。

4.13.       遞歸

Ÿ   函數自己調用自己。

Ÿ   注意:遞歸時一定要明確結束條件。

Ÿ   應用場景:

當某一功能要重複使用時。

Ÿ   練習:

列出一個文件夾下所有的子文件夾以及子文件

Ÿ   思考:

刪除一個目錄的過程是如何進行的?

複製一個目錄的過程呢?

4.14.       IO包中的其他類

Ÿ   序列流

SequenceInputStream

可以將多個字節輸入流整合成一個流,在使用這個流讀取的時候,讀到第一個流的末尾時繼續讀第二個,第二個讀到末尾則繼續讀第三個,以此類推,直到讀到最後一個流的末尾返回-1

Ÿ   打印流

PrintStream PrintWriter

       相比普通的OutputStreamWriter增加了print()println()方法,這兩個方法可以輸出實參的toString()方法的返回值

       這兩個類還提供自動flush()的功能

Ÿ   操作對象

ObjectOutputStream

       可以將實現了Serializable的接口的對象轉成字節寫出到流中

ObjectInputStream

       可以從流中讀取一個ObjectOutputStream流寫出的對象

Ÿ   操作內存緩衝數組

ByteArrayOutputStream 寫出到字節數組(內存)中,可以獲取寫出的內容裝入一個字節數組。通常我們用這個流來緩衝數據。

ByteArrayInputStream:可以從一個字節數組中讀取字節。

CharArrayWriter:寫出字符到字符數組(內存)中,可以獲取寫出的內容裝入一個字符數組。

CharArrayReader:可以從一個字符數組中讀取字符。

Ÿ   管道流

PipedInputStream:管道輸入流,可以從管道輸出流中讀取數據

PipedOutputStream:管道輸出流,可以向管道輸入流中寫出數據

Ÿ   操作基本數據類型

DataInputStreamDataOutputStream

       可以按照基本數據類型佔用空間大小讀寫數據

Ÿ   隨機訪問文件

RandomAccessFile

5.   多線程

5.1.   多線程概念

Ø         線程與進程

Ÿ   進程就是一個運行中的程序。

Ÿ   一個進程中可以有多個線程,線程是CPU調度和分派的基本單位。我們可以理解爲線程就是程序運行中的一條路徑。

Ø         多線程存在的意義

Ÿ   允許多個線程併發執行,提高程序運行效率。

Ÿ   例如:迅雷多線程下載,QQ多個人同時聊天,凌波多個人同時共享屏幕。

5.2.   線程的使用

Ø         創建線程有兩種方式

Ÿ   自定義一個類繼承Thread類,將線程要做的事寫在run()方法中,由於子類可以當父類來用,創建自定義子類對象就是創建了一個線程。

Ÿ   自定義一個類實現Runnable接口,將要做的事寫在run()方法中。創建Thread對象時在構造函數中傳入Runnable實現類對象。

Ø         線程的啓動

Ÿ   兩種創建方式都是調用Thread對象的start()方法。

Ÿ   當調用start()方法時,CPU會開啓一條新線程,並在新線程上執行run()方法。

Ø         線程常用方法

Ÿ   currentThread

靜態方法,用來獲取當前線程

Ÿ   getNamesetName

用來獲取、設置當前線程的名字

Ÿ   sleep

控制線程休眠,單位爲毫秒

Ÿ   setDeamon

將線程設置爲守護線程。線程默認是非守護線程,守護線程不能單獨執行。

Ÿ   join

當前線程暫停,等待加入的線程運行結束,當前線程繼續執行。

5.3.   多線程同步

Ø         線程安全問題

Ÿ   多線程併發訪問同一數據,有可能出現線程安全問題。

Ÿ   一條線程的訪問還沒有結束,CPU切換到另一條線程工作,導致數據訪問出錯。

Ø         使用同步解決線程安全問題

Ÿ   使用同步代碼塊synchronized(鎖對象){需要同步的代碼...}形式將訪問數據的代碼鎖住,在同步代碼塊中的內容同一時間內只能一個線程執行。

Ÿ   使用同步方法,用synchronized修飾方法,整個方法的代碼都是同步的,只能一個線程運行。同步方法使用this作爲鎖。

Ø         死鎖

Ÿ   在多個線程併發執行使用多個鎖來同步時,有可能互相沖突,導致程序無法繼續執行。

Ø         同步的優點與缺點

Ÿ   同步可以解決多個線程同時訪問一個共享數據的問題,只要加上同一個鎖,在同一時間內只能有一條線程執行。

Ÿ   在執行同步代碼時每次都會判斷鎖,非常消耗資源,效率較低。

5.4.   多線程通信

Ÿ   在同步代碼中可以使用鎖對象的wait()方法讓當前線程等待

Ÿ   使用鎖對象的notify()方法可以將正在等待的線程喚醒

Ÿ   如果多個線程都在等待,notify()喚醒隨機1

Ÿ   notifyAll()方法可以喚醒所有在等待的線程

5.5.   JDK5之後的線程同步與通信

Ø         同步

Ÿ   使用java.util.concurrent.locks.Lock接口的實現類對象來進行同步

Ÿ   ReentrantLock就是Lock的實現類,可以實現synchronized的功能

Ÿ   在需要同步的代碼塊前後使用lock()unlock()方法來完成同步

Ÿ   unlock()最好放在finally中,因爲如果上面代碼拋出異常沒有解鎖的話,會導致其他線程無法運行,程序卡死。

Ø         通信

Ÿ   使用Lock對象的newCondition()方法獲取一個Condition對象,Condition對象可以控制指定線程的等待與喚醒。

Ÿ   await()方法可以控制線程等待。

Ÿ   signal()方法可以喚醒等待的線程。

Ÿ   signalAll()方法可以喚醒所有等待線程。

6.   GUI

6.1.   GUI概念

Ø         什麼是GUI

Ÿ   GUIGraphical User Interface的縮寫,圖形化用戶界面

Ø         awtswing

Ÿ   JavaGUI提供的對象都存在java.awtjavax.swing兩個包中

Ÿ   awt依賴於本地系統平臺,如顏色樣式顯示

Ÿ   swing跨平臺

Ø         組件與容器

Ÿ   組件 Component,是GUI圖形界面的組成單元。

Ÿ   容器Container,可以存放組件,也可以存放容器。

6.2.   佈局管理

Ø         FlowLayout(流式佈局管理器)

Ÿ   從左到右的順序排列。

Ø         BorderLayout(邊界佈局管理器)

Ÿ   東,南,西,北,中

Ø         GridLayout(網格佈局管理器)

Ÿ   規則的矩陣

Ø         CardLayout(卡片佈局管理器)

Ÿ   選項卡

Ø         GridBagLayout(網格包佈局管理器)

Ÿ   非規則的矩陣

6.3.   建立一個窗體

Ÿ   窗體中可以存放各種組件,所以窗體是容器Container。創建時我們使用的是它的子類

Ÿ   Container的常用子類有兩個,WindowPanelWindow是我們常用的窗體,Panel是用來佈局的不可見的。

Ÿ   Window也有兩個常用子類,FrameDialogFrame是我們常用的帶有標題和邊框的頂層窗口,Dialog是對話框。

Ÿ   所有AWT包中的類都會運行在AWT線程上

6.4.   事件處理

Ø         事件處理機制

Ÿ   事件:用戶對組件的一個操作。

Ÿ   事件源:發生事件的組件。

Ÿ   監聽器:我們需要處理某個事件,就需要在發生事件的組件上添加監聽器,也就是java.awt.event包中XxxListener接口的子類。

Ÿ   事件處理器:監聽器中的方法。監聽器被添加在組件上之後,組件上發生了對應事件就會執行指定方法。

Ø         常用事件分類

Ÿ   窗體事件,WindowEvent,窗體打開、關閉、正在關閉、激活、最小化等。

Ÿ   鼠標事件,MouseEvent,鼠標按下、擡起、進入、移出等。

Ÿ   鍵盤事件,KeyEvent,鍵盤按下、擡起等。

Ÿ   動作事件,ActionEvent,在某一組件上發生了定義好的動作,例如按鈕上鼠標點擊或按空格,菜單上鼠標點擊或按回車等。

7.   Socket網絡編程

7.1.   網絡編程概念

Ø         IP地址

Ÿ   每臺網絡終端在網絡中都有一個獨立的地址,我們在網絡中傳輸數據就是使用這個地址。

Ÿ   ipconfig:查看本機IP

Ÿ   ping:測試連接

Ÿ   本地迴路地址:127.0.0.1

Ÿ   IPv44個字節組成,40-255。大概42億,30億都在北美,亞洲4億。已經用盡。 

Ÿ   IPv68組,每組416進制數。

1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f

1a2b::aaaa:0000:0000:0000:aabb:1f2f

1a2b:0000:aaaa::aabb:1f2f

1a2b:0000:aaaa::0000:aabb:1f2f

1a2b:0000:aaaa:0000::aabb:1f2f

Ø         端口號

Ÿ   每個網絡程序都需要綁定一個端口號,傳輸數據的時候除了確定發到哪臺機器上,還要明確發到哪個程序。

Ÿ   端口號範圍從0-65535

Ÿ   編寫網絡應用就需要綁定一個端口號,儘量使用1024以上的,1024以下的基本上都被系統程序佔用了。

Ÿ   常用端口

mysql: 3306

oracle: 1521

web: 80

tomcat: 8080

QQ: 4000

feiQ: 2425

Ø         網絡協議

Ÿ   計算機網絡中進行數據交換而建立的規則、標準或約定的集合。

Ÿ   UDP

面向無連接,數據不安全,速度快。不區分客戶端與服務端。

Ÿ   TCP

面向連接(三次握手),數據安全,速度略低。分爲客戶端和服務端。

Ø         Socket

Ÿ   通信的兩端都有Socket

Ÿ   網絡通信其實就是Socket間的通信。

Ÿ   數據在兩個Socket間通過IO傳輸。

Ÿ   Socket在應用程序中創建,通過一種綁定機制與驅動程序建立關係,告訴自己所對應的IPport

7.2.   UDP傳輸

Ø         發送

Ÿ   創建DatagramSocket

Ÿ   創建DatagramPacket

Ÿ   使用DatagramSocket發送DatagramPacket

Ÿ   關閉DatagramSocket

Ø         接收

Ÿ   創建DatagramSocket

Ÿ   創建DatagramPacket

Ÿ   使用DatagramSocket接收DatagramPacket

Ÿ   關閉DatagramSocket

7.3.   TCP傳輸

Ø         客戶端

Ÿ   創建Socket連接服務端

Ÿ   調用SocketgetInputStream()getOutputStream()方法獲取和服務端相連的管道流

Ÿ   輸入流可以讀取服務端輸出流寫出的數據

Ÿ   輸出流可以寫出數據到服務端的輸入流

Ø         服務端

Ÿ   創建ServerSocket

Ÿ   調用ServerSocketaccept()方法接收一個客戶端請求,得到一個Socket

Ÿ   調用SocketgetInputStream()getOutputStream()方法獲取和客戶端相連的管道流

Ÿ   輸入流可以讀取客戶端輸出流寫出的數據

Ÿ   輸出流可以寫出數據到客戶端的輸入流

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