java入門學習筆記總結

switch 使用要注意的問題
1.case 列出的常量不能相同
2.case和default順序可以互換不影響結果
3.switch智能匹配byte,short,int,char,(jdk1.5)enum,
(jdk1.7)String。


day1
第一章
並行一處理完成一個任務,快速的切換到下一個任務
java爲什麼是垮平臺的。
*jvm的不跨平臺性決定了java的跨平臺性。*
併發特性
JVM java虛擬機 虛擬機就是jre


JIT用來保證循環體內容的 (防止內存溢出)


java的構成:
jdk + jdk構成
jdk:java Development Kit java開發組件
jre: java Runtime Environment java運行環境
jdk包含jre如果只是需要運行java程序那只需要安裝jre就可以了,但是如果需要編寫java程序就必須安裝jdk。
jdk文件目錄:
bin:存放了一些可執行文件(負責運行java文件的可執行文件就在其中)
db:存放和數據庫相關的文件。
incloude:存放了一些C語言的頭文件
lib:存放第三方jar包。
src壓縮放的是java的源碼
如何運行一個java文件
編譯
javac 文件名 .java
2運行
java 文件名


控制檯定位盤符
盤符號: 例如:d;


定位文件夾
cd 文件夾名 例如 cd java
後退 
cd..
一個java文件裏面可以有多個類
但是,只能有一個用public修飾的類
用public修飾的類名必須保證和文件名一致
clscmd中清屏
public :訪問修飾符
public 訪問權限最大。
類名:要求 1.不能以數字開頭, 
   2.最好不用漢字,不用拼音。
   3.首字母要大寫。
   4.可以用下劃線和美元符開頭。
public static void main(String[] args){
//主函數程序的入口
System.out.println()
//打印輸出 去掉ln是在一行上打印
}
註釋:單行註釋 //
多行註釋 /**/
文檔註釋 /**
...
*/ 文檔註釋可以通過javadoc指令
導出


第二章
變量:
數據在內存中存儲空間的表示,堆 棧 
堆的特點:存儲的數據量大,但是速度慢。
棧的特點: 數據量小,但是速度較快。
如何去聲明一個變量?
數據類型 + 變量名 = 值。
數據類型:
總體分爲兩種 基本數據類型   (八大基本數據類型)
引用數據類型: 類 接口 數組 null
boolean 布爾型 取值爲ture false 或 1,0;
short 短整型  long  長整型 long 聲明的值要在後面加上大寫的L byte 字節型 char字符型 聲明值需要使用單引號
*int 整形範圍要背面試會用  -2的31次方~2的31次方-1
double 雙精度浮點數 取值範圍大
float  單精度浮點 聲明要在後面加上小寫的f
float 吧32位分成了三部分 , *第一部分是符號位
第二部分是整數位,第三部分是小數位。*
小數類型所以建議使用double
變量名:
要求和類名相似,不能使用關鍵字(51個), 建議使用駝峯命名法,第一個單詞首字母小寫,之後單詞首字母大寫。
char firstName ="張"。
基本屬類型都放在棧裏面
數據類型轉換:
1.自動類型轉換(隱式轉換)
2.強制類型轉換(顯示轉換)
1.取值範圍大的轉向取值範圍小的,需要強制轉換的
2.取值範圍小的轉向取值範圍大的,自動轉換。


顯示轉換例子
double = 1.5;
int num2 = (int) num;
最後得到num2爲1
所以說 顯示轉換會損失精度




第二天
轉義符  /t 製表符 /r 換行
交換變量的方法 1,引入第三方變量
int num1 = 10; int num2 = 20; int num3 =0;
num3 =num1; num1 = num2; num2 = num3;
2.第二種方法
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
運算符 
算數運算符 
+ - * / %  ++ --
+:除了可已經I系那個見運算以外,還可以用來變量與字符串之間的連接。
任意數據類型和字符串連接都會變成字符串
/不計算小數點,取整運算。
%取餘運算只去餘數
++自增運算  --自減運算
num ++ 與 ++num 區別 前者是先執行代碼,在運算, 後者是先運算在執行代碼。
有意思的案例:
int j = 5;
int k = 6;
int num =  ++j + --k + k++  - j--;
System.out .println(num);
=代表的是賦值 Int num = 5
== 判斷值是否相等
!=不等於
關係運算符 結果是布爾類型的
邏輯運算符
邏輯運算符操作的全都是布爾類型
!!條件  條件爲真結果爲假
條件爲假結果爲真
^異或  條件1^條件2
一真一假結果爲真
&&短路與  條件1&&條件2 兩個條件都是真,結果就是真。如果第一個爲假,就不判斷第二個。
||短路或  條件1||條件2 兩個條件有一個爲真,結果就爲真。如果第一個爲真,就不用判斷第二個。
& | 與,或:使用方法和前兩者一樣 他倆的第一個條件爲真,依然也會判斷第二個。


第四章
if(條件){
//條件爲真時執行...
}else{
//條件不爲真時執行...
}
if(條件){
}else if(條件2){


}else(條件3){
}
if的代碼如果只有一行時可以省略掉花括號。(但是不建議這麼寫)


