java高階

yongxing_Wang發表於2016-11-28
java集合框架和泛型
1.java中所有的集合API存在與java.util.*;
2.java集合框架中的API層次結構
         Collection                     Map
            |
    List     Set  
                     
所有的介面,其中java俗稱的三大介面:List,Set和Map
介面儲存特性:
Collection 儲存的一組無序,不唯一的物件。
List儲存的一組有序,不唯一的物件。
Map儲存的K-V對。其中所有的K組成的keySet,所有的V組成了Collection的Values集合。其中Map提供K到V的對映,即get(key)。


List的兩個實現類:
 ArrayList和LinkedList
 ArrayList儲存同陣列:連續的空間,通過下標訪問元素。
 LinkedList儲存的(雙)連結串列式結構,只能通過一個元素直接訪問到其前後的元素,元素儲存地址不要求連續。
 ArrayList擅長隨機訪問元素和遍歷元素。
 LinkedList擅長增加,刪除元素,以及對頭尾兩個元素的查詢,增加和刪除。


Set的兩個實現類:
 HashSet和TreeSet
 常用的HashSet:已Hash雜湊表的形式儲存元素。
 Set無法單獨通過方法獲取元素,一般結合迴圈遍歷元素。


Map的兩個實現類:
 HashMap和TreeMap
 常用HashMap:同Set儲存。
 Set keySet = map.keySet();
 Collection values = map.Values();
 Map中的每個元素由一個Key和對應的Value組成。
 map.put(key,value);
 Map中的Key可以為NULL


   集合的遍歷:
for迴圈和Iterator迭代器
List介面的集合物件:可以使用for迴圈,增強for迴圈和Iterator迭代器遍歷元素。
Set介面的集合物件:增強for迴圈和Iterator迭代器遍歷元
素。
Map介面的集合物件:不可以直接遍歷Map集合,需要間接遍歷KeySet結合get方法遍歷Map集合。


Map<Integer,String> strMap = new HashMap<Integer,String>();
strMap.put(1,"張三");
strMap.put(2,"莉莉");
// 增強for迴圈
for(Integer key : strMap.keySet()){
    System.out.println(key + "對應的中文名:"+ strMap.get(key));
}
// Iterator迭代器
Iterator<Integer> keyIt = strMap.keySet().iterator();
while(keyIt.hasNext()){
   // 在迴圈中只能使用一次keyIt.next();方法獲取元素
   Integer key = keyIt.next();
   System.out.println(key+"對應的中文名:"+strMap.get(key));
}


Java實用類:
1.列舉型別:表示一組既定的取值範圍,定義在一個enum型別的java檔案中,相當於在一個class中定義了一組靜態常量值。
2.列舉的使用:列舉型別定義的變數,在賦值時,只能使用列舉類.列舉值。
switch結構的表示式中可以使用列舉型別。其case後的常量直接書寫列舉值。


3.java中的8種基本型別:byte,char,short,int,long,boolean,float,double
其對應的封裝型別:Byte,Character,Short,Integer,Long,Boolean,Float,Double
基本型別和其封裝型別之間可以實現自動型別轉換。
封裝型別的物件提供了一組轉換方法。
String  <- - ->  XXX
XXX.parseXXX(String);
XXX.toString();


4.Math數學函式類:
Math.random()獲取0~1之間的隨機小數。
Math.min(num1,num2)
Math.max(num1,num2)
Math.floor(小數) 返回比該小數小的最大整數
Math.ceil(小數) 返回比該小數大的最小整數


5.Random類
Random rand = new Random();
int num = rand.nextIn(9); // 獲取0~8的隨機數字


6.Date日期類和Calendar日曆類
日期類一般用於整體日期或時間的顯示。
日曆類一般用於部分(如:天,小時)的顯示。且日曆類提供一些常用的日期計算常量。如每年中的第幾天,每月中的第幾周的第幾天,周幾等。
// 獲取當前日期時間
java.util.Date;
Date today = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String st = sdf.format(today);
Calendar c = Calendar.getInstance();
int month = c.get(Calendar.MONTH); // 0~11


java中輸入和輸出:java.io.*;
    1.檔案類:File表示一個檔案或目錄的物件。
File dir = new File("E:/temp");
ile file = new File("E:/temp/abc.txt");


新建目錄:
File dir = new File("E:/temp");
dir.mkDir(); // 表示建立temp目錄
File dir = new File("E:/temp/aaa");
// 當前不存在temp和aaa
dir.mkDirs(); // 表示建立temp目錄和aaa目錄


    流:表示程式和目標源直接的連線通道。負責傳輸位元組或字元的資料串。按照先進先出的形式傳輸資料。


    流分類:
1.按照方向分類:輸入(InputStream和Reader)和輸出(OutputStream和Writer)
2.按照資料單元分類:位元組流(InputStream和OutputStream)和字元流(Reader和Writer)
3.按照操作物件分類:低階流(直接操作目標源的流)和高階流(直接操作低階流的流)


輸入流的使用步驟:
// 建立輸入流物件(位元組,字元)
FileInputStream fis = new FileInputStream("E:/abc.txt");
// 建立儲存讀取內容StringBuffer物件和讀取容器陣列
StringBuffer sub = new StringBuffer();
byte[] b = new byte[1024];
// 迴圈讀取內容
while(fis.available() > 0){
    fis.read(b);
    sub.append(new String(b));
    b = new byte[1024];
}
String fileContent = sub.toString().trim();
// 關閉流
fis.close();


輸出流的使用步驟:
// 建立輸出流物件(檔案若不存在,則輸出流自動建立檔案)
FileOutputStream fos = new FileOutputStream("E:/aaa.txt",true);
// 將內容寫到檔案中
Stirng str = "hello";
fos.write(str.getBytes());
// 清空流(一般用於高階輸出流)
fos.flush();
// 關閉流
fos.close();


