1. 程式人生 > >javaSE基礎知識點(2)

javaSE基礎知識點(2)

java傳遞引數
Java進行復制操作或方法呼叫中傳遞引數時,遵循值傳遞的原則。
1.基本型別資料傳遞的是該型別資料的值本身,當一個基本型別的變數傳遞給一個方法時,在方法內部可以改變變數的值,但是方法呼叫結束後,該變數會恢復原來的值。
2.引用型別資料傳遞的物件的引用,當一個引用變數作為引數傳遞給一個方法時,在方法內改變了引用指向物件的屬性。

響應狀態碼
-1xx:資訊,表示請求收到,繼續處理
-2xx:成功,表示請求成功
-3xx:重定向,為完成請求客戶需進一步細化請求
-4xx:由客戶端引發的錯誤
-5xx:由伺服器發的錯誤

異常
Runtime Exception 不用逐級拋,直接到頂層
{
錯誤的型別轉換
陣列越界異常
空指標訪問
}
IOException 逐級上拋

從一個不存在的檔案中讀取資料
越過檔案結尾繼續讀取
連結一個不存在的URL

JDBC:Java資料庫連結
環境搭建
1.把Oracle資料庫驅動檔案放在工程裡
2.把ojdbc14.jar加入到工程的build path裡
開發步驟
1.獲取資料庫連線(找到資料庫,輸入使用者名稱,密碼)
2.建立一個stataement物件,用來寫SQL語句
3.執行SQL語句
4.增刪改,提交回滾(JDBC預設提交)
5.關閉
步驟
1.匯入JDBC類或包括JDBC類的包
2.載入JDBC驅動程式
3.建立與資料庫的連線
4.執行SQL語句,與資料庫互動
5.關閉連線

prepared statement 防止SQL注入

public static void main(string[] args){
Scanner scanner = new Scanner(System.in);
String eanme = Scanner.nextLine();
getEmpBynamenew(ename);
}

public static void getEmpBynamenew(String ename){

try{
    Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException e){
    e.printStackTrace();
}
Connection conn = null;
PreparedStatement statement =null;
ResultSet rs = null;
try{
    conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:neuedu","scott","tiger");
    statement = conn.preparestatement("select*from emp where ename =? ");
    statement.setString(1.ename);
    rs = statement.executeQuery();
    if(rs.next()){
        int empno = rs.getInt("empno");
        String uname = rs.GetString("ename");
        Date hiredate = rs.getDate("hiredate");
        System.out.println(empno+"\t"+uanme+"\t"+hiredate);
    }
    else
    {
        System.out.println("Not find");
    }
}
catch(SQLException e){
    e.printStackTrace();
}
finally{
    try{
        rs.close();
        statement.conn();
        conn.close();
    }catch(SQLException e)
    {
        e.printStackTrace();
    }
}

}

多執行緒
程序:就是作業系統中併發執行的任務
一個電腦只有一個CPU,那麼它是如何實現併發的呢?
其實計算機內部所謂的“併發”不是真正意義上的併發,它給每一個執行的程式分配時間片,每個程式都在自己的時間片上爭奪CPU資源,這個時間片用完切換成下一個時間片,由於切換的頻率比較頻繁,速度又非常的快,所以,感覺上是在併發執行
程序有些缺點,就是切換的效率比較低。

執行緒:程序中的小程序
假如我們執行JVM程式,它就是一個程序,那在JVM中用JAVA程式實現的併發操作,就是JVM這個程序中的小程序,這就是執行緒

那麼堆和方法區中的資料,是多執行緒共享的。棧不是,每一個執行緒都有一個自己的棧。
執行緒也是JAVA執行程式的最小單位,main方法本身就是一個執行緒,其他執行緒都是直接或間接從main方法執行緒中生成出來的。

在Java中,執行緒就是一個普通的類,如果這個類想成為一個執行緒,就必須:
1.繼承java.lang.Thead類,並重寫其中的run()方法;
如何啟動一個執行緒—>再寫一個Test類
啟動執行緒一定呼叫的是start()方法,如果直接呼叫run()方法,就不是以執行緒的方式啟動了
按正常邏輯,應該先輸出1—10,然後再顯示“main方法結束”,出現這種現象的原因是什麼?
執行緒之間相互平等,執行緒一旦啟動,那麼它和啟動它的執行緒就是兩個完全獨立的執行單元,它們之間開始競爭CPU資源,誰先執行完全取決於誰先競爭到CPU資源
2.實現Runnable介面(實現所有抽象方法,其實就是run())
如何啟動一個執行緒
注意:Runnable介面沒有start()方法
ThreadDemo2 td2 = new ThreadDemo2();
Thread t = new Thread(td2);
t.start();