switch case
switch(表達式、一般來說都是變量名){
case 值1:
如果值爲1 就執行的代碼;
break;
case 值2:
如果值爲2就執行的代碼;
break;
default:
如果都不滿足上邊的條件
就執行的代碼。
}
常量是不變的量 變量是變化的量。
表達式可以爲 byte char short int 
1.5可以使用枚舉 1.7可以使用字符串。
swich case 判斷是整值
if和switch何以替換麼?
if做區間判斷和等值判斷
switch只能做等值判斷,所以只要能用swicth的肯定可以用
if能用if的不一定能用switch


第三天 2017、7、28
位運算
8421 
2《《3 = 2*2的三次方
2》》1 = 2* 1的次方
位運算符常用的是左移右移。
.equals檢測雙方的字符串
如果這兩字符串有常量的話,儘量
吧常量卸載字符串1的位置。


第五章:循環
while循環  for循環
這裏的條件不能想for一樣寫出來。
while語法
while(條件) {
要循環的代碼
}
1.循環變量 2.循環條件 3.循環體。
遇到死運行crtl+c可以退出來。
如何避免死循環,每次循環之後,更新循環變量的值。
do-while循環 先執行,後判斷。
do{
  循環體
}while(循環條件)


for循環
for(循環變量;循環條件;每次循環後更新的值){
循環體
}
for和while循環的區別
for循環循環次數一般來說是確定的
while是不確定的
所以說當循環次說確定的時候使用 for
否則就用while
多重循環:主要是指for的多重循環。外層執行一次,
內層必須全部執行完畢,外層再執行第二次。




day4 2017/7/31
impor java.util.*;
導入所有的java.util.*包。
System.exit(0)退出java程序


數組
堆當中存儲一個地址
棧當中存儲內容


1、數組的數據類型相同
2、內存地址連續
數組的聲明
數據類型 [] 數組名 = {值1,值2};
數據類型 [] 數組名 = new 數據類型[長度];
數據類型 [] 數組名 = new 數據類型[]{值};
3第三種就是第一種的簡寫
方括號裏絕不可以有值
數組一旦聲明,長度就不能改變了
數組如果只聲明長度,那麼數組類型對應第二章的表的表,引用數據類型都爲null




如何操作數組?使用下標去操作數組,下標從0開始。
數組名[下標]:獲取指定數組下標的值。
數組的遍歷
數組名.length 
可以返回數組的元素個數
AIOOBE 數組下標越界
ArrayIndexOutOfBoundsException
冒泡排序


for(int i =0;i<arr.length;i++){
for(int j =0;j<arr.length-i-1;j++){
if(arr[j]<arr[j+1]){
int num = 0;
num = arr[j];
arr[j] = arr[j+1];
arr[j+1] = num;
}
}
}
冒泡排序一次對比兩個,然後最大排序的數量是數組長度-1


冒泡排序 每輪一個比較,選則最大記性比較 外層循環 -1似乎也沒事
選擇排序
//先進行對比,後切換下標。
for (int i=0;i<arr.length-1;i++){
int k =i;
for(int j=k+1;j<arr.length;j++){
if(arr[j]<arr[k]){
k=j;
}
}
if(i!=k){
int num =0;
num = arr[i];
arr[i] = arr[k];
arr[k] = num;
}
}
插入排序


有個值爲13 


二分查找又稱作折半查找
二分數組必須是有序的


String 是引用數據類型。
//少了類類型


方法的構成
訪問修飾符 返回值 方法名(參數列表){
方法體
}
在沒有學習訪問修飾符,在沒有學習封裝之前
訪問修飾符使用 public
返回值:方法結束後,對外提供的值。
方法名和類名一樣
參數列表:執行方法需要的數據
方法分爲四種
有返回值有參數
無返回值無參數
有返回值無參數
無返回值有參數
無返回值無參數: 返回值用void帶刺蔘數列表不填值。
只要引用數據類型默認值就是null
有參數無返回值:
參數分爲兩種,一種叫做實參,在對象調用時賦予,
一種叫做形參,在方法參數列表時賦予
多個參數使用逗號隔開
形參和實參數據類型要做到一一對應。
有返回值無參數的方法
不定長參數 數據類型...參數名
在調用時,實參就可以寫多個,在方法中,會以數組的形式
保存參數。
int num =10;
public void tase{
int num =20;
}
全局變量 &&局部變量
全都能用 只能元素裏面使用 
變量的作用域,變量分爲全局變量和局部變量
全局變量聲明在類當中
局部變量聲明在方法體或循環體當中
只作用於其中的一部分。
如果出現重名變量遵循就近原則。
就近原則 
String儲存在棧類型中
String name1 = ""
String name2 = ""
String name3 = new String("小明");
String name4 = new String("小芳");
name1 ==nam2;//ture;
String  
看到new就是在棧內存當中保存了地址
在堆內存當中保存了內容所有說name1
和name3不在同一個區間內。
name3 和name4都開闢的新的空間
只是開闢了新的空間,只是地址不同。
頻繁修改String有可能出現問題。
String對象不可變
一旦聲明,如果修改值,就必須開闢新的內存空間,所以頻繁操作字符串,會損失大量不必要的內存空間。
String 查詢快
常量池在棧裏
String對象
如果調用null對象的方法,會報出空指針一場
NullPointerException
chanAt()返回指定下標對應的字符串
如果下標超出,則報出字符串下標越界異常。
StringIndexOutOfBoundsException


indexOf返回指定字符串在此字符串中第一次出現的下標。
找不到返回-1
split拆分字符串。
String [] arr = test.split("A");
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
day6


