????程序猿一枚,工作小半年夸溶,對(duì)Java的理解已經(jīng)遠(yuǎn)超剛剛離開學(xué)校是的那一枚小白了逸吵。身邊的學(xué)弟陸陸續(xù)續(xù)入坑,不過(guò)經(jīng)常找我抱怨發(fā)牢騷總是找不到正確的方向缝裁,該朝哪個(gè)方向發(fā)展扫皱,該怎么學(xué)習(xí)足绅。這邊就抽一晚上寫一下第一階段總結(jié),也當(dāng)是鞏固學(xué)習(xí)的知識(shí)吧韩脑。如果說(shuō)的不夠全面或者是不對(duì)的地方氢妈,還望補(bǔ)充與指出錯(cuò)誤,虛心學(xué)習(xí)段多。
? ? 不說(shuō)Java的歷史了首量,這邊直接上干貨,不要把編程想太難太復(fù)雜进苍,就把它當(dāng)作是一個(gè)工具加缘,程序員使用工具完成想要做的事情。不過(guò)當(dāng)你對(duì)這個(gè)工具的理解程度達(dá)到一定的層次觉啊,使用起來(lái)就會(huì)更加得心應(yīng)手了拣宏。
首先 Java 到底可以做什么:
1、 大型網(wǎng)站杠人,主要使用JAVA EE勋乾,最有名例子就是電子商務(wù)交易平臺(tái)阿里巴巴,淘寶嗡善,京東
2辑莫、 大型企業(yè)級(jí)應(yīng)用,主要使用JAVA EE滤奈,比如大型企業(yè)管理系統(tǒng)摆昧,CRM系統(tǒng),ERP系統(tǒng)
2.1 有關(guān)通信及網(wǎng)絡(luò)的大型企業(yè):移動(dòng)蜒程、聯(lián)通绅你、電信、網(wǎng)通主要的信息化都是JAVA
2.2 有關(guān)金融行的大型企業(yè)昭躺,所有的銀行忌锯、證券公司,互聯(lián)網(wǎng)金融领炫;
2.3 大型管理系統(tǒng)偶垮,如:供應(yīng)鏈,客戶管理系統(tǒng)帝洪,物流系統(tǒng)……似舵;
3、 電子政務(wù)葱峡,主要使用JAVA EE砚哗,相關(guān)的政府部門絕大多數(shù)的信息化系統(tǒng)是JAVA開發(fā)的;
4砰奕、 游戲蛛芥,很多手機(jī)游戲都是用JAVA開發(fā)的提鸟。包括大型網(wǎng)游的后臺(tái)數(shù)據(jù)統(tǒng)計(jì)都是java
5、 嵌入式設(shè)備及消費(fèi)類電子產(chǎn)品仅淑,主要用 JAVA ME,無(wú)線手持設(shè)備称勋、通信終端、醫(yī)療設(shè)備涯竟、信息家電(如數(shù)字電視赡鲜、機(jī)頂盒、電冰箱)庐船、汽車電子設(shè)備等是比較熱門的Java應(yīng)用領(lǐng)域蝗蛙,這方面的應(yīng)用例子有中國(guó)聯(lián)通CDMA 1X網(wǎng)絡(luò)中基于Java技術(shù)的無(wú)線
6、各大旅游網(wǎng)站基本都是使用java做的開發(fā)
7醉鳖、我們出行的交通工具的訂票系統(tǒng)絕大部分也是使用java開發(fā)的
8、現(xiàn)在比較流行的大數(shù)據(jù)哮内,最主流的大數(shù)據(jù)框架Hadoop的應(yīng)用主要用Java開發(fā)盗棵。Java最大的優(yōu)勢(shì)之一就是它在大數(shù)據(jù)領(lǐng)域的地位,目前很多的大數(shù)據(jù)架構(gòu)都是通過(guò)Java來(lái)完成的
?Java的分類
java主要分成三個(gè)部分javaSE北发,javaME纹因,javaEE。
JAVA SE是學(xué)習(xí)JAVA EE琳拨、JAVA ME的基礎(chǔ)瞭恰,也可以做本地的軟件,通俗講就是做單機(jī)版的軟件狱庇;?
JAVA EE主要是開發(fā)基于Web的系統(tǒng)惊畏,針對(duì)互聯(lián)網(wǎng)的各種應(yīng)用和大型復(fù)雜的項(xiàng)目給出解決方案
JAVA ME是用來(lái)開發(fā)游戲、電子設(shè)備密任、手機(jī)等方面的軟件颜启。
JavaSE
這一期我們主要講的是JavaSE,是學(xué)習(xí)Java必須學(xué)習(xí)的浪讳,是最基礎(chǔ)的缰盏。包含Java所有的基礎(chǔ)語(yǔ)法知識(shí)。
一淹遵、標(biāo)識(shí)符和關(guān)鍵字?
?????????? 1. 標(biāo)識(shí)符
1. 在java語(yǔ)言中口猜,用來(lái)標(biāo)志類名远寸、對(duì)象名渡讼、變量名阅束、方法名括袒、類型名犯犁、數(shù)組名沃斤、包名的有效字符序列蛋铆,稱為“標(biāo)識(shí)符”触幼;
2. 標(biāo)識(shí)符由字母、數(shù)字恨闪、下劃線倘感、美元符號(hào)組成,且第一個(gè)字符不能是數(shù)字咙咽;
3. java語(yǔ)言區(qū)分大小寫老玛;
?????????????? ? ? 4. 標(biāo)志符命名規(guī)則:類名首字母大寫,變量名和方法名采用駝峰標(biāo)志法钧敞,包名全小寫蜡豹,常量全大寫,多個(gè)單詞之間用“_”隔開溉苛;
?????????? 2. 關(guān)鍵字
?????????????????? 1. 在java語(yǔ)言中镜廉,有一些專門的詞匯已經(jīng)被賦予了特殊的含義,不能再使用這些詞匯來(lái)命名標(biāo)識(shí)符愚战,這些專有詞匯娇唯,稱為“關(guān)鍵字”;
???????????????? ? 2. java有50個(gè)關(guān)鍵字和3個(gè)保留字寂玲,均不能用來(lái)命名標(biāo)識(shí)符塔插;
?????????????????? 3. true、false拓哟、null不是關(guān)鍵字想许,是保留字,但是仍不能用來(lái)命名標(biāo)識(shí)符断序;
??? 二流纹、數(shù)據(jù)類型
?
? ? 三、運(yùn)算符與表達(dá)式
?????????? 1. 算數(shù)運(yùn)算符:加(+)逢倍,減(-)捧颅,乘(*),除(/)较雕,求余(%)
?????????? 2. 賦值運(yùn)算符:=碉哑,+=,-=亮蒋,*=扣典,%=
?????????? 3. 關(guān)系運(yùn)算符:>,<慎玖,>=贮尖,<=,==趁怔,!=
?????????? 4. 邏輯運(yùn)算符:[&&湿硝,||](只有左側(cè)滿足才計(jì)算右側(cè))薪前,!,[&关斜,|](不管左側(cè)結(jié)果如何示括,都要計(jì)算右側(cè))
?????????? 5. 三目運(yùn)算符:(表達(dá)式) ? 值1,值2痢畜;
?? 四垛膝、流程控制語(yǔ)句
?????????? 1. 條件分支語(yǔ)句:if語(yǔ)句,switch語(yǔ)句
?????????? 2. 循環(huán)語(yǔ)句:while循環(huán)丁稀,do while循環(huán)吼拥,for循環(huán),foreach循環(huán)
四:數(shù)組
??????? 一线衫、數(shù)組概述
?1. 數(shù)組的概念:相同數(shù)據(jù)類型元素的集合
?????????????? ??? 2. 數(shù)組的作用:用來(lái)存儲(chǔ)基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的數(shù)據(jù)
二凿可、數(shù)組的創(chuàng)建及排序?
publicclass TestArray {
? ? publicstaticvoid main(String[] args) {
? ? ? ? /**? ? ? ? * 1. 數(shù)組的初始化
? ? ? ? */// 1.1 數(shù)組的靜態(tài)初始化int[] array1 = { 1, 3, 5, 6, 7, 2, 4, 10 };
? ? ? ? // 1.2 數(shù)組的動(dòng)態(tài)初始化int[] array2 =newint[5];
? ? ? ? array2[0] = 1;
? ? ? ? array2[1] = 2;
? ? ? ? array2[2] = 7;
? ? ? ? array2[3] = 3;
? ? ? ? array2[4] = 4;
? ? ? ? /**? ? ? ? * 2. 數(shù)組的遍歷
? ? ? ? */// 2.1 for循環(huán)打印數(shù)組for(inti = 0; i < array2.length; i++) {
? ? ? ? ? ? System.out.print(array2[i]);
? ? ? ? }
? ? ? ? // 2.2 foreach打印數(shù)組for(int i : array2) {
? ? ? ? ? ? System.out.print(i);
? ? ? ? }
? ? ? ? /**? ? ? ? * 3. 數(shù)組排序
? ? ? ? */// 3.1 冒泡排序for(inti = 0; i < array2.length; i++) {
? ? ? ? ? ? for(intj = i + 1; j < array2.length; j++) {
? ? ? ? ? ? ? ? // 1. 比較相鄰元素,將較大的數(shù)冒泡if(array2[i] > array2[j]) {
? ? ? ? ? ? ? ? ? ? // 2. 交換inttemp = array2[i];
? ? ? ? ? ? ? ? ? ? array2[i] = array2[j];
? ? ? ? ? ? ? ? ? ? array2[j] = temp;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? for(int i : array2) {
? ? ? ? ? ? System.out.println(i);
? ? ? ? }
? ? ? ? // 3.2 選擇排序for(inti = 0; i < array2.length; i++) {
? ? ? ? ? ? intmin = i;
? ? ? ? ? ? for(intj = i; j < array2.length; j++) {
? ? ? ? ? ? ? ? // 1. 找到最小的數(shù)if(array2[j] < array2[min]) {
? ? ? ? ? ? ? ? ? ? // 2. 將最小的數(shù)賦值給minmin = j;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? // 3. 交換兩個(gè)數(shù)的位置inttemp = array2[i];
? ? ? ? ? ? array2[i] = array2[min];
? ? ? ? ? ? array2[min] = temp;
? ? ? ? }
? ? ? ? for(int i : array2) {
? ? ? ? ? ? System.out.println(i);
? ? ? ? }
? ? ? ? // 3.3 反轉(zhuǎn)排序for(inti = 0; i < array2.length / 2; i++) {
? ? ? ? ? ? // 將第i位元素與array2.length-1-i位元素交換inttemp = array2[i];
? ? ? ? ? ? array2[i] = array2[array2.length - 1 - i];
? ? ? ? ? ? array2[array2.length - 1 - i] = temp;
? ? ? ? }
? ? ? ? for(int i : array2) {
? ? ? ? ? ? System.out.println(i);
? ? ? ? }
? ? ? ? // 3.4 插入排序for(inti = 0; i < array2.length; i++) {
? ? ? ? ? ? intj = i;
? ? ? ? ? ? inttmp = array2[i];
? ? ? ? ? ? for(; j > 0 && tmp < array2[j - 1]; j--) {
? ? ? ? ? ? ? ? // 1. 將大于待排序的數(shù)向后移array2[j] = array2[j - 1];
? ? ? ? ? ? }
? ? ? ? ? ? // 2. 交換array2[j] = tmp;
? ? ? ? }
? ? ? ? for(int i : array2) {
? ? ? ? ? ? System.out.println(i);
? ? ? ? }
? ? ? ? }
}
數(shù)組的初始化及排序代碼實(shí)現(xiàn)
????三授账、Arrays工具類常用方法
import java.util.Arrays;publicclass TestArray {
? ? publicstaticvoid main(String[] args) {
? ? ? ? int[] array1 = { 1, 3, 5, 2, 4 };
? ? ? ? int[] array2 = {3,2};
? ? ? ? // 1. 排序? ? ? ? Arrays.sort(array2);
? ? ? ? for(int i : array2) {
? ? ? ? ? ? System.out.print(i);
? ? ? ? }
? ? ? ? // 2. 二分法查找System.out.print(Arrays.binarySearch(array2, 3));
? ? ? ? // 3. 數(shù)組元素比較? ? ? ? System.out.println(Arrays.equals(array1, array2));
? ? ? ? // 4. 數(shù)組元素填充Arrays.fill(array2, 1);
? ? ? ? for(int j : array2) {
? ? ? ? ? ? System.out.println(j);
? ? ? ? }
? ? }
}
Arrays工具類常用方法代碼實(shí)現(xiàn)
五:面向?qū)ο?/b>
?一矿酵、封裝
?1. 核心思想:隱藏細(xì)節(jié),保護(hù)數(shù)據(jù)安全矗积。
???????????????? 2. 訪問(wèn)權(quán)限
publicclass Encapsulation {
? ? // 1.成員屬性私有化private String name;
? ? private String pwd;
? ? // 2.提供getter和setter方法來(lái)訪問(wèn)public String getName() {
? ? ? ? return name;
? ? }
? ? publicvoid setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public String getPwd() {
? ? ? ? return pwd;
? ? }
? ? publicvoid setPwd(String pwd) {
? ? ? ? this.pwd = pwd;
? ? }
}class TestEncapsulation {
? ? publicstaticvoid main(String[] args) {
? ? ? ? Encapsulation test =new Encapsulation();
? ? ? ? // 3.通過(guò)setter方法設(shè)置屬性值test.setName("封裝");
? ? ? ? test.setPwd("666");
? ? ? ? // 4.通過(guò)getter方法獲取值System.out.println("姓名:" + test.getName() + " -- 密碼:" + test.getPwd());
? ? }
}
封裝代碼實(shí)現(xiàn)
?二、方法的重載和重寫
?1. 方法的重載:方法名相同敞咧,參數(shù)列表不同
????????????? ?? 2. 方法的重寫:方法名棘捣、返回值類型、參數(shù)列表都相同休建,構(gòu)造方法和使用final乍恐、static修飾的方法不能被重寫
三、繼承?
? 1. 核心思想:解決代碼冗余测砂,提高代碼的復(fù)用性
???????????????? 2. 繼承關(guān)系:滿足is-a的關(guān)系茵烈,父類更通用,子類更具體砌些。
/** * 1. 將類中重復(fù)的部分提取成為父類
*/publicclass Animal {
? ? private String name;
? ? private String food;
? ? public Animal(String name, String food) {
? ? ? ? this.name = name;
? ? ? ? this.food = food;
? ? }
? ? publicvoid eat() {
? ? ? ? System.out.println(name + "正在吃" + food);
? ? }
}/** * 2. 子類繼承父類呜投,對(duì)父類進(jìn)行擴(kuò)展
*/publicclassCatextends Animal {
? ? public Cat(String name, String food) {
? ? ? ? super(name, food);
? ? }
}publicclassDogextends Animal{
? ? public Dog(String name, String food) {
? ? ? ? super(name, food);
? ? }
}/** * 3. 測(cè)試
*/publicclass TestExtends{
? ? publicstaticvoid main(String[] args) {
? ? ? ? Animal cat =newCat("三三", "魚");
? ? ? ? cat.eat();
? ? ? ? Animal dog =newDog("二哈", "香腸");
? ? ? ? cat.eat();
? ? }
}
繼承代碼實(shí)現(xiàn)
??? 四、多態(tài)
???????????????? 1. 核心思想:提高代碼可維護(hù)性和可擴(kuò)展性
???????????????? 2. 實(shí)現(xiàn)多態(tài)的三個(gè)必要條件:繼承存璃、重寫仑荐、父類引用指向子類對(duì)象(向下轉(zhuǎn)型)
???????????????? 3. 多態(tài)的實(shí)現(xiàn)方式:重寫、接口纵东、抽象類和抽象方法
/** * 1. 創(chuàng)建動(dòng)物類粘招,定義動(dòng)物吃什么的方法
*/class Animals {
? ? private String name;
? ? private String food;
? ? public Animals(String name, String food) {
? ? ? ? super();
? ? ? ? this.name = name;
? ? ? ? this.food = food;
? ? }
? ? publicvoid eat() {
? ? ? ? System.out.println(this.name + "會(huì)吃" +this.food);
? ? }
}/** * 2. 創(chuàng)建Cat類來(lái)實(shí)現(xiàn)吃的功能
*/classCatextends Animals{
? ? public Cat(String name, String food) {
? ? ? ? super(name, food);
? ? }
? ? @Override
? ? publicvoid eat() {
? ? ? ? super.eat();
? ? }
}/** * 3. 通過(guò)向上轉(zhuǎn)型和向下轉(zhuǎn)型實(shí)現(xiàn)多態(tài)
*/publicclass Test01 {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 向下轉(zhuǎn)型Animals animals =newCat("三三", "魚");
? ? ? ? animals.eat();
? ? ? ? // 向上轉(zhuǎn)型Cat cat = (Cat) animals;
? ? ? ? cat.eat();
? ? }
}
多態(tài)代碼實(shí)現(xiàn)
? ? ? ?? 五、抽象類
???????????????? 1. 核心思想:讓代碼有更強(qiáng)的可擴(kuò)展性
2. 特點(diǎn):
??????????????????????????? 1. 抽象類不能實(shí)例化對(duì)象偎球。
2.?如果一個(gè)類包含抽象方法洒扎,那么該類必須是抽象類辑甜。
?3. 任何子類必須重寫父類的抽象方法(具體實(shí)現(xiàn)),或者聲明自身為抽象類袍冷。
??????????????????????????? 4. 抽象類中的抽象方法只有方法聲明磷醋,沒(méi)有方法體
??????????????????????????? 5. 構(gòu)造方法和static修飾的方法不能聲明為抽象方法
/** * 1. 創(chuàng)建員工抽象類
*/abstractclass Employees {
? ? // 成員變量private String name;
? ? private String address;
? ? private Integer number;
? ? // 構(gòu)造方法public Employees(String name, String address, Integer number) {
? ? ? ? System.out.println("Employees.Employees()");
? ? ? ? this.name = name;
? ? ? ? this.address = address;
? ? ? ? this.number = number;
? ? }
? ? // 定義信息抽象函數(shù)publicabstractvoid call();
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? publicvoid setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public String getAddress() {
? ? ? ? return address;
? ? }
? ? publicvoid setAddress(String address) {
? ? ? ? this.address = address;
? ? }
? ? public Integer getNumber() {
? ? ? ? return number;
? ? }
? ? publicvoid setNumber(Integer number) {
? ? ? ? this.number = number;
? ? }
}classSalaryextends Employees {
? ? private Double salary;
? ? public Salary(String name, String address, Integer number, Double salary) {
? ? ? ? super(name, address, number);
? ? ? ? this.salary = salary;
? ? ? ? System.out.println("Salary.Salary()");
? ? }
? ? // 2. 重寫父類的抽象方法? ? @Override
? ? publicvoid call() {
? ? ? ? System.out.println(super.getNumber() + "是" +super.getName() + "的電話,他住在" +super.getAddress() + "他現(xiàn)在的工資是" +this.salary);
? ? }
}publicclass Test {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 3. 抽象類的對(duì)象必須由子類去實(shí)例化Employees emp =newSalary("孫悟空", "花果山", 1234, 222.66);
? ? ? ? emp.call();
? ? }
}
抽象類代碼實(shí)現(xiàn)
? ? ?? ? 六难裆、接口 ?????
???????????????? 1. 核心思想:讓代碼有更強(qiáng)的可擴(kuò)展性
2. 特點(diǎn):
??????????????????????????? 1. 接口不能實(shí)例化對(duì)象子檀,沒(méi)有構(gòu)造方法
2.?接口中的方法只能是抽象方法,默認(rèn)使用public abstract修飾
?3. 接口中的變量只能是常量乃戈,默認(rèn)使用public static final修飾
?? 4. 接口支持多繼承褂痰,但接口不是被繼承了,而是被實(shí)現(xiàn)了
??????????????? 3. 接口和抽象類的區(qū)別
?1.?接口中的方法只能是抽象方法症虑,而抽象類中的方法可以是普通方法缩歪,構(gòu)造方法和抽象方法
2.?接口中的變量只能是常量,而抽象類中的方法可以是任意類型
?3. 接口中不能含有靜態(tài)代碼塊和靜態(tài)方法谍憔,而抽象類中可以有
?? 4. 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口匪蝙,但一個(gè)類只能繼承一個(gè)抽象類
/** * 1. 創(chuàng)建Animal接口
*/interface Animal {
? ? // 定義睡覺(jué)抽象方法void sleep();
? ? // 定義吃飯抽象方法void eat();
}/** * 2. 創(chuàng)建Dog接口繼承Animal接口
*/interfaceDogextends Animal {
? ? // 定義游泳抽象方法void swim();
}/** * 3. 創(chuàng)建HaShiQi接口繼承Dog和Animal接口,實(shí)現(xiàn)多繼承
*/interfaceHaShiQiextends Dog, Animal {
? ? // 定義拆家抽象方法void demolishedFamily();
}/** * 4. 創(chuàng)建測(cè)試類來(lái)實(shí)現(xiàn)接口习贫,并且復(fù)寫所有抽象方法
*/publicclassTestAnimalimplements HaShiQi {
? ? @Override
? ? publicvoid swim() {
? ? ? ? System.out.println("哈士奇會(huì)游泳");
? ? }
? ? @Override
? ? publicvoid sleep() {
? ? ? ? System.out.println("哈士奇會(huì)睡覺(jué)");
? ? }
? ? @Override
? ? publicvoid eat() {
? ? ? ? System.out.println("哈士奇喜歡吃苦瓜");
? ? }
? ? @Override
? ? publicvoid demolishedFamily() {
? ? ? ? System.out.println("哈士奇會(huì)拆家");
? ? }
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 使用多態(tài)實(shí)例化對(duì)象HaShiQi dog =new TestAnimal();
? ? ? ? dog.eat();
? ? ? ? dog.sleep();
? ? ? ? dog.demolishedFamily();
? ? ? ? dog.swim();
? ? }
}
接口實(shí)現(xiàn)代碼
六:集合
??????一逛球、集合簡(jiǎn)介
?集合的主要作用是存儲(chǔ)引用類型數(shù)據(jù),長(zhǎng)度可以動(dòng)態(tài)的改變苫昌,解決了存儲(chǔ)數(shù)據(jù)數(shù)量不確定的問(wèn)題
??????二颤绕、Collection集合體系
?
???????????????? 一、Collection常用方法
?二奥务、不同集合的使用場(chǎng)景
import java.util.ArrayList;import java.util.Iterator;import java.util.List;/** * 創(chuàng)建學(xué)生類
*/class Student {
? ? // 學(xué)號(hào)private Integer id;
? ? // 姓名private String name;
? ? public Student(Integer id, String name) {
? ? ? ? this.id = id;
? ? ? ? this.name = name;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return"Student [id=" + id + ", name=" + name + "]";
? ? }
}publicclass TestCollection {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 1. 創(chuàng)建集合存儲(chǔ)String類型數(shù)據(jù)List list =newArrayList();
? ? ? ? // 2.向集合中添加元素list.add("豬豬俠");
? ? ? ? list.add("超人強(qiáng)");
? ? ? ? list.add("波比");
? ? ? ? list.add("小菲菲");
? ? ? ? // 3. 遍歷集合
? ? ? ? // 3.1普通for循環(huán)String[] strArray =new String[list.size()];
? ? ? ? list.toArray(strArray); // 將集合轉(zhuǎn)換為數(shù)組for(inti = 0; i < strArray.length; i++) {
? ? ? ? ? ? System.out.println(strArray[i]);
? ? ? ? }
? ? ? ? // 3.2 foreach循環(huán)for (String str : list) {
? ? ? ? ? ? System.out.println(str);
? ? ? ? }
? ? ? ? // 3.3 迭代器遍歷Iterator iterator = list.iterator();
? ? ? ? while(iterator.hasNext()) {// hasNext():判斷指針后是否有下一個(gè)元素System.out.println(iterator.next());// next():返回指針后的元素? ? ? ? }
? ? ? ? // 4. 判斷集合中是否包含某元素System.out.println(list.contains("小菲菲"));// true
? ? ? ? // 5. 判斷集合是否為空System.out.println(list.isEmpty());// false
? ? ? ? // 6. 清除集合中所有元素? ? ? ? list.clear();
? ? ? ? System.out.println(list.isEmpty()); // trueSystem.out.println("---------------------------------------------------");
? ? ? ? // 創(chuàng)建集合存儲(chǔ)對(duì)象類型數(shù)據(jù)List list2 =newArrayList();
? ? ? ? // 向集合中添加對(duì)象類型數(shù)據(jù)list2.add(newStudent(1, "張三"));
? ? ? ? list2.add(newStudent(2, "李四"));
? ? ? ? // foreach遍歷集合for (Student student : list2) {
? ? ? ? ? ? System.out.println(student);
? ? ? ? }
? ? ? ? // 迭代器遍歷集合Iterator iterator2 = list2.iterator();
? ? ? ? while (iterator2.hasNext()) {
? ? ? ? ? ? Student student = iterator2.next();
? ? ? ? ? ? System.out.println(student);
? ? ? ? }
? ? }
}
Collection集合代碼實(shí)現(xiàn)
????? 三氯葬、Map集合體系
?
import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import javax.enterprise.inject.New;class Teacher {
? ? private String name;
? ? private Integer age;
? ? public Teacher(String name, Integer age) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return"Teacher [name=" + name + ", age=" + age + "]";
? ? }
}publicclass TestMap {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 1. 創(chuàng)建Map集合存儲(chǔ)學(xué)號(hào)和姓名Map map =newHashMap();
? ? ? ? // 2. 向map集合中添加元素map.put(1, "張三");
? ? ? ? map.put(2, "李四");
? ? ? ? map.put(3, "王五");
? ? ? ? // 3. 遍歷map集合
? ? ? ? // 3.1 通過(guò)map.keySet()遍歷集合for (Integer key : map.keySet()) {
? ? ? ? ? ? System.out.println("key=" + key + " value=" + map.get(key));
? ? ? ? }
? ? ? ? // 3.2 通過(guò)迭代器遍歷集合Iterator> iterator = map.entrySet().iterator();
? ? ? ? while (iterator.hasNext()) {
? ? ? ? ? ? Map.Entry entry = iterator.next();
? ? ? ? ? ? System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());
? ? ? ? }
? ? ? ? // 3.3 通過(guò)map.entrySet()遍歷集合for(Entry entry : map.entrySet()) {
? ? ? ? ? ? System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());
? ? ? ? }
? ? ? ? // 4. 判斷集合中是否包含指定鍵System.out.println(map.containsKey("1"));// trueSystem.out.println(map.containsValue("list"));// false
? ? ? ? // 5. 判斷集合是否為空System.out.println(map.isEmpty());// false
? ? ? ? // 6. 清除集合中所有元素? ? ? ? map.clear();
? ? ? ? System.out.println(map.isEmpty()); // trueSystem.out.println("----------------------------------------");
? ? ? ? // 1. 創(chuàng)建Map集合存儲(chǔ)對(duì)象類型數(shù)據(jù)Map map2 =newHashMap();
? ? ? ? // 2. 向Map集合中添加對(duì)象類型數(shù)據(jù)map2.put(1,newTeacher("張三", 18));
? ? ? ? map2.put(2,newTeacher("李四", 19));
? ? ? ? map2.put(3,newTeacher("王五", 20));
? ? ? ? // 3. 遍歷集合
? ? ? ? // 3.1 通過(guò)map.keySet()遍歷for (Integer key : map2.keySet()) {
? ? ? ? ? ? System.out.println("key=" + key + " value=" + map2.get(key));
? ? ? ? }
? ? ? ? // 3.2 通過(guò)迭代器遍歷集合Iterator> iterator2 = map2.entrySet().iterator();
? ? ? ? while (iterator2.hasNext()) {
? ? ? ? ? ? Entry entry = iterator2.next();
? ? ? ? ? ? System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());
? ? ? ? }
? ? ? ? // 3.3 通過(guò)map.entrySet()遍歷集合for(Entry entry : map2.entrySet()) {
? ? ? ? ? ? System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());
? ? ? ? }
? ? }
}
Map集合代碼實(shí)現(xiàn)
七:IO流
???????????一、IO流簡(jiǎn)介
?1. 流的概念:流是有起點(diǎn)和終點(diǎn)的一組有順序的字節(jié)集合婉陷,作用是進(jìn)行數(shù)據(jù)傳輸
??????????????????????? 2. 流的分類:
???????????????????????????????????????? 1. 按照數(shù)據(jù)流向不同可以分為輸入輸出流帚称;
???????????????????????????????????????? 2. 按照處理數(shù)據(jù)單位不同可以分為字節(jié)流和字符流
??????????????????????? 3. 輸入流和輸出流的作用
???????????????????????????????????????? 1. 輸入流:程序從數(shù)據(jù)源讀取數(shù)據(jù)
???????????????????????????????????????? 2. 輸出流:將數(shù)據(jù)從程序中寫入指定文件
??????????????????????? 4. 字節(jié)流和字符流的作用
????????????????????????????????????? ? 1. 字節(jié)流:以字節(jié)為單位處理所有類型數(shù)據(jù) ?????????????????????????
???????????????????????????????????? ? ? ?? ? 2. 字符流:以字符為單位處理純文本文件
?????????? 二、IO流體系
?
?三秽澳、IO流常用方法
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/** * 1. 文本文件復(fù)制
* @author DELL
*
*/publicclass TestIO {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 要讀取的文件String src = "E:/Workspaces1/Demo/src/TestFile.java";
? ? ? ? // 要寫入的文件String dest = "d:/test.java";
? ? ? ? // 1.1 一次復(fù)制一個(gè)字節(jié)? ? ? ? copyFile1(src, dest);
? ? ? ? // 1.2 一次復(fù)制一個(gè)字節(jié)數(shù)組? ? ? ? copyFile2(src, dest);
? ? ? ? // 2.1 一次復(fù)制一個(gè)字符? ? ? ? copyFile3(src, dest);
? ? ? ? // 2.2 一次復(fù)制一個(gè)字符數(shù)組? ? ? ? copyFile4(src, dest);
? ? }
? ? // 1. 一次復(fù)制一個(gè)字節(jié)世杀,異常處理,手動(dòng)關(guān)閉流publicstaticvoid copyFile1(String srcFileName, String destFileName) {
? ? ? ? FileInputStream fis =null;
? ? ? ? FileOutputStream fos =null;
? ? ? ? try {
? ? ? ? ? ? fis =new FileInputStream(srcFileName);
? ? ? ? ? ? fos =new FileOutputStream(destFileName);
? ? ? ? ? ? intcc = fis.read();
? ? ? ? ? ? while(cc != -1) {
? ? ? ? ? ? ? ? // 一次寫入一個(gè)字節(jié)? ? ? ? ? ? ? ? fos.write(cc);
? ? ? ? ? ? ? ? // 一次寫入一個(gè)字節(jié)cc = fis.read();
? ? ? ? ? ? }
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? if(fos !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? fos.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if(fis !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? fis.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? // 2. 一次復(fù)制一個(gè)字節(jié)數(shù)組肝集,異常處理瞻坝,自動(dòng)關(guān)閉流publicstaticvoid copyFile2(String srcFileName, String destFileName) {
? ? ? ? // 自動(dòng)關(guān)閉流try (
? ? ? ? ? ? ? ? FileInputStream fis =new FileInputStream(srcFileName);
? ? ? ? ? ? ? ? FileOutputStream fos =new FileOutputStream(destFileName);
? ? ? ? ? ? ? ? ) {
? ? ? ? ? ? byte[] bytes =newbyte[1024];
? ? ? ? ? ? intlen = fis.read(bytes);
? ? ? ? ? ? while(len != -1) {
? ? ? ? ? ? ? ? // 一次寫入一個(gè)字節(jié)數(shù)組fos.write(bytes, 0, len);
? ? ? ? ? ? ? ? // 一次讀取一個(gè)字節(jié)數(shù)組len = fis.read(bytes);
? ? ? ? ? ? }
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? // 3. 一次復(fù)制一個(gè)字符,異常處理,自動(dòng)關(guān)閉流publicstaticvoid copyFile3(String srcFileName, String destFileName) {
? ? ? ? try (
? ? ? ? ? ? ? ? FileReader fr =new FileReader(srcFileName);
? ? ? ? ? ? ? ? FileWriter fw =new FileWriter(destFileName);
? ? ? ? ? ? ? ? ){
? ? ? ? ? ? intcc = fr.read();
? ? ? ? ? ? while(cc != -1) {
? ? ? ? ? ? ? ? // 一次寫入一個(gè)字符? ? ? ? ? ? ? ? fw.write(cc);
? ? ? ? ? ? ? ? // 一次讀取一個(gè)字符cc = fr.read();
? ? ? ? ? ? }
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? // 4. 一次復(fù)制一個(gè)字符數(shù)組所刀,異常處理衙荐,手動(dòng)關(guān)閉流publicstaticvoid copyFile4(String srcFileName, String destFileName) {
? ? ? ? FileReader fr =null;
? ? ? ? FileWriter fw =null;
? ? ? ? try {
? ? ? ? ? ? fr =new FileReader(srcFileName);
? ? ? ? ? ? fw =new FileWriter(destFileName);
? ? ? ? ? ? char[] cbuf =newchar[1024];
? ? ? ? ? ? intlen = fr.read(cbuf);
? ? ? ? ? ? while(len != -1) {
? ? ? ? ? ? ? ? // 一次寫入一個(gè)字符數(shù)組? ? ? ? ? ? ? ? fw.write(cbuf);
? ? ? ? ? ? ? ? // 一次讀取一個(gè)字符數(shù)組len = fr.read(cbuf);
? ? ? ? ? ? }
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? if(fw !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? fw.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if(fr !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? fr.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
文本文件復(fù)制代碼實(shí)現(xiàn)
import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 1. 序列化和反序列化的概念
*? ? ? ? ? 1. 對(duì)象序列化:把對(duì)象轉(zhuǎn)換為字節(jié)序列(二進(jìn)制數(shù)據(jù))的過(guò)程
*? ? ? ? ? 2. 對(duì)象反序列化:把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程
*
* 2. 什么情況下需要序列化:
*? ? ? ? ? 1. 將對(duì)象保存到文件或數(shù)據(jù)庫(kù)中時(shí)
*? ? ? ? ? 2. 使用套接字在網(wǎng)上傳送對(duì)象時(shí)
*? ? ? ? ? 3. 通過(guò)RMI傳輸對(duì)象時(shí)
*
* 3. 如何實(shí)現(xiàn)序列化
*? ? ? ? ? 1. 創(chuàng)建類實(shí)現(xiàn)Serializable接口
*? ? ? ? ? 2. 指定serialVersionUID序列號(hào)
*? ? ? ? ? 3. 使用對(duì)象輸出流(ObjectOutputStream)將對(duì)象保存到指定位置
*? ? ? ? ? 4. 使用writerObject()方法將對(duì)象寫入到文件中
*? ? ? ? ?
*
* 4. 哪些屬性不能被序列化
*? ? ? ? ? 1. 使用transient修飾的屬性
*? ? ? ? ? 2. 使用static修飾的屬性
*? ? ? ? ?
*/// 1. 創(chuàng)建類實(shí)現(xiàn)Serializable接口classPeopleimplements Serializable {
? ? // 2. 指定序列號(hào)privatestaticfinallongserialVersionUID = 1L;
? ? // 靜態(tài)字段privatestaticString id = "2019";
? ? // transient關(guān)鍵字修飾的字段privatetransient String name;
? ? private Integer age;
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? publicvoid setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public Integer getAge() {
? ? ? ? return age;
? ? }
? ? publicvoid setAge(Integer age) {
? ? ? ? this.age = age;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return"People [name=" + name + ", age=" + age + "]";
? ? }
}publicclass Test {
? ? publicstaticvoidmain(String[] args)throws FileNotFoundException, IOException, ClassNotFoundException {
? ? ? ? serializePeople();
? ? ? ? deserializePeople();
? ? }
? ? /**? ? ? * 序列化
? ? */publicstaticvoidserializePeople()throws FileNotFoundException, IOException {
? ? ? ? People p =new People();
? ? ? ? p.setName("張三");
? ? ? ? p.setAge(18);
? ? ? ? // 3. 使用對(duì)象輸出流將對(duì)象保存到指定位置ObjectOutputStream oos =newObjectOutputStream(newFileOutputStream(newFile("D:/test.txt")));
? ? ? ? // 4. 將對(duì)象寫入文件? ? ? ? oos.writeObject(p);
? ? ? ? System.out.println("對(duì)象序列化成功!浮创!");
? ? ? ? oos.close();
? ? }
? ? /**? ? ? * 反序列化
? ? */publicstaticPeople deserializePeople()throws ClassNotFoundException, IOException {
? ? ? ? // 使用對(duì)象輸入流從指定位置讀取對(duì)象ObjectInputStream ois =newObjectInputStream(newFileInputStream(newFile("D:/test.txt")));
? ? ? ? // 讀取對(duì)象People p = (People) ois.readObject();
? ? ? ? System.out.println("對(duì)象反序列化成功S且鳌!");
? ? ? ? return p;
? ? }
}
序列化和反序列化總結(jié)及代碼實(shí)現(xiàn)
??????????? 四斩披、File類常用方法 ?
import java.io.File;import java.io.FileFilter;import java.io.IOException;import java.text.SimpleDateFormat;publicclass TestFile {
? ? publicstaticvoidmain(String[] args)throws IOException {
? ? ? ? // 1. 構(gòu)造方法指明文件路徑以及格式File file =newFile("D:\\test2\\test.txt");
? ? ? ? File file2 =newFile("D:\\test2");
? ? ? ? File file3 =newFile("D:\\test3");
? ? ? ? // 2.1 創(chuàng)建一個(gè)文件? ? ? ? file.createNewFile();
? ? ? ? // 2.2 創(chuàng)建一個(gè)單級(jí)目錄? ? ? ? file2.mkdir();
? ? ? ? // 2.3 創(chuàng)建一個(gè)多級(jí)目錄? ? ? ? file3.mkdirs();
? ? ? ? // 3.1 判斷文件或文件夾是否存在System.out.println(file.exists());// true
? ? ? ? // 3.2 判斷是否為絕對(duì)路徑System.out.println(file.isAbsolute());// true
? ? ? ? // 3.3 判斷是否為文件System.out.println(file2.isFile());// false
? ? ? ? // 3.4 判斷是否為目錄System.out.println(file2.isDirectory());// true
? ? ? ? // 3.5 判斷是否為隱藏文件System.out.println(file3.isHidden());// false
? ? ? ? // 4.1 獲取文件或目錄名稱? ? ? ? System.out.println(file.getName());
? ? ? ? // 4.2 獲取文件的絕對(duì)路徑? ? ? ? System.out.println(file.getAbsolutePath());
? ? ? ? // 4.3 獲取文件相對(duì)路徑? ? ? ? System.out.println(file.getPath());
? ? ? ? // 4.4 獲取文件父目錄? ? ? ? System.out.println(file.getParent());
? ? ? ? // 4.5 獲取文件大小? ? ? ? System.out.println(file.length());
? ? ? ? // 4.6 獲取文件最后一次被修改時(shí)間SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
? ? ? ? String updateTime = sdf.format(file.lastModified());
? ? ? ? System.out.println(updateTime);
? ? ? ? // 5.1 返回此目錄下的所有文件和目錄String [] fileString = file2.list();
? ? ? ? for (String str : fileString) {
? ? ? ? ? ? System.out.println(str);
? ? ? ? }
? ? ? ? // 5.2 返回此目錄下的所有文件File [] files = file2.listFiles();
? ? ? ? for (File file4 : files) {
? ? ? ? ? ? System.out.println(file4.getName());
? ? ? ? }
? ? ? ? // 5.3? 返回所有根目錄File [] files2 = File.listRoots();
? ? ? ? for (File file4 : files2) {
? ? ? ? ? ? System.out.println(file4);
? ? ? ? }
? ? ? ? // 5.4 返回指定目錄中符合過(guò)濾條件的文件和目錄File [] files3 = file2.listFiles(new FileFilter() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicboolean accept(File pathname) {
? ? ? ? ? ? ? ? while("a.txt".equals(pathname.getName())){
? ? ? ? ? ? ? ? ? ? returntrue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? returnfalse;
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? for (File file4 : files3) {
? ? ? ? ? ? System.out.println(file4.getName());
? ? ? ? }
? ? }
}
File類代碼實(shí)現(xiàn)
八:多線程
?一溜族、線程相關(guān)概念
?? ? 1. 線程和進(jìn)程
??????????????????????????????????????? 1. 進(jìn)程:操作系統(tǒng)中的應(yīng)用程序,一個(gè)進(jìn)程就是一個(gè)應(yīng)用程序
??????????????????????????????????????? 2. 線程:CPU調(diào)度的最小單元垦沉,進(jìn)程的一個(gè)執(zhí)行流
? ? ? ? ? ? ? ? ? ? ? ? ? 2. 上下文切換 ??????????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1. 上下文切換:CPU從一個(gè)線程或進(jìn)程切換到另一個(gè)進(jìn)程或線程煌抒;
??????????????????????????????????????? 2. 多線程程序并不是同時(shí)進(jìn)行的,由于CPU的執(zhí)行速度太快厕倍,CPU會(huì)在不同的線程之間快速的切換執(zhí)行寡壮;
? ? ? ? ??? 二、多線程的三種實(shí)現(xiàn)方式及優(yōu)缺點(diǎn)
import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;/** * 1. 創(chuàng)建多線程的三種方式
*? ? ? ? 1. 繼承Thread類
*? ? ? ?
*? ? ? ? 2. 實(shí)現(xiàn)Runnable接口
*? ? ? ? ? ? 1. 方式一:創(chuàng)建類實(shí)現(xiàn)Runnable接口
*? ? ? ? ? ? ? ? ? ? 1. 創(chuàng)建類實(shí)現(xiàn)Runnable接口
*? ? ? ? ? ? ? ? ? ? 2. 重寫run()方法
*? ? ? ? ? ? ? ? ? ? 3. 使用Thread類的構(gòu)造方法實(shí)例化實(shí)現(xiàn)Runnable接口的類對(duì)象
*? ? ? ? ? ? ? ? ? ? 4. 開啟線程
*? ? ? ? ? ? ?
*? ? ? ? ? ? 2. 方式二:使用匿名內(nèi)部類
*? ? ? ? ? ? ? ? ? ? 1. 使用Thread類的構(gòu)造方法創(chuàng)建一個(gè)Runnable接口的代理對(duì)象
*? ? ? ? ? ? ? ? ? ? 2. 重寫run()方法
*? ? ? ? ? ? ? ? ? ? 2. 開啟線程
*? ? ? ? ? ? ? ? ? ?
*? ? ? ? 3. 實(shí)現(xiàn)Callable接口
*? ? ? ? ? ? ? 1. 方式一:創(chuàng)建類實(shí)現(xiàn)Callable接口
*? ? ? ? ? ? ? ? ? ? 1. 創(chuàng)建類實(shí)現(xiàn)Callable接口
*? ? ? ? ? ? ? ? ? ? 2. 重寫call()方法
*? ? ? ? ? ? ? ? ? ? 3. 使用Thread類的構(gòu)造方法實(shí)例化FutureTask對(duì)象
*? ? ? ? ? ? ? ? ? ? 4. 使用FutureTask類的構(gòu)造方法實(shí)例化實(shí)現(xiàn)了Callable接口的類對(duì)象
*? ? ? ? ? ? ? ? ? ? 5. 開啟線程
*? ? ? ? ? ? ?
*? ? ? ? ? ? ? 2. 方式二:使用匿名內(nèi)部類
*? ? ? ? ? ? ? ? ? ? 1. 使用Thread類的構(gòu)造方法實(shí)例化FutureTask對(duì)象
*? ? ? ? ? ? ? ? ? ? 2. 使用FutureTask類的構(gòu)造方法創(chuàng)建Callable接口的代理對(duì)象
*? ? ? ? ? ? ? ? ? ? 3. 重寫call()方法
*? ? ? ? ? ? ? ? ? ? 4. 開啟線程
*? ? ? ? ? ? ? ? ? ?
* 2. 三種方式的優(yōu)缺點(diǎn)
*? ? ? ? 1. 繼承了Thread類
*? ? ? ? ? ? 1. 優(yōu)點(diǎn):代碼書寫簡(jiǎn)單
*? ? ? ? ? ? 2. 缺點(diǎn):由于Java的單繼承性讹弯,代碼的耦合度比較高
*? ? ? ? ? ?
*? ? ? ? 2. 實(shí)現(xiàn)了Runnable接口和Callable接口
*? ? ? ? ? ? 1. 方式一:
*? ? ? ? ? ? ? ? 1. 優(yōu)點(diǎn):代碼的可擴(kuò)展性更強(qiáng)
*? ? ? ? ? ? ? ? 2. 缺點(diǎn):沒(méi)有缺點(diǎn)
*? ? ? ? ? ? ? ?
*? ? ? ? ? ? 2. 方式二:
*? ? ? ? ? ? ? ? 1. 優(yōu)點(diǎn):代碼書寫簡(jiǎn)單
*? ? ? ? ? ? ? ? 2. 缺點(diǎn):只適合線程使用一次的時(shí)候
*//** * 1. 繼承Thread類
*/classThread1extends Thread{
? ? publicstaticvoid test() {
? ? ? ? for(inti = 0; i < 100; i++) {
? ? ? ? ? ? System.out.println("繼承Thread類執(zhí)行的第" + i + "次");
? ? ? ? }
? ? }
}/** * 2. 實(shí)現(xiàn)Runnable接口
*/classThread2implements Runnable{
? ? @Override
? ? publicvoid run() {
? ? ? ? for(inti = 0; i < 100; i++) {
? ? ? ? ? ? System.out.println("實(shí)現(xiàn)Runnable接口方式一執(zhí)行的第" + i + "次");
? ? ? ? }
? ? }
}/** * 3. 實(shí)現(xiàn)Callable接口
*/classThread3implementsCallable{
? ? @Override
? ? publicInteger call()throws Exception {
? ? ? ? inti = 0;
? ? ? ? for(; i < 100; i++) {
? ? ? ? ? ? System.out.println("實(shí)現(xiàn)Callable接口方式一執(zhí)行的第" + i + "次");
? ? ? ? }
? ? ? ? return i;
? ? }
}publicclass TestThread {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 1. 測(cè)試?yán)^承Thread類Thread1 thread1 =new Thread1();
? ? ? ? thread1.start();
? ? ? ? Thread1.test();
? ? ? ? // 2. 測(cè)試實(shí)現(xiàn)Runnable接口
? ? ? ? // 2.1 方式一newThread(new Thread2()).start();
? ? ? ? // 2.2 方式二newThread(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoid run() {
? ? ? ? ? ? ? ? for(inti = 0; i < 100; i++) {
? ? ? ? ? ? ? ? ? ? System.out.println("實(shí)現(xiàn)Runnable接口方式一執(zhí)行的第" + i + "次");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }).start();
? ? ? ? // 3. 測(cè)試實(shí)現(xiàn)Callable接口
? ? ? ? // 3.1 方式一newThread(newFutureTask(new Thread3() {
? ? ? ? }), "方式三").start();;
? ? ? ? // 3.2 方式二newThread(newFutureTask(newCallable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicInteger call()throws Exception {
? ? ? ? ? ? ? ? inti = 0;
? ? ? ? ? ? ? ? for(; i < 100; i++) {
? ? ? ? ? ? ? ? ? ? System.out.println("實(shí)現(xiàn)Runnable接口方式二執(zhí)行的第" + i + "次");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return i;
? ? ? ? ? ? }
? ? ? ? })).start();;
? ? }
}
多線程的三種實(shí)現(xiàn)方式及優(yōu)缺點(diǎn)
? ? ? ? ? ? 三况既、多線程常用方法 ?
??
publicclass TestThreadMethod {
? ? publicstaticvoid main(String[] args) {
? ? ? ? Thread thread =newThread(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoid run() {
? ? ? ? ? ? ? ? for(inti = 0; i < 100; i++) {
? ? ? ? ? ? ? ? ? ? // 獲取正在執(zhí)行的線程對(duì)象的引用System.out.println(Thread.currentThread().getName() + "執(zhí)行的第" + i + "次");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? // 1. 開啟線程? ? ? ? thread.start();
? ? ? ? // 2. 設(shè)置
? ? ? ? // 2.1 設(shè)置該線程名稱thread.setName("線程1號(hào)");
? ? ? ? // 2.2 設(shè)置該線程為守護(hù)線程:main方法結(jié)束之后該線程停止
? ? ? ? //thread.setDaemon(true);
? ? ? ? // 2.3 設(shè)置該線程的優(yōu)先級(jí)thread.setPriority(7);
? ? ? ? // 3. 獲取
? ? ? ? // 3.1 獲取線程名稱System.out.println(thread.getName());// 線程1號(hào)
? ? ? ? // 3.2 獲取線程標(biāo)識(shí)符System.out.println(thread.getId());// 13
? ? ? ? // 3.3 獲取線程優(yōu)先級(jí)System.out.println(thread.getPriority());// 7
? ? ? ? // 3.4 獲取線程狀態(tài)System.out.println(thread.getState());// RUNNABLE
? ? ? ? // 3.5 獲取線程所在線程組System.out.println(thread.getThreadGroup());// java.lang.ThreadGroup[name=main,maxpri=10]
? ? ? ? // 4. 判斷
? ? ? ? // 4.1 判斷線程是否中斷System.out.println(thread.isInterrupted());// false
? ? ? ? // 4.2 判斷線程是否為活動(dòng)狀態(tài)System.out.println(thread.isAlive());// true
? ? ? ? // 4.3 判斷線程是否為守護(hù)線程System.out.println(thread.isDaemon());// false
? ? ? ? // 5. 停
? ? ? ? // 5.1 讓線程休眠指定毫秒數(shù)newThread(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoid run() {
? ? ? ? ? ? ? ? for(inti = 0; i < 50; i++) {
? ? ? ? ? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + "執(zhí)行的第" + i + "次");
? ? ? ? ? ? ? ? ? ? if(i == 25) {
? ? ? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? ? ? /**? ? ? ? ? ? ? ? ? ? ? ? ? ? * 1. sleep()是靜態(tài)方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? * 2. sleep()使用時(shí)必須捕獲異常
? ? ? ? ? ? ? ? ? ? ? ? ? ? * 3. sleep()執(zhí)行時(shí),只是讓該線程進(jìn)入阻塞狀態(tài)组民,并不會(huì)釋放鎖
? ? ? ? ? ? ? ? ? ? ? ? ? ? */? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("線程2號(hào)正在休眠");
? ? ? ? ? ? ? ? ? ? ? ? ? ? Thread.sleep(5000);
? ? ? ? ? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? },"線程2號(hào)").start();
? ? ? ? // 5.2 暫停當(dāng)前線程去執(zhí)行其他線程newThread(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoid run() {
? ? ? ? ? ? ? ? for(inti = 0; i < 50; i++) {
? ? ? ? ? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + "執(zhí)行了" + i + "次");
? ? ? ? ? ? ? ? ? ? if(i == 25) {
? ? ? ? ? ? ? ? ? ? ? ? /**? ? ? ? ? ? ? ? ? ? ? ? * 1. yield()是靜態(tài)方法
? ? ? ? ? ? ? ? ? ? ? ? * 2. yield()執(zhí)行時(shí)棒仍,讓線程進(jìn)入就緒狀態(tài),重新爭(zhēng)搶CPU執(zhí)行權(quán)臭胜,并不會(huì)釋放鎖
? ? ? ? ? ? ? ? ? ? ? ? */? ? ? ? ? ? ? ? ? ? ? ? Thread.yield();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? },"線程3號(hào)").start();
? ? ? ? // 5.3 等待線程銷毀newThread(new Runnable() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoid run() {
? ? ? ? ? ? ? ? for(inti = 0; i < 100; i++) {
? ? ? ? ? ? ? ? ? ? if(i == 50) {
? ? ? ? ? ? ? ? ? ? ? ? /**? ? ? ? ? ? ? ? ? ? ? ? * 1. join()是對(duì)象方法
? ? ? ? ? ? ? ? ? ? ? ? * 2. join()使用時(shí)必須捕獲異常
? ? ? ? ? ? ? ? ? ? ? ? * 3. join()使用場(chǎng)景:一個(gè)執(zhí)行完的線程需要另一個(gè)正在執(zhí)行的線程的運(yùn)行結(jié)果時(shí)
? ? ? ? ? ? ? ? ? ? ? ? */? ? ? ? ? ? ? ? ? ? ? ? System.out.println("線程1號(hào)正在銷毀=岛荨!1永恪!");
? ? ? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? ? ? thread.join();
? ? ? ? ? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("線程1號(hào)銷毀成功7裎场B郎巍!临燃!");
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? },"線程4號(hào)").start();
? ? }
}
多線程常用方法代碼實(shí)現(xiàn)
?四睛驳、線程同步
import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 1. 線程安全
*? ? ? ? 1. 什么是線程安全:當(dāng)多個(gè)線程同時(shí)操作同一共享數(shù)據(jù)時(shí),導(dǎo)致共享數(shù)據(jù)出錯(cuò)
*? ? ? ? 2. 怎樣解決:使用線程同步技術(shù)
*? ? ? ?
* 2. 線程同步:將多個(gè)線程的數(shù)據(jù)共享
*
* 3. 實(shí)現(xiàn)線程同步的方式
*? ? ? ? 1. 同步代碼塊:有synchronized關(guān)鍵字修飾的語(yǔ)句塊
*? ? ? ? ? ? ? ? 1. 實(shí)例代碼塊:鎖對(duì)象是this或者任意對(duì)象
*? ? ? ? ? ? ? ? 2. 靜態(tài)代碼塊:鎖對(duì)象是當(dāng)前類的字節(jié)碼文件
*? ? ? ? ? ? ? ?
*? ? ? ? 2. 同步方法: 有synchronized關(guān)鍵字修飾的方法
*? ? ? ? ? ? ? ? 1. 實(shí)例方法
*? ? ? ? ? ? ? ? 2. 靜態(tài)方法
*? ? ? ? ? ? ? ?
*? ? ? ? 3. 使用重入鎖
*? ? ? ? ? ? ? ? 1. 聲明鎖對(duì)象
*? ? ? ? ? ? ? ? 2. 給共享數(shù)據(jù)上鎖
*? ? ? ? ? ? ? ? 3. 在finally中解鎖
*? ? ? ? ? ? ? ?
*? ? ? ? 4. wait()和notify()
*? ? ? ? ? ? ? ? wait(): 線程等待膜廊,釋放鎖
*? ? ? ? ? ? ? ? notify(): 喚醒等待狀態(tài)線程
*/class Bank{
? ? // 實(shí)例賬戶privateInteger account1 = 100;
? ? // 靜態(tài)賬戶privatestaticInteger account2 = 100;
? ? // 1. 聲明鎖對(duì)象privateLock lock =new ReentrantLock();
? ? /**? ? * 1. 同步代碼塊
? ? */// 存錢1publicvoid save1(Integer money) {
? ? ? ? // 實(shí)例代碼塊synchronized(this) {
? ? ? ? ? ? account1 += money;
? ? ? ? }
? ? ? ? System.out.println(Thread.currentThread().getName() + "存入了" + money + "元");
? ? }
? ? // 取錢1publicvoid draw1(Integer money) {
? ? ? ? // 實(shí)例代碼塊synchronized(this) {
? ? ? ? ? ? if(account1 - money < 0) {
? ? ? ? ? ? ? ? System.out.println("賬戶余額不足");
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? account1 -= money;
? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + "取出了" + money + "元");
? ? ? ? }
? ? }
? ? // 存錢2publicstaticvoid save2(Integer money) {
? ? ? ? // 靜態(tài)代碼塊synchronized(Bank.class) {
? ? ? ? ? ? account2 += money;
? ? ? ? }
? ? ? ? System.out.println(Thread.currentThread().getName() + "存入了" + money + "元");
? ? }
? ? // 取錢2publicstaticvoid draw2(Integer money) {
? ? ? ? // 靜態(tài)代碼塊synchronized(Bank.class) {
? ? ? ? ? ? if(account2 - money < 0) {
? ? ? ? ? ? ? ? System.out.println("余額不足");
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? account2 -= money;
? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + "取出了" + money + "元");
? ? ? ? }
? ? }
? ? /**? ? * 2. 同步方法
? ? */// 2.1 實(shí)例方法publicsynchronizedvoid save3(Integer money) {
? ? ? ? account1 += money;
? ? ? ? System.out.println(Thread.currentThread().getName() + "存入了" + money + "元");
? ? }
? ? publicsynchronizedvoid draw3(Integer money) {
? ? ? ? if(account1 - money < 0) {
? ? ? ? ? ? System.out.println("余額不足");
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? account1 -= money;
? ? ? ? System.out.println(Thread.currentThread().getName() + "取出了" + money + "元");
? ? }
? ? // 2.2 靜態(tài)方法publicsynchronizedstaticvoid save4(Integer money) {
? ? ? ? account2 += money;
? ? ? ? System.out.println(Thread.currentThread().getName() + "存入了" + money + "元");
? ? }
? ? publicsynchronizedstaticvoid draw4(Integer money) {
? ? ? ? if(account2 - money < 0) {
? ? ? ? ? ? System.out.println("余額不足");
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? account2 -= money;
? ? ? ? System.out.println(Thread.currentThread().getName() + "取出了" + money + "元");
? ? }
? ? /**? ? * 3. 重入鎖
? ? */publicvoid save5(Integer money) {
? ? ? ? // 2. 上鎖? ? ? ? lock.lock();
? ? ? ? try {
? ? ? ? ? ? account1 += money;
? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + "存入了" + money + "元");
? ? ? ? } finally {
? ? ? ? ? ? // 3. 解鎖? ? ? ? ? ? lock.unlock();
? ? ? ? }
? ? }
? ? publicvoid draw5(Integer money) {
? ? ? ? // 2. 上鎖? ? ? ? lock.lock();
? ? ? ? try {
? ? ? ? ? ? if(account1 - money < 0) {
? ? ? ? ? ? ? ? System.out.println("余額不足");
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? account1 -= money;
? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + "取出了" + money + "元");
? ? ? ? } finally {
? ? ? ? ? ? // 3. 解鎖? ? ? ? ? ? lock.unlock();
? ? ? ? }
? ? }
? ? // 查看賬戶余額publicvoid show() {
? ? ? ? System.out.println("實(shí)例賬戶余額" + account1);
? ? ? ? System.out.println("靜態(tài)賬戶余額" + account2);
? ? }
}classDemoimplements Runnable{
? ? privatestaticBank bank =new Bank();
? ? @Override
? ? publicvoid run() {
? ? ? ? /**? ? ? ? * 1. 測(cè)試同步代碼塊
? ? ? ? */// 1.1 實(shí)例代碼塊bank.save1(100);
? ? ? ? bank.show();
? ? ? ? bank.draw1(20);
? ? ? ? bank.show();
? ? ? ? // 1.2 靜態(tài)代碼塊Bank.save2(100);
? ? ? ? bank.show();
? ? ? ? Bank.draw2(20);
? ? ? ? bank.show();
? ? ? ? /**? ? ? ? * 2. 測(cè)試同步方法
? ? ? ? */// 2.1 實(shí)例方法bank.save3(100);
? ? ? ? bank.show();
? ? ? ? bank.draw3(20);
? ? ? ? bank.show();
? ? ? ? // 2.2 靜態(tài)方法Bank.save4(100);
? ? ? ? bank.show();
? ? ? ? Bank.draw4(20);
? ? ? ? bank.show();
? ? ? ? /**? ? ? ? * 3. 測(cè)試重入鎖
? ? ? ? */? ? ? ? bank.save5(100);
? ? ? ? bank.show();
? ? ? ? bank.draw5(20);
? ? ? ? bank.show();
? ? }? ? ? ?
}publicclass TestSynchronized {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 1. 測(cè)試同步實(shí)例代碼塊newThread(newDemo(),"線程1號(hào)").start();
? ? ? ? // 2. 測(cè)試同步靜態(tài)代碼塊newThread(newDemo(),"線程2號(hào)").start();
? ? ? ? // 2. 測(cè)試同步方法
? ? ? ? // 2.1 實(shí)例方法newThread(newDemo(),"線程3號(hào)").start();
? ? ? ? // 2.2 靜態(tài)方法newThread(newDemo(),"線程4號(hào)").start();
? ? ? ? // 3. 測(cè)試沖入鎖newThread(newDemo(),"線程5號(hào)").start();
? ? }
}
線程同步總結(jié)及代碼實(shí)現(xiàn)
?五乏沸、線程控制(線程狀態(tài)轉(zhuǎn)換圖)
九:網(wǎng)絡(luò)編程
??? 一、網(wǎng)絡(luò)編程概述
?? 1. 計(jì)算機(jī)網(wǎng)絡(luò):多臺(tái)算機(jī)之間實(shí)現(xiàn)信息傳遞和資源共享的的計(jì)算機(jī)系統(tǒng)
?????????????????????? ? ? ? 2. 網(wǎng)絡(luò)編程:不同計(jì)算機(jī)之間使用網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換
???????????? 二爪瓜、網(wǎng)絡(luò)編程三要素
? 1.? IP:每個(gè)設(shè)備在網(wǎng)絡(luò)中的唯一標(biāo)識(shí)
?????????????????????? ? ? ? 2. 端口號(hào):每個(gè)程序在設(shè)備上的唯一標(biāo)識(shí)
???????????? ?? ??????? ? ?? 3. 協(xié)議:在網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)交換要遵守的規(guī)則
???????????? 三蹬跃、 UDP與TCP的區(qū)別
? 1. UDP:面向無(wú)連接,數(shù)據(jù)不可靠铆铆,速度快蝶缀,適用于高速傳輸和對(duì)實(shí)時(shí)性要求較高
?????????????????? ? ? ?? ??? 2. TCP:面向連接丹喻,數(shù)據(jù)可靠,速度略低翁都,適用于可靠傳輸
???????????? 四碍论、網(wǎng)絡(luò)編程常用方法
五、UDP傳輸?
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;/** * 1. 服務(wù)器端實(shí)現(xiàn)步驟
*? ? ? 1. 創(chuàng)建服務(wù)器對(duì)象
*? ? ? 2. 將接受到的數(shù)據(jù)打包
*? ? ? 3. 將數(shù)據(jù)包存儲(chǔ)到服務(wù)器對(duì)象
*? ? ? 4. 打印數(shù)據(jù)
*? ? ? 5. 關(guān)閉流通道
*? ? ?
* 2. 客戶端步驟實(shí)現(xiàn)
*? ? ? 1. 創(chuàng)建客戶端對(duì)象
*? ? ? 2. 將數(shù)據(jù)打包
*? ? ? 3. 發(fā)送數(shù)據(jù)包
*? ? ? 4. 關(guān)閉流通道
*? ? ?
* @author 萌萌哥的春天
*
*//** * 服務(wù)器端
*/publicclass Server {
? ? publicstaticvoidmain(String[] args)throws IOException {
? ? ? ? // 1. 創(chuàng)建服務(wù)器對(duì)象DatagramSocket ds =newDatagramSocket(9102);
? ? ? ? // 2. 將接收到的數(shù)據(jù)打包byte[] bytes =newbyte[1024];
? ? ? ? DatagramPacket dp =new DatagramPacket(bytes, bytes.length);
? ? ? ? // 3. 將數(shù)據(jù)包存入服務(wù)器對(duì)象? ? ? ? ds.receive(dp);
? ? ? ? // 4. 打印數(shù)據(jù)String IP = dp.getAddress().getHostAddress();// IP地址intport = dp.getPort();
? ? ? ? String data =newString(dp.getData(), 0, dp.getLength());// 將字節(jié)數(shù)組轉(zhuǎn)為字符串System.out.println(IP+": --" + data + "--" + port + ":");
? ? ? ? // 5. 關(guān)閉流通道? ? ? ? ds.close();
? ? }
}/** * 客戶端
*/publicclass Client {
? ? publicstaticvoidmain(String[] args)throws IOException {
? ? ? ? // 1. 創(chuàng)建客戶端對(duì)象DatagramSocket ds =new DatagramSocket();
? ? ? ? // 2. 將數(shù)據(jù)打包BufferedReader br =newBufferedReader(newInputStreamReader(System.in));// 接受鍵盤輸入byte[] bytes = br.toString().getBytes();// 將字符串轉(zhuǎn)換為字節(jié)數(shù)組DatagramPacket dp =newDatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"),9102);
? ? ? ? // 3. 發(fā)送數(shù)據(jù)包? ? ? ? ds.send(dp);
? ? ? ? // 4. 關(guān)閉流通道? ? ? ? ds.close();
? ? }
}
UDP傳輸代碼實(shí)現(xiàn)
???????????? 六柄慰、TCP傳輸
/** * 1. 服務(wù)器端實(shí)現(xiàn)步驟
*? ? ? 1. 創(chuàng)建服務(wù)器對(duì)象
*? ? ? 2. 偵聽客戶端連接
*? ? ? 3. 使用輸入流讀取客戶端輸入
*? ? ? 4. 使用輸出流寫入文件
*? ? ? 5. 使用輸出流通知客戶端
*? ? ? 6. 關(guān)閉流通道
*? ? ?
* 2. 客戶端步驟實(shí)現(xiàn)
*? ? ? 1. 創(chuàng)建客戶端對(duì)象
*? ? ? 2. 使用輸出流發(fā)送數(shù)據(jù)到服務(wù)器
*? ? ? 3. 使用輸入流讀取本地文件
*? ? ? 4. 使用輸入流接收服務(wù)器反饋并打印到控制臺(tái)
*? ? ? 5. 關(guān)閉流通道
*? ? ?
* @author 萌萌哥的春天
*
*/import java.io.BufferedWriter;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;/** * 服務(wù)器端
*/publicclass Server {
? ? privatestatic ServerSocket server;
? ? privatestatic Socket socket;
? ? privatestatic InputStream in;
? ? privatestatic OutputStream out;
? ? publicstaticvoid main(String[] args) {
? ? ? ? try {
? ? ? ? ? ? // 1. 創(chuàng)建服務(wù)器對(duì)象server =newServerSocket(9102);
? ? ? ? ? ? // 2. 偵聽客戶端連接socket = server.accept();
? ? ? ? ? ? // 3. 使用輸入流接收客戶端輸入in = socket.getInputStream();
? ? ? ? ? ? // 4. 使用輸出流寫入文件out =newFileOutputStream("D:/server.txt");
? ? ? ? ? ? byte[] bytes =newbyte[1024];
? ? ? ? ? ? intlen = 0;
? ? ? ? ? ? while((len = in.read(bytes)) != -1) {
? ? ? ? ? ? ? ? out.write(bytes, 0, len);
? ? ? ? ? ? ? ? out.flush();
? ? ? ? ? ? }
? ? ? ? ? ? // 5. 使用輸出流通知客戶端BufferedWriter bw =newBufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
? ? ? ? ? ? bw.write("文件上傳成功");
? ? ? ? ? ? bw.flush();
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? // 6. 關(guān)閉流通道if(server !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? server.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if(socket !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? socket.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if(in !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? in.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if(out !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? out.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}/**? * 客戶端
? */publicclass Client {
? ? privatestatic Socket socket;
? ? privatestatic InputStream in;
? ? publicstaticvoid main(String[] args) {
? ? ? ? try {
? ? ? ? ? ? // 1. 創(chuàng)建客戶端對(duì)象socket =newSocket("localhost", 9102);
? ? ? ? ? ? // 2. 使用輸入流發(fā)送數(shù)據(jù)到服務(wù)器OutputStream out = socket.getOutputStream();
? ? ? ? ? ? // 3. 使用輸入流讀取本地文件in =newFileInputStream("D:/client.txt");
? ? ? ? ? ? byte[] bytes =newbyte[1024];
? ? ? ? ? ? intlen = 0;
? ? ? ? ? ? while((len = in.read(bytes)) != -1) {
? ? ? ? ? ? ? ? out.write(bytes, 0, len);
? ? ? ? ? ? }
? ? ? ? ? ? // 4. 通知服務(wù)器文件已上傳? ? ? ? ? ? socket.shutdownOutput();
? ? ? ? ? ? // 5. 使用輸出流接收服務(wù)器反饋BufferedReader br =newBufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ? ? ? System.out.println(br.readLine());
? ? ? ? } catch (UnknownHostException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? // 6. 關(guān)閉流通道if(socket !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? socket.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if(in !=null) {
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? in.close();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
TCP傳輸代碼實(shí)現(xiàn)
?十:反射
??一鳍悠、反射概述
?????????????????????????? 1. 反射機(jī)制:動(dòng)態(tài)獲取類的信息和調(diào)用對(duì)象的方法的功能
?????????????????????????? 2. 反射實(shí)現(xiàn):獲取每個(gè)類的字節(jié)碼文件,也就是Class類對(duì)象
???????????? 二坐搔、反射的三種方式
/** * 反射的三種方式:推薦2和3
*? ? ? 1. Object類的getClass()方法
*? ? ? 2. 實(shí)體類.class
*? ? ? 3. Class類的forName()方法
*/publicclass TestReflect {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 1. 方式一:getClass()方法Worker worker =new Worker();
? ? ? ? Class class1 = worker.getClass();
? ? ? ? System.out.println(class1.getName()); // Worker
? ? ? ? // 2. 方式二:實(shí)體類.classClass class2 = Worker.class;
? ? ? ? System.out.println(class1 == class2);// true
? ? ? ? // 3. 方式三:Class類的forName()方法try {
? ? ? ? ? ? Class class3 = Class.forName("Worker");
? ? ? ? ? ? System.out.println(class2 == class3);// true}catch (ClassNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
}
反射的三種方法
???????????? 三藏研、Class常用方法
import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;class Worker {
? ? // 私有屬性private Integer id;
? ? private String name;
? ? // 公共屬性? ? Integer age;
? ? public Worker() {
? ? }
? ? public Worker(String name) {
? ? ? ? this.name = name;
? ? }
? ? protected Worker(Integer id, String name) {
? ? ? ? this.id = id;
? ? ? ? this.name = name;
? ? }
? ? private Worker(Integer id, String name, Integer age) {
? ? ? ? this.id = id;
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? // 繼承方法? ? @Override
? ? public String toString() {
? ? ? ? return"Worker [id=" + id + ", name=" + name + ", age=" + age + "]";
? ? }
? ? // 私有方法privatevoid test() {
? ? ? ? System.out.println("這是私有方法");
? ? }
}publicclass TestReflect {
? ? publicstaticvoid main(String[] args) {
? ? ? ? // 1. 創(chuàng)建Class對(duì)象Class class1 = Worker.class;
? ? ? ? Class class2 = String.class;
? ? ? ? /**? ? ? ? *? 2. 類相關(guān)操作
? ? ? ? */// 2.1 獲取完整性類名System.out.println(class2.getName());// java.lang.String
? ? ? ? // 2.2 獲取類名System.out.println(class2.getSimpleName());// String
? ? ? ? // 2.3 獲取此類的包名System.out.println(class2.getPackage());// package java.lang
? ? ? ? // 2.4 獲取當(dāng)前類所繼承父類的名字System.out.println(class2.getSuperclass());// class java.lang.Object
? ? ? ? // 2.5獲取當(dāng)前類實(shí)現(xiàn)的接口Class[] interfaces = class2.getInterfaces();
? ? ? ? for(Class class3 : interfaces) {
? ? ? ? ? ? System.out.println(class3);
? ? ? ? ? ? // interface java.io.Serializable
? ? ? ? ? ? // interface java.lang.Comparable
? ? ? ? ? ? // interface java.lang.CharSequence? ? ? ? }? ?
? ? ? ? /**? ? ? ? * 3. 類中屬性相關(guān)操作
? ? ? ? */// 3.1 獲取指定屬性try {
? ? ? ? ? ? Field declaredField = class1.getDeclaredField("name");
? ? ? ? ? ? System.out.println(declaredField); // private java.lang.String Worker.name}catch (NoSuchFieldException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (SecurityException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? // 3.2 獲取所有屬性Field[] declaredFields = class1.getDeclaredFields();
? ? ? ? for (Field field : declaredFields) {
? ? ? ? ? ? System.out.println(field);
? ? ? ? ? ? // private java.lang.Integer Worker.id
? ? ? ? ? ? // private java.lang.String Worker.name
? ? ? ? ? ? // java.lang.Integer Worker.age? ? ? ? }
? ? ? ? /**? ? ? ? * 4. 類中構(gòu)造方法相關(guān)操作
? ? ? ? */// 4.1 獲取參數(shù)列表匹配的構(gòu)造方法try {
? ? ? ? ? ? Constructor declaredConstructor = class1.getDeclaredConstructor(Integer.class, String.class, Integer.class);
? ? ? ? ? ? System.out.println(declaredConstructor); // private Worker(java.lang.Integer,java.lang.String,java.lang.Integer)System.out.println(class1.getDeclaredConstructor(String.class));// public Worker(java.lang.String)}catch (NoSuchMethodException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (SecurityException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? // 4.2 獲取類中所有公共構(gòu)造方法Constructor[] constructors = class1.getConstructors();
? ? ? ? for(Constructor constructor : constructors) {
? ? ? ? ? ? System.out.println(constructor);
? ? ? ? ? ? // public Worker(java.lang.String)
? ? ? ? ? ? // public Worker()? ? ? ? }
? ? ? ? // 4.3 獲取類中所有構(gòu)造方法Constructor[] declaredConstructors = class1.getDeclaredConstructors();
? ? ? ? for(Constructor constructor : declaredConstructors) {
? ? ? ? ? ? System.out.println(constructor);
? ? ? ? ? ? // private Worker(java.lang.Integer,java.lang.String,java.lang.Integer)
? ? ? ? ? ? // protected Worker(java.lang.Integer,java.lang.String)
? ? ? ? ? ? // public Worker(java.lang.String)
? ? ? ? ? ? // public Worker()? ? ? ? }
? ? ? ? /**? ? ? ? * 5. 類中方法相關(guān)操作
? ? ? ? */// 5.1 獲取方法名和參數(shù)列表都匹配的方法try {
? ? ? ? ? ? Method declaredMethod = class1.getDeclaredMethod("toString");
? ? ? ? ? ? System.out.println(declaredMethod); // public java.lang.String Worker.toString()System.out.println(class1.getDeclaredMethod("test"));////private void Worker.test()}catch (NoSuchMethodException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (SecurityException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? // 5.2 獲取類中所有公共方法Method[] methods = class1.getMethods();
? ? ? ? for (Method method : methods) {
? ? ? ? ? ? System.out.println(method); // 當(dāng)前類方法和它所繼承的類及其實(shí)現(xiàn)的接口中的所有公共方法? ? ? ? }
? ? ? ? // 5.3 獲取當(dāng)前類中所有方法Method[] declaredMethods = class1.getDeclaredMethods();
? ? ? ? for (Method method : declaredMethods) {
? ? ? ? ? ? System.out.println(method);
? ? ? ? ? ? // public java.lang.String Worker.toString()
? ? ? ? ? ? // private void Worker.test()? ? ? ? }
? ? }
}
Class類常用方法代碼實(shí)現(xiàn)
??? ? ? ?? ? 四、反射核心操作
import java.lang.reflect.Field;import java.lang.reflect.Method;class Worker {
? ? // 私有屬性private Integer id;
? ? private String name;
? ? // 公共屬性public Integer age;
? ? public Worker() {
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return"Worker [id=" + id + ", name=" + name + ", age=" + age + "]";
? ? }
? ? // 私有方法privatevoid test() {
? ? ? ? System.out.println("這是私有方法");
? ? }
? ? // 公共方法publicvoid show() {
? ? ? ? System.out.println("這是公共方法");
? ? }
}publicclass TestReflect {
? ? publicstaticvoidmain(String[] args)throws Exception {
? ? ? ? // 1. 創(chuàng)建Class對(duì)象Class class1 = Class.forName("Worker");
? ? ? ? // 2. 通過(guò)構(gòu)造方法實(shí)例化類對(duì)象Object obj = class1.getConstructor().newInstance();
? ? ? ? // 3. 給公共屬性設(shè)置值Field field1 = class1.getField("age");
? ? ? ? field1.set(obj, 18);
? ? ? ? // 4. 給私有屬性設(shè)置值Field field = class1.getDeclaredField("name");
? ? ? ? field.setAccessible(true);// 解除私有限定field.set(obj, "張三");// 為Worker類中的name屬性設(shè)置值
? ? ? ? // 5. 調(diào)用公共成員方法Method method1 = class1.getMethod("show");
? ? ? ? method1.invoke(obj);
? ? ? ? // 6. 調(diào)用私有成員方法Method method = class1.getDeclaredMethod("test");
? ? ? ? method.setAccessible(true);
? ? ? ? method.invoke(obj); // 第一個(gè)參數(shù)是類對(duì)象薯蝎,其余的為實(shí)參? ? ? ? System.out.println(obj);
? ? }
}