【同步問題】
多個執行緒同時操作一個共享資源時,若不加以控制,就會出現同步問題

例子:火車站代售點賣票(同步問題)
先分析這個場景需要哪些類?
1.代售點負責賣票
2.火車站負責出票
那我們假設這個火車站就一趟火車,10個座,所有代售點都去賣這10個座。有渾南代售點、瀋河代售點、和平代售點併發賣票,座位號用票號來代替。

執行緒我們也需要用鎖機制來解決同步問題—-鎖什麼?
賣票這個場景給什麼加鎖才能保證隔離性?
我們可以在saleTicket這個方法前加關鍵字synchronized,加在需要同步的方法前
1>互斥 使用鎖機制,鎖一定是加在共享資源物件上的,synchronized
a)加在需要同步的方法前(並非是在方法上加鎖,而是加在方法所在的物件上)
public synchronized void f() {加鎖
同步執行,互斥
}解鎖(方法執行完畢)
優點:簡單
缺點:不管是否需要,同步方法中的程式碼都是互斥,效率低

b)同步塊
在你需要同步的程式碼上加一個

Synchronized(物件){加鎖
同步的程式碼
}解鎖
優點:可以選擇需要同步的程式碼進行同步,效率有所提升
缺點:需要確定加鎖的物件,需要找到同步執行的程式碼,對初學者較難
2>協作(免費贈送)
執行緒不一定都是互斥的,有些情況下,需要多個執行緒共同協作

========================================================
生產者–消費者模型
生產者—-生產產品
消費者—-消費產品
兩者的共享資源—-產品
規則:消費者在產品生產之前,不能消費產品
生產者在產品被消費之前也不能再生產產品
所以需要兩個執行緒協作,就不能是單純的互斥了

=======================================================
例子:張萌、李英偉、呂洪研去麥當勞喝咖啡,三人買一杯,誰搶到誰喝,孫銘序是麥當勞服務員,負責續杯
服務員—生產者
三位顧客—消費者
共享資源(產品)— 咖啡杯
根據咖啡杯的狀態來判斷到低是續杯還是喝咖啡
1.咖啡杯 2.消費者 3.生產

問題:wait()與sleep()有什麼區別?
1>wait()是Object類提供的,而sleep()是Thread類提供的靜態方法
2>它們都能讓執行緒進入阻塞狀態,wait()執行緒只有被notify才能被喚醒,sleep()的執行緒到時間自動被喚醒
3>wait()方法的呼叫需要鎖的支撐,呼叫完會解鎖
sleep()的呼叫不需要鎖

網路程式設計
java.net.Socket
java.net.ServerSocket

伺服器、客戶端
伺服器:被動的接受連線的一方是伺服器
客戶端:主動的傳送連線請求的是客戶端
一旦連線建立,雙方完全平等。

例子:伺服器回顯的例子
作業:網路之間二進位制檔案的傳輸(把伺服器D盤根目錄下的exe檔案拷貝到客戶端E盤根目錄下)

檔案與流

方向:輸入流、輸出流
位元組流:以位元組為單位讀寫資料,用以二進位制資訊的傳輸
字元流:以字元為單位讀寫資料,用以純文字資訊的傳輸,不能用以二進位制資訊的傳輸

節點流(基礎流、低階流)
處理流(緩衝流、高階流)

java.util.Scanner 也是個輸入流
作用:從控制檯接收使用者輸入的資訊

物件序列化
將物件轉成位元組序列—-物件序列化
將位元組序列恢復成物件—-反序列化
物件是純文字的麼?不是純文字,所以使用位元組流
ObjectInputStream 輸入流
ObjectOutputStream 輸出流
一個類若想序列化,必須得實現2個介面之一
Serializable 或者 Externalizable

Serializable這個介面沒有定義任何方法和屬性,我們把這種介面稱之為標識介面。
標識介面的作用:標識一個類是否具有某種能力