面向對象編程
類 對象
對象:萬物皆對象
例子:如果說杯子是一個類
那麼小明的杯子是一個對象


類一般比較抽象 而對象
是由類具現化的實例
和現實生活中不同
java中是先有了類纔有對象


類裏面包含什麼?
1屬性   2方法
結合現實生活中來說
屬性一般都是名詞
方法一般都是動詞


如何去創建一個對象
類名 對象名  = new 類名();


如何去訪問類中的屬性
通過訪問符"." 可以看作對象"的"屬性


方法的構成:
訪問修飾符 返回值 方法名(參數列表){
方法體
}
訪問修飾符:在沒有學習封裝之前
訪問修飾符使用public
返回值:方法結束後,對外提供的值
參數列表:執行方法需要的數據


方法分爲四種
有返回值有參數
無返回值無參數
有返回值無參數
無返回值有參數
無返回值無參數:返回值使用void代替
參數列表不填值


有參數無返回值:
參數分爲兩種,
一種叫做實參,在對象調用時賦予,
一種叫形參,在方法參數列表裏賦予
多個參數使用逗號隔開
形參和實參數據類型要做到一一對應


有返回值無參數:
需要返回什麼數據類型,就在返回值上
寫什麼數據類型,並且在方法的最後
添加關鍵字return 用來將數據返回


不定長參數 數據類型...參數名

public void show(int...arr){}
c.show(1,2,3,4,5,6,7,8);
在調用時實參可以寫多個
在方法中,會以數組的形式保存參數


變量的作用域
變量分爲全局變量和局部變量
全局變量聲明在類當中,作用於整個類
局部變量聲明在方法體或循環體當中,
只作用於其中一部分
如果出現重名變量,遵循就近原則


String對象不可變
一旦聲明,如果修改值,就必須開闢新的
內存空間,所以頻繁操作字符串,會損失
大量不必要的內存空間


String對象的方法


equals


如果調用null對象的方法,會報出空指針異常
NullPointerException


charAt()返回指定下標對應的字符串
如果下標超出,則報出字符串下標越界異常
StringIndexOutOfBoundsException


indexOf()給定一個值,如果字符串包含
該值就返回該值第一次出現的下標
如果找不到返回-1


substring截取字符串
如果有一個參數 就從指定參數位置
截取到末尾


如果有兩個參數,就把第一個參數作爲開頭
把第二個參數作爲結尾
包含頭不包含尾的截取


面向對象的三大特性
1封裝 2繼承 3多態


構造方法:
作用:用來初始化對象,
只調用一次 在創建對象的時候被調用
任何一個類都有構造方法
如果我們沒有聲明構造方法 java會給我們添加
一個無參數的構造方法
如果我們自己寫了構造方法,java就不再自動
添加了


構造方法的寫法:
方法名和類名相同
沒有返回值 連void也沒有


方法的重載:
方法名相同,參數列表不同 和返回值沒有關係
方法的簽名:指方法名和參數列表


this關鍵字:
本類對象的引用


封裝:
訪問修飾符的封裝
四個訪問修飾符
公開的 public
缺省的 default
受保護的 protected
私有的 private


public可以修飾 屬性 方法 類
在一個項目下的任意位置都可以訪問


private 可以修飾屬性和方法
只能在本類當中訪問
一般會提供公開的get和set方法
去操作屬性 
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}


static關鍵字
是一個修飾符
可以修飾 屬性 方法 代碼塊
修飾完畢後叫做靜態屬性 靜態方法 靜態代碼塊
static可以將屬性和方法由成員級別
提升爲類級別 


在對象沒有創建之前 靜態屬性和方法就已經
存在了可以通過類名.屬性名或類名.方法名
直接調用,靜態屬性和方法屬於共享資源


加載順序:
加載類——>加載靜態屬性和靜態方法——>
加載對象——>加載普通屬性和方法


在靜態方法裏面無法訪問非靜態的屬性和方法
this關鍵字不可以在靜態方法中使用


靜態代碼塊
在創建對象時被調用,並且只調用一次
優先於構造方法 一般用來加載驅動
static{  }
day7
java當中繼承發生在類當中
一個類可以繼承另外一個類繼承的類子類
被繼承的是父類 父類比較抽象,子類更加具體。
使用關鍵字 extends來產生繼承關係
java中只允許單繼承,一個父類可以由多個子類,一個子類只能由一個父類。
子類可以訪問父類當中非私有的屬性和方法。
super獲取父級元素
如果在寫子級中調用父級屬性或者方法,可以不用super,jvm會自動加上。
子類創建對象的時候,一定會去調用父級的構造方法,
通過super(參數)來調用
super必須放在子級構造方法第一行,並且只能有一個。
如果父類構造方法沒有構造沒有參數,super()可以不寫,但是jvm會自動添加。
重寫就是方法名,和方法參數一樣的
重寫方法名相同,參數相同,重寫,發生在繼承關係中。子類重寫的訪問修飾符權限,一定要大於或者等於父類的訪問修飾符。
重載方法名相同,參數不同 方法簽名不同,之發生在一個類中
@override它下方的必須是一個重寫的方法,不然報錯。
如果不是方法重寫,即使語法沒有問題,依然不會通過編譯
final關鍵字可以用來修飾變量、方法、類
final修飾的變量是一個常量。而且永遠不能被修改。final一般配合static關鍵字配合使用聲明一靜態常量變量名全部大寫
final修飾的方法,不能被重寫。
final修飾的類不能被繼承。
繼承的優點 :能提供代碼的重用性。
*單例模式的第一個特點無法在別處創建對象,私有的構造方法。*
*只能在自己本類上創建對象。通過靜態方法,返回該對象。*
懶漢使  惡漢使, 惡漢使有線程問題!(不安全)。
Object類 他一般叫做超類
Object類使所有類的父類,所有的類都直接或間接的繼承Object
hashcode() 返回對象的哈希值,
clone ()  getClass()返回自解碼對象 finalize()垃圾回收站機制。
toString
Object 的toString方法用來返回計算的哈希值 的哈希值類似於身份證號,每一個對象,都有自己特有的一個哈希值。
一般對我們創建的實體類,重寫toString方法一般用來返回對象信息。
equals
判斷兩個對象的哈希值的 如果哈希值相同返回true,否則返回false。
String類修改了Object的equals方法。