建立流連結
// 首先建立低階流物件
FileInputStream fis = new FileInputStream("E:/abc.txt");
// 根據低階流的操作單元建立對應的高階流物件
ObjectInputStream ois = new ObjectInputStream(fis);
// 使用一些高階流的方法


FileReader fr = new FileReader("E:/abxc.txt");
BufferedReader br = new BufferedReader(fr);
String str = br.readLine();// 一次讀取一行內容返回字串


物件的序列化和反序列化
前提:物件的型別必須實現序列化介面      (implements Serializable)


序列化(ObjectOutputStream)   用oos.writeObject();方法
反序列化(ObjectInputStream)  用oos.readObject();方法


在序列化的過程中如果某個類的屬性不允許讀寫可以使用transient關鍵字修改屬性。






java多執行緒
程式和執行緒的關係:
程式指的是一個應用程式執行過程中的一個標識。
一個程式可以有至少一個執行緒。
執行緒是一個應用程式中執行任務的最小單元。
java多執行緒就是指一個應用程式執行過程中的多工表現。如迅雷。


    java多執行緒的使用:
1.繼承Thread類
2.實現Runnable介面(可以實現多個執行緒間共享資源)
注意:必須使用Thread類或其子類的物件.start()方法來啟動一個執行緒,該執行緒用於執行物件的run()方法。
// 方式一:
public MyThread extends Thread{
   public void run(){...}
}
main方法中:
MyThread mt = new MyThread();
mt.start();
// 方式二:
public MyThread  implements Runnable{
    // 定義共享資源
        // 編寫任務方法run
}
main方法中:
MyThread  mt = new MyThread();
Thread t1 = new Thread(mt,"t1");
Thread t2 = new Thread(mt,"t2");
Thread t3 = new Thread(mt,"t3");
t1.start();t2.start();t3.start();


執行緒的優先順序:
在windows系統中,java執行緒預設級別為5,最大為10,最小為1.
使用setPriority(level);


執行緒排程方法:
join();// 使用物件呼叫,表示當前物件立即執行並直到執行完畢後,其他執行緒才能解除阻塞。
sleep();// 休眠方法,使用Thread.sleep(毫秒值),表示當前執行緒處於阻塞狀態指定時長,無論是否有其他執行緒在執行,都會達到休眠時間後,才能解除阻塞。在其休眠狀態下,其他執行緒獲取執行權的概率均等。
yeild();// 暫停方法,Thread.yeild(),使當前執行緒處理暫停執行狀態,當其暫停時,只允許優先順序相同或更高的執行緒進行獲取執行權。


執行緒的同步:
當多個執行緒使用同一資源時,可能存在“前後腳關係”,導致資源不統一使用。
    同步方式二種:
1.同步方法:
將需要同步使用的方法增加:synchronized
表示,當一個執行緒獲取該方法的執行權時,該方法將被鎖定,直到方法執行結束,才將鎖開啟,以便另一個執行緒獲取執行權。


2.同步程式碼塊:
在一個方法中,特定程式碼塊部分使用需要同步的資源時,使用同步程式碼塊。
public void dosomething(){
   // 程式碼行....
   synchronized(同步資源物件){
       // 同步程式碼塊
   }
   // 程式碼行....
}


特殊說明:當使用synchronized實現執行緒同步時,需要注意避免死鎖。


XML技術:
XML指定的可擴充套件標記語言。是以.xml結尾的文字檔案。
語法:
使用<?xml version="1.0" encoding="UTF-8" ?>來定義XML
一個XML只能有一個根元素(跟標籤)
例如:
<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="1">
       <name>張三</name>
       <age>18</age>
       <address>江蘇徐州</address>
   </student>
</students>
格式良好的XML需要滿足最低要求集:
1.需要有XML定義
2.只能有一個根元素
3.大小寫區分
4.標籤必須關閉
5.標籤必須正確巢狀


使用DTD來約束XML文件的內容:
DTD指的是定義一些元素或元素間關係的約束語句,用於限制指定XML檔案的內容格式的檔案。字尾.dtd。引入方式,內部DTD和外部DTD。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 內部DTD -->
<!DOCTYPE poems [
   <!ELEMENT poems (poem*) >
   <!ELEMENT poem (title?,author,content+) >
]>
<poems>
   <poem>
       <title>春曉</title>
       <author>孟浩然</author>
       <content>春眠不覺曉......</content>
   </poem>
</poems>


外部DTD(poem.dtd)
<!ELEMENT poems (poem*) >
<!ELEMENT poem (title?,author,content+) >




XML檔案(poem.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 外部DTD -->
<!DOCTYPE poems SYSTEM "poem.dtd">
<poems>
    <poem>
       <title>春曉</title>
       <author>孟浩然</author>
       <content>春眠不覺曉......</content>
   </poem>
</poems>


XML檔案使用場景:儲存資料,傳輸資料,作為配置檔案
解析XML檔案:
常用方式:DOM,SAX,JDOM,DOM4J(第三方元件)
DOM4J使用步驟:
1.在專案引入dom4j.XXX.jar
2.使用DOM4j提供的API操作XML
步驟例如:
// 獲取解析器
SAXReader reader = new SAXReader();
// 獲取XML文件解析物件
Document doc = reader.read(new File("poem.xml"));
// 讀取根元素
Element root = doc.getRootElement();
// 獲取指定元素
Element poem = root.element("poem");
// 獲取元素集合
List<Element> poemList = root.elements("poem");
// 遍歷元素集合
for(Element poem : poemList){
    // 讀取元素的屬性值
    String id = poem.attributeValue("id");
    // 讀取子元素文字
    String title = poem.elementText("title");
}





















































相關文章