修灌溉訪問修飾符作用範圍由大到小是 pubilc -protected=default-private;






day9
多態:
一個對象產生多種形態。
想要產生多態,需要繼承或者實現的關係。liskov 里氏替換原則:凡是父類出現的地方,都可用子類來替換。
父類在前叫上轉型, 子類在前是下轉型,下轉型容易出錯。動物是貓會報錯的。
*對象的上轉型要重點記, Animal c2 = new Cat()//對象上轉型 *
判斷一 instanceof 判斷二 , 用來判斷一不是不而會出現錯誤。
//向下轉型的正確例子
//如果錯誤 就爆出 classcastException
Cat c1 = new Animal()//對象下轉型 ClassCastException 類型轉換異常,會報出的錯誤。
動物是貓 有很大機率出錯。
向上轉型:出現有子類特徵的父類對象,當子類對象存在重寫的方法的時候,會調用子類的方法。
後期會用到大量的數組的向上轉型。


抽象方法/抽象類:當一個方法只需要被重寫 不需要被調用的時候,就可以把這個方法定義爲抽象方法。
1.使用關鍵字abstract修飾。  2.沒有方法體。 3.如果一個類中包含了抽象方法,那這個類就必須是抽象類。4.抽象類無法實例化(無法創建對象)。5如果一個類繼承了抽象類,就必須重寫抽象類裏所有的抽象方法。(除非繼承的類是一個抽象類)。


抽象接口無法實例化
接口:
接口是更加純粹的抽象類 *接口內只能由靜態常量和抽象方法。*interface implements 
定義接口的關鍵字interface類和接口之間的關係是實現使用關鍵字implements java中一個類可以實現多個接口,
在街口裏面定義常量和方法, 不寫static final jvm會自動添加  方法不寫public jvm會自動添加
接口和接口之間可以產生繼承關係。接口可以多繼承,接口和接口之間的關係是繼承,並且是多繼承。
接口的作用提高擴展功能的,繼承了一個接口,就要重寫方法。
抽象類提高了代碼的重用性 接口擴展了功能,解決了單繼承的侷限性。
day11:
多態:
一個對象產生多種形態


產生多態需要
繼承或者實現的關係


liskov 里氏替換原則:
凡是父類出現的地方,都可用子類來替換


對象的向上/向下轉型


Animal c2 = new Cat();//對象的上轉型
貓是一個動物 不會報錯 


Cat c1 = new Animal();//對象的下轉型
動物是貓 有很大機率出錯


向上轉型:創建的是有子類特徵的父類對象
當子類對象存在重寫的方法的時候,會調用
子類的方法


抽象方法/抽象類:當一個方法只需要被重寫
不需要被調用的時候,就可以把這個方法定義
爲抽象方法


1使用關鍵字abstract修飾
2沒有方法體
3如果一個類中包含了抽象方法
那這個類就必須是抽象類
4抽象類無法實例化(無法創建對象)
5如果一個類繼承了抽象類,那就必須
重寫抽象類裏所有的抽象方法,除非繼承
的類是一個抽象類




接口:
接口是更加純粹的抽象類
接口內只能有靜態常量和抽象方法
定義接口的關鍵字interface
類和接口之間的關係是實現使用關鍵字implements
java當中一個類可以實現多個接口
接口和接口之間的關係是繼承,並且是多繼承


抽象類和接口:
抽象類提高了代碼的重用性
接口擴展了功能,解決了單繼承的侷限性


*************************第八章*****************************
1.內部類 ,內部類屬於外部類,匿名內部類使用最多,最難。
成員內部類:可以用任意訪問修飾符。
關鍵如何創建內部類, 假設外部類名叫Outer 內部類叫Inner的話
Outer.Inner i = new Outer().new Inner();
內部類可以用外部類的屬性。內部類可以訪問外部類的私有屬性和方法
外部類不能訪問內部類 的屬性和方法,想要訪問必須創建內部類對象
我們不能在內部類中使用static靜態屬性或方法。除非定義的是靜態常量。
內部類的作用:
1間接實現多繼承 2.可以通過內部類封裝屬性和方法。
2.靜態內部類:
靜態內部類,更像是一個普通的類,可以直接創建內部類對象
處在同一磁盤下的class文件名最好別重名,
創建靜態內部類對象,Outer2.Innner2 i2 = new Outer2.Inner2();
內部類只能訪問外部類靜態屬性和方法,外部類也只能訪問內部類當中的
靜態屬性和方法。 
3、局部內部類 聲明在方法體當中的類,作用域範圍小,局部類不能
加訪問修飾符。局部內部類屬性,默認添加了final來修飾,必須是常量
4、匿名內部類:沒有名字的類
匿名內部類必須依託繼承關係或者接口存在。創建對象時纔會聲明出來
*******************類名/接口名 變量名 = new 類名/接口名(){
要重寫的方法。
}主要這裏要加分號。**********************只會調用一次。


自動裝箱和拆箱
java八種基本數據類型都有魚其對應的引用數據類型,其中int->Integer
char -> Charracter
自動裝箱:
把int類型的數據轉換成Interger類型的數據
Interger.paresInt("")可以將字符串轉化爲int類型。
如果輸入的字符串有問題, 有可能報出數字格式化異常
NumberFormatException
枚舉
是一個特殊的類 內部聲明的都是靜態常量。枚舉無法創造對象, 因爲
構造方法是私有的。聲明枚舉的關鍵字:enum 在枚舉裏面的枚舉值
沒有數據類型,可以配合switch來使用,建議使用大寫。
枚舉類型是class
StringBufer/StringBuilder
StringBufer線程安全,效率低  StringBuilder線程不安全,效率高
append()追加字符串 insert(下標,值)在指定下標後,插入值。
  ()返回當前容量,默認是18(有待研究,不常用)。
replace(開頭,結尾,"這個是替換的內容") 包含頭不包含的字符串替換。
reverse()反轉字符串。String和StringBuffer可以用來相互轉換。
String word = "123"; StringBUffer sb2 = new StringBuffer(word);
String word2  = "" + sb2;


第九章異常
異常一但發生,程序就會終止。RuntimExeotion之外的所有Excption需要去處理的
非受查一處能夠Error和RuntimeException 不用去處理代表一些比較嚴重的錯誤,
如何去處理異常
1捕獲,2拋出
捕獲異常
異常
try-catch
會出現異常的代碼要放在try中,如果出現問題,參數裏面填的是異常的對象。
受查異常除了 cathc裏面放異常處理。
try{
有可能會拋出的異常的代碼
}catch(異常對象){
異常處理代碼。
}finally{
總要執行代碼
}
catch可以有多個但是不許保證異常對象 統計或者一級比一級高。
try-catch-finally
try-catch
try-finally 可以執行
catch-finally
try{}不可以執行
拋出 throw throws throws用來 修飾方法,被修飾的方法,有可能會拋出異常
throw 用來手動拋出異常在方法當中使用。
在方法體的後面去寫拋出只是一暫緩的作用
 右擊-new-javaProject 項目名不可以數字開頭
2.src ->new ->package(包)。包名規範:公司性質.公司名.包名
3包下->new ->class
快速導入包 ctrl+shift+o快速導入包/刪除不用包
ctrl+d 刪除一行 ctrl +alt + 下 複製一行
alt+ / 聯想
自定義異常:
如何去定義一個異常聲明一個各類繼承Exception這個類就變成異常類。
重寫getMessage()方法,把錯誤信息返回出來。






面向對象的複習
41~50頁


面向的對象的基礎


什麼是類? 什麼是對象?
類當中包含什麼?
屬性:變量
方法:分爲四種


怎麼去創建對象?
真麼去調用對象的屬性和方法? 


String類的法廣發 P48
着重記equals substring indexOf 


50~56封裝
封裝本身:私有的屬性
需要提供公開的set/get方法去訪問


構造方法 :很重要 初始化對象
this關鍵字
static關鍵字(暫時放一下)


57~60繼承
繼承的關鍵字 子類和父類如何調用的
super關鍵字配合構造方法使用
方法的重寫


62~最後  多態
里氏替換原則
對象的向上轉型:創建的是父類對象
參數的多態性
抽象類 接口的使用
抽象方法的特點?
接口的使用




day13
泛型
泛型的最大作用就是用來防止類型轉換。。
聲明泛型類 將泛型寫在類名後面
class Demo1<T>{
}
泛型方法 將泛型寫在訪問修飾符後面
class Demo2{
public <T> void show(T t){

}




第十二章集合 


集合類型對應的所有接口:Iterable迭代器接口
Collection:類集合接口 List:列表接口
set:數據集接口 Queue:隊列 Map:鍵-值對組合
映射表。


Listlterator擴展了父接口Iterator,允許雙向遍歷集合,並修改
和刪除元素
list接口擴展了Collection ,特點:有序且可重複的
set接口擴展了Collection,特點:無序且不可重複。


list 列表 set 集合 map 映射 collection接口 
list接口主要學系其實現類 ArrayList 和  集合中類
LinkedList    在api中e類型就是泛型
list接口主要學系其實現類 ArrayList的方法
增加add() 直接向後追加 add(內容)也可以 在
指定下標增加 add(下標,內容);
刪 remover()可以根據下標刪除 remove(下標)
可以根據內容刪除remover(值) int 類型的除外
如果存在interger類型數據,使用下標去刪除
改set(下標,值)將指定下標的值作出修改,
查get(下標)返回指定下標的值。查單個 
查全部size()查集合的長度,1.通過下標查詢
list.size()返回集合的元素個數。 
然後遍歷數組,用get[i]來遍歷全部數組,
似乎還有更好的方法,這種方式浪費資源
不會使用。


2.使用迭代器iterable() 來遍歷 第一步:獲得
迭代器,集合中提供了iterator()可以返回迭代器
第二步:遍歷
迭代器當中提供hasNext方法判斷是否有元素
next方法顯示下一個元素


3 forech循環 內置了迭代器的增強性for循環 
假設說我們要遍歷Object類型幾何對象1
for(Object o:l){


}


for(遍歷對象的數據類型 任意:要便利的對象名){


}




day15
list
實現類 Arraylist
ArrayList底層是數據結構,查找效率高
查詢快,刪改慢
LinkedList底層是鏈表結構。修改效率高
數據包含了一些頭尾信息,刪改快,查詢慢。
提供了關於頭尾的操作方法。
addFirst() removeLast()再開頭添加
在結尾刪除等。 
list的特點:
有序(怎麼存進去 怎麼拿出來) 可以重複                      
Vector用法和Arraylist完全相同,但是
Vector線程不安全  ArrayList線程不安全
Map映射
存儲數據採用的是鍵(key)值(value)對的方法
kay不可以重複,value可以重複。如果又重複的key
創建HashMap的map類方式
map name = new HashMap();
構造方法摘要 
HashMap() 
          構造一個具有默認初始容量 (16) 和默認加載因子 (0.75) 的空 HashMap。 
HashMap(int initialCapacity) 
          構造一個帶指定初始容量和默認加載因子 (0.75) 的空 HashMap。 


後出現的會替換掉之前的。增:put(key:value);
刪除remover(key)該方法可以返回該key對應的value
key可以間接的通過put和remover方法實現修改
查:get(key)返回該key對應的value
查全部:map沒有實現iterable接口所以無法直接使
用迭代器
使用keyset()方法返回一個set集合,該機和保存了map
當中所有的key
遍歷map的下的所有
1 keyset()方法返回了set集合
該集合保存了map當中所有的key
2 entrySet()方法 返回一個Set集合(Map.Entry)類型 Map.Entry接口
提供了getKey()和getValue()方法可以提高效率的遍歷map
TreeMap底層結構和HashMap不同 HashMap底層是哈希表,TreeMap地城是
二叉樹  TreeMap會根據key值來進行自然排序。 HashMap是哈希值相同
 如果兩個對象內容相同,想把他兩看做同一個對象的話,就就重寫
hashCoda還有equals方法
TreeMap的自動排序,無法筆記自定義對象,
可以讓1.實體類實現Comparable接口
重寫CompareTo方法,進行比較,如果比較對象指定信息要打返回正數,
如果比該對象指定信息小,返回負數,如果相同返回0 ;
2.可以在構造集合的時候傳入一個比較器comparator接口(匿名內部類)重寫compare方法比較
方式和第一種相同  map:無序的,不可重複。 set集合 用法和list相同,
特徵就是去掉了value的map set :無序,不可重複。
獨立的窗體對象Frame 默認不可見 需要使用setVisible(true)方法修改






set CloseOperation(JDialog.DISPOSE_ON_CLOSE);
設置用戶在此窗體上發起 "close" 時默認執行的操作。必須指定以下選項之一:
DO_NOTHING_ON_CLOSE(在 WindowConstants 中定義):不執行任何操作;要求程
序在已註冊的WindowListener 對象的 windowClosing 方法中處理該操作。
HIDE_ON_CLOSE(在 WindowConstants 中定義):調用任意已註冊的 WindowListen
er 對象後自動隱藏該窗體。
DISPOSE_ON_CLOSE(在 WindowConstants 中定義):調用任意已註冊 WindowListe
ner 的對象後自動隱藏並釋放該窗體。
EXIT_ON_CLOSE(在 JFrame 中定義):使用 System exit 方法退出應用程序。僅
在應用程序中使用。
默認情況下,該值被設置爲 HIDE_ON_CLOSE。




//給按鈕添加上的鼠標事件適配器
name.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e
name.addKeyListener(new KeyAdapter() {
@Override//鍵盤監聽器
public void keyPressed(KeyEvent e) {


DAY17反射
反射是一種機制通過反射,我們可以在運行的時候再去確定類以及類當中的屬性和
方法
提高了靈活性想要實現反射,就必須創建class對象, 創建class對象有三種方式:
//拿到反射對象對象.getClass()方法\
Class c1 = new People1().getClass();
Class c2 = People1.class;
//類名.class // Class.forName("文件路徑"這一種最常用
Class c3 = Class.forName("類的路徑");
類的路徑是包名.class名
需要處理一個異常ClassNotFoundException
Class c3 = null;
try {
c3 = Class.forName("Day17.People1");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
c3這樣創建他是全局變量,在class中都能拿到
通過class對象創建實體類對象, 1無參數的 class對對象名.newInstances();
People1 p1  = (People1)c3.newInstance();
但是這樣的寫法會報出一個異常捕獲 throws InstantiationException
2.有參數的 class對象名.getConstructor(參數)
構造函數裏需要添加指定數據類型的class對象,可之後調用Constructor對象的
newInstances()方法其中會報出 IllegalArgumentException InvocationTarge
Exception
獲取所有屬性 class對象.getDeclaredFields();返回一個filed類型的
數組, 該數組包含類但中的所有屬性 , field [] arr= c3 getDeclaredFields();
for (Field field : arr) {
System.out.println(field);
}
getType()方法可以返回該屬性數據類型所對應的class對象
getName()方法可以返回該屬性所對應的對象名
Constructor c = null;
People1 p2 = null;
try{
c = c3.getConstructor(String.class,int.class);
p2 = (People1)c.newInstance("小名",12);
}catch(IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
導入這個包import java.lang.reflect.Field;
獲取單個屬性 Field f = class 對象.getDeclaredField("屬性名");
暴力反射 可以獲取私有的屬性,不建議使用
f.setAccessable(true); 獲取對象的屬性值 f.get(實體類對象名)
設置對象的屬性值 f.set(實體類對象,"值");
獲取單個方法:
Method method = class對象名.getMethod("方法名",null);null代表沒有參數
method.invoke(對象名.null)
Method method2 = class對象名.getMethod("方法名",String.class);
代表該方法有一個String類型的參數 method2.inovke(對象名,"張三");
15章多線程
什麼是線程,什麼是進程
進程是由線程構成的,一個進程當中,至少有一個線程。
多線程 指的是在單個程序中可以同喜運行多個不同的線程執行不同的任務。
java也是多線程的 finalize()java的垃圾回收器線程當某個對象不會在被調用時
觸發的 線程的特點:1併發性 以毫秒爲單位,在多個任務之間進行切換
2不定向性 多個線程爭搶資源是隨機的,線程的優點:解決了多個程序同時運行的
問題,缺點程序開多了,會影響效率。 java提供了一個線程類叫做Thread,可以執
行多線程操作 創建線程類第一種方式:繼承Thread ,重寫run方法
Thread類包含的方法 setName()設置線程名稱,getName()獲得線程名稱
如果這裏的setName()和getName()不設置名字會用到Thread-n,n從0開始
start()開始執行線程的run方法
sleep(1000)以毫秒爲單位讓線程休眠, 需要捕獲線程被打斷錯誤
另一種開啓多線程的方式, 實現Runable接口 重寫run方法 在創建對象時
currentThread()獲取當前的線程對象  必須要創建Thread對象纔可以開啓
畢向東   馬士兵
線程同步  如果不同步,會出現資源多次使用,比如賣票就會出現票數爲0的情況
實現線程同步,兩種方法 1同步方法,2同步代碼塊 同步方法是使用 修飾符
synchronized修飾在訪問修飾符後,返回值前 
同步代碼塊 synchronized(任意對象){要同步的代碼}


Day18 Enumeration e = h.elements(); 
while(e.hasMoreElements()){
system.out.println(e.nextElement());
}
線程類:
線程狀態有四種
就緒:線程對象new出來後 調用start()之前 
運行:調用了start之後
阻塞:因爲某些原因無法運行,如sleep wait 或者被同步後
死亡:run方法運行完畢或線程被打斷
不用記interrupt和stop()因爲過時了
線程通信:同步代碼塊,同步方法同上一章
wait()讓該線程進行等待,會釋放資源鎖。
notify()喚醒正在等待的線程,由阻塞狀態進入到運行狀態。
notifyAll()喚醒正在等待所有線程。
死鎖:兩條線程在同步時,都拿到了一部分一方想要的資源,而在等待另一方釋放資
源的過程。


線程會用到的方法 
yield()不能保證100%有效
join() 等待該線程終止  sleep() 線程休眠 start() 開始線程調用run方法  setName(String) 改變線程名字  wait() 等待


sleep方法不會放鎖
wait notify notifyAll方法執行後
或者run方法執行完畢後可以放鎖


Day20
IO流
File類包含了可以對文件進行基本操作和獲取文件信息,但是不能獲取文件中的內容
包含方法:
File流構造方法:
File(String directoryPath)
File(String directoryPath,String filename)
File()


//創建一個新文件
file.createNewFile();
//創建一個新的文件夾
file.mkdir();
返回文件名 getName();
返回上級路徑類型是String getParent(); getParentFile()返回上一級文件路徑類型是File
返回絕對路徑 getAbsolutePath() 判斷文件是否存在 exists()
返回一個File類型的數組,遍歷文件夾返回文件夾內的所有File對象
返回的是字符串的數組 file.listFiles() "是否是文件?"+file.isFile() 
是否是文件夾?"+file.isDirectory()   "返回文件大小(以字節爲單位)"+file.length()  刪除文件  //file.delete();    File.separator 代表\ 路徑用一個/和//都行


遞歸算法 
程序方法中,在自身當中調用自身方法的算法叫做遞歸運算
使用遞歸時,一定要有一個跳出遞歸的條件,否則方法沒有意義並且浪費大量資源
/*
字符流
抽象類 :Reader Writer  
FIleReader:
用於讀取字符流的類 包含兩種構造方法, FileReader fr = new FileReader();
FileReader fr2 = new FileReader(String src);
主要包含讀取方法read() 如果讀到結尾沒有數據,返回-1
FileWriter,用來寫入字符串的類,構造方法和FileReader類似,但是可以添加一個
布爾類型的參數,代表文件是否續寫,默認是false
寫入的方法write()把數據寫入到了緩衝區當中,需要調用flush方法將緩衝區的數據寫入到文件內,其中close方法會自動調用flush方法。
如果想要換行:System.getProperty("line.separator") line.separator等價於 \n;
獲得系統的關鍵:system.getProperty(); static fianl String CHANGELINE  
從緩衝區當中讀取文本,大大提高了效率,
構造方法:  BufferedReader br = new BufferedReader(Reader 對象);
提供了readLine()一次讀取一行,讀到末尾返回null。 
System.currentTimeMillis() 可以用來創建在兩個函數的執行前和執行後,用來獲取
函數執行所花費的毫秒數。
文件當中換行就是newline()在BufferedWrter:寫入文本 提供了一個文本提供換行


字節流:
FileInputsystem 從文件系統中的某個文件中獲得輸入字節
獲得輸入字節,每讀到一個字節,就返回一個字節,所以說不能夠處理文字類的內容
普遍應用於音頻視頻的傳輸,效率較高 用法和Read類相同
以後全部用字節流來操作數據 字符流 不能用來複製圖片, 
FileOutputStream 文件輸出流適用於將數據寫入File 或 FileDescriptor的輸出流。
獲得輸出字節和 FileReader用法完全相同
字節流的緩衝區 BufferedInputStream(輸入)    BufferedOutputStream (輸出)
無論是字節流還是字符流加上緩衝區後,效率會提升很多。
*/
Day21嚴重掉課程 需要時間去記憶代碼用法格式熟練掌握
轉換流
InputStreamReader/OutputStreamWirter
封裝了字節流的字符流 可以根據指定編碼格式通過碼錶對照 讀取字符,從而做好使用字節流
去操作文本。構造方法 InputSteamReader(字節流對象,編碼格式) OutputStreamWriter(字節流對象,編碼格式) 如果不顯示聲明編碼格式,會使用系統默認的編碼格式 
讀寫方法和字節流相同


打印流 
PrintSream 永遠不會拋出IO異常 提供了 print pritln可以向
PrintStream ps = new PrintStream(字節輸出流對象,是否自動刷新,編碼格式);


ByArrayInputStream /ByteArrayOutputStream
使用流的方式去操作數據 該流不需要關閉


ByteArrayInputStream bais = 
new ByteArrayInputStream(arr);
ByteArrayOutputStream baos = 
new ByteArrayOutputStream();




讀寫方式和inputStream相同
ByteArrayOutputStream 包含WriteTo方法 可以將字節輸出流寫入到一個文件當中
baos.writeTo(new FileOutoutStream("E://333.txt"));
DataInputStream/DataOutputStream 提供了多種輸入方式的字節流 注意在讀取的時候
要保證順序一致。
DataInputStream/DataOutputStream 提供了多種輸入方式的字節流,注意在讀取的時候要保證


ObjectOutputStream/ObjectInputStream 將對象以流的形式保存到文件中(序列化) 或將文件中的對象以流的形式讀取出來(反序列化) 實現序列化和反序列話的條件是實體類必須實現
Serializable接口,該接口沒有抽象方法,是一個標記接口通過wrtieObject(p)存入
通過readObject()讀取  創建 r 和 rw 
RandomAccessFile隨機訪問文件的讀取和寫入既提供了read方法也提供了write方法
構造方法:
RandomAccessFile raf =  new RandomAccessFile("D://12.txt","rw/r");
rw:讀寫 r:只讀  如果寄信寫入操作-就會報出IO異常  seek(字節數)設置節點
如果設置了節點 ,該流就會把節點當作文件的起始位置, getFilePointer()獲得節點的位置


自定義緩衝區
byte arr[] = new Byte [1024];
字節流:聲明一個byte類型的數組代表緩衝區
調用read方法是,把數據讀到緩衝區內 調用write方法時,從緩衝區那數據些fos.write(arr,0,arr.length)
字符流:要聲明一個char類型的數組




Day22又遲到了,早點來,
ip地址: ipv4協議 32位二進制組成 用十進制表示 取值範圍 0~255 在同一個局域網下,不可能出現相同的ip如192.168.1.80 代表本機的IP 127.0.0.1
InetAddress InetAddress.getByName("ip地址")。 java提供了關於ip的工具類InetAddress
該類無法實例化,要通過單利模式返回對象, getHostAddress()返回IP值,(字符串形式)
getHostName()返回電腦名, cmd查詢IP ipconfig 端口 端口號用來表示計算機上的應用程序
可以多個程序共享一個端口好,但是同一時間內,只能運行一個端口號相同的程序
否則,後開的程序,會頂掉之前的程序 端口的取值範圍0~65535 0~1024是系統給預留的端口,
儘量不要使用。查看端口號  netstat -nao FilenameFilter這個接口下面有個accept(file,String)測試指定文件是否應該包含在某一文件列表中。
TCP協議 UDP協議
需要建立連接 不需要建立連接
三次握手連接 1.效率較高
2.TCP效率較低 每次傳輸建議不超過1k
原因1 建立連接會花費時間
原因2 必須保證連接不會中斷
會不斷查看連接狀態
3.可以傳輸大量數據
建立UDP連接 


DatagramSocket 這個類用來發送和接受數據包
DatagramPacket 這個是數據包  常用的 DAtagramPacket(btye[] buf)
發送端 


接受端


BufferedReader br = 
建立TCP/IP連接 
severSecket 實現此類服務器的套接字
服務器


客戶端

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