1.數(shù)據(jù)結(jié)構(gòu)
程序=數(shù)據(jù)結(jié)構(gòu)+算法
- 棧:后進(jìn)先出,線性結(jié)構(gòu) 入棧:push 出棧:pop
假如已知入棧順序是abcd,那么他的出棧順序可能有很多種abcd(馬上進(jìn)馬上出) - 隊(duì)列:先進(jìn)先出蝶糯,線性結(jié)構(gòu)
- 樹(shù):有且只有一個(gè)根節(jié)點(diǎn)艇拍,每個(gè)節(jié)點(diǎn)也僅有一個(gè)父節(jié)點(diǎn)璧亮,每個(gè)節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn)( 鏈?zhǔn)浇Y(jié)構(gòu))
樹(shù)的分類:
有序數(shù)樹(shù) 無(wú)序數(shù)樹(shù)
二叉樹(shù):每個(gè)節(jié)點(diǎn)最大有兩個(gè)子節(jié)點(diǎn)的有序數(shù)樹(shù)
滿二叉樹(shù):如果一個(gè)二叉樹(shù)層級(jí)是K,樹(shù)的節(jié)點(diǎn)數(shù)是2^K-1
完全二叉樹(shù):
二叉樹(shù)的遍歷:
1)先序遍歷(深度遍歷):根節(jié)點(diǎn)参萄,左子樹(shù),右子樹(shù)
2)中序遍歷: 左子樹(shù)擎析,根節(jié)點(diǎn)瘾杭,右子樹(shù)
3)后序遍歷: 左子樹(shù),右子樹(shù)汰具,根節(jié)點(diǎn)
任何已知先中序或中后序就可以確定二叉樹(shù)的結(jié)構(gòu)卓鹿。
例子:二叉樹(shù)的中序遍歷為:BADC,先序遍歷為ABCD留荔。求后序遍歷結(jié)果吟孙? BDCA - 圖
2.ajax(Asynchronous JavaScript and XML)
異步的JavaScript and XML技術(shù)
不刷新整個(gè)頁(yè)面,僅僅局部刷新 讓客戶端與服務(wù)器端進(jìn)行通信
它不是一個(gè)新技術(shù)存谎,只是幾種技術(shù)的結(jié)合
1)ajax 的核心對(duì)象是XMLHttpRequest
XMLHttpRequest存在瀏覽器端拔疚,不同的瀏覽器 創(chuàng)建方式不同
目前比較主流瀏覽器內(nèi)核:v/p
火狐內(nèi)核 :火狐 google..
window.XMLHttpRequest
IE內(nèi)核 : IE6 -IE11 360 遨游
Window.ActiveXObject
2)XMLHttpRequest 對(duì)象中的方法
a: 客戶端與服務(wù)器端建立連接
open("請(qǐng)求方式[get|post]","請(qǐng)求路徑",是否異步 [true|false]);
b: 監(jiān)聽(tīng)服務(wù)器狀態(tài)onreadystatechange肥隆,指定回調(diào)函數(shù)(當(dāng)狀態(tài)只要發(fā)生變化既荚,就調(diào)用這個(gè)回調(diào)函數(shù))
狀態(tài) readyState(屬性)
0 連接還未建立完成
1 已經(jīng)建立連接 請(qǐng)求未加載
2 正在加載
3 請(qǐng)求已經(jīng)加載完成 正在交互中
4 完成交互
c: send();發(fā)送請(qǐng)求
d: 完成交互 服務(wù)器響應(yīng)狀態(tài) status(屬性):
200 服務(wù)器端成功處理了請(qǐng)求
400 服務(wù)器端處理失敗
404 服務(wù)器端找不到處理請(qǐng)求的地址
500 服務(wù)器端內(nèi)部錯(cuò)誤
e:服務(wù)器回調(diào)回來(lái)的值:
XMLHttpRequest對(duì)象的屬性responseText
3)ajax的操作步驟
- 創(chuàng)建 XMLHttpRequest 對(duì)象
- 建立連接 對(duì)象.open()
- 指派監(jiān)聽(tīng)函數(shù) 對(duì)象.onreadystatechange=回調(diào)函數(shù)名
- 發(fā)送請(qǐng)求 對(duì)象.send()
- 寫(xiě)監(jiān)聽(tīng)函數(shù) 回調(diào)函數(shù)()
判斷服務(wù)器連接的狀態(tài)xhr.readyState
判斷服務(wù)器響應(yīng)狀態(tài) xhr.status
3.query 輕量級(jí) javaScript 框架
寫(xiě)的少做的多,良好的兼容性
強(qiáng)大的選擇器 dom 操作
1)用法:
- 1:引入 jquery.xxxx.js
jquery.1.xx.js 良好的兼容性
jquery.2.xx.js 支持IE8以上的版本 firefox2.0 - 2:初始化方法
$(document).ready(function(){
});
可以簡(jiǎn)寫(xiě) $(function(){}); 與 window.load=function(){}
類似
2)選擇器
a. id 選擇器
$("#id名")
b. 類選擇器
$(".類名")
<p class="p">a1 </p>
<p class="p">a2 </p>
<p class="p">a3 </p>
$(".p").each(function(){
});
c:標(biāo)簽選擇器
$("標(biāo)簽名") $("div")
4.javai/o
1)名詞解釋
- I/o : Input/OutPut 輸入/輸出
- 流 : 具有產(chǎn)生數(shù)據(jù)的數(shù)據(jù)源對(duì)象 或者具有接收數(shù)據(jù)的客戶端對(duì)象
- I/O流 : 站在程序的角度
用來(lái)產(chǎn)生數(shù)據(jù)的數(shù)據(jù)源對(duì)象 輸入流;
有接收數(shù)據(jù)的客戶端對(duì)象 輸出流 - 為什么要使用 I/O流
因?yàn)橛?jì)算機(jī)cpu 不能直接讀取硬盤(pán)的上的數(shù)據(jù)
計(jì)算機(jī)要進(jìn)行讀寫(xiě)數(shù)據(jù)必須要通過(guò)I/o流來(lái)操作 - java中的I/O ->java.Io
- java中的文件操作
- InputStream 抽象的類 輸入流
OutputStream 抽象的類 輸出流
2)java.io.File 類
File 構(gòu)造方法
File f=new File("文件絕對(duì)路徑");
File f=new File("文件父級(jí)文件夾路徑","文件名");
File f=new File(File dir,"文件名");
File f=new File(URL url);
f.exists();判斷文件是否存在
f.createNewFile(); 創(chuàng)建文件
f.mkdir(); 創(chuàng)建文件夾
listFiles();
listFiles(FileFilter filter)
3) I/O流分類
- 根據(jù)方向劃分 : 輸入、輸出流
- 根據(jù)操作字節(jié)數(shù)來(lái)分:
字節(jié)流 按照一個(gè)字節(jié)一個(gè)字節(jié)操作 只操作一個(gè)字節(jié)(8bit)
輸入字節(jié)流 InputStream 用于讀取字節(jié)流的抽象類 常見(jiàn)子類
FileInputStream
輸出字節(jié)流 OutputStream 寫(xiě)入字節(jié)流的抽象類 常見(jiàn)子類FileOutputStream
字符流 按照兩個(gè)字節(jié)操作(16bit)
輸入字符流 Reader用于讀取字符流的抽象類
常見(jiàn)子類InputStreamReader
,FileReader
輸出字符流 Writer寫(xiě)入字符流的抽象類
常見(jiàn)子類OutputStreamWriter
,FileWriter
- 可以操作Java的數(shù)據(jù)類型栋艳,是與機(jī)器無(wú)關(guān)的操作流
DataInputStream
,DataOutputStream
- 包裝流 對(duì)基本流進(jìn)行添加緩存功能的流
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
5. 序列化與反序列化
持久化:把內(nèi)存中的對(duì)象 數(shù)據(jù) 保存在介質(zhì)[文件恰聘,數(shù)據(jù)庫(kù)] 中去
序列化: 把java對(duì)象 存在文件 中 但不是任意對(duì)象都可以序列化
如果一個(gè)對(duì)象要能夠序列化 那么這個(gè)對(duì)象的類 必須可序列化
可序列化 的類 必須要實(shí)現(xiàn)一個(gè) Serializable 接口
序列化->ObjectOutputStream 對(duì)象存儲(chǔ)到文件中
反序列化->ObjectInputStream 文件去讀出來(lái)變成對(duì)象
靜態(tài)屬性不會(huì)序列化到文件中
1) java 創(chuàng)建對(duì)象的幾種方式
- new 類的構(gòu)造器
- 反序列化
首先類必須實(shí)現(xiàn) 可序化接口 Serializable
先進(jìn)行 序列化 在進(jìn)行 反序列化- 克隆 類對(duì)象要 克隆 類必須實(shí)現(xiàn)可克隆接口 Cloneable 接口
- 反射
6. java多線程
程序-》計(jì)算機(jī)的指令集合 靜態(tài)的概念
進(jìn)程-》程序的一次運(yùn)行 動(dòng)態(tài)的概念,有獨(dú)立的內(nèi)存空間
線程-》進(jìn)程的一次運(yùn)行 可以分成若干條分支同時(shí)執(zhí)行
每一條分支就是一個(gè)線程 , 線程是比進(jìn)程更小的概念
多線程:一個(gè)進(jìn)程分成多條線索同時(shí)執(zhí)行 這個(gè)進(jìn)程就是多線程
java程序中 main 方法 jvm會(huì)自動(dòng)給他分配一個(gè)線程 通常這個(gè)線程
都叫做 主線程
1)線程和進(jìn)程有什么區(qū)別吸占?
- 進(jìn)程它是程序的一次運(yùn)行晴叨,所以它會(huì)有獨(dú)立的內(nèi)存空間
線程是進(jìn)程的一條執(zhí)行的線索,該進(jìn)程的所有線程都共享
進(jìn)程的內(nèi)存矾屯,沒(méi)有獨(dú)立的內(nèi)存空間- 一個(gè)進(jìn)程分成多條線程兼蕊,同時(shí)執(zhí)行叫做多線程
2) java怎么實(shí)現(xiàn)多線程
第一種方式:
a:寫(xiě)一個(gè)類 extends Thread
b:重寫(xiě)run() 方法
c:創(chuàng)建線程類對(duì)象,調(diào)用對(duì)象的 start()方法
第二中方式:
a:寫(xiě)一個(gè)類 實(shí)現(xiàn)Runable 接口
b:實(shí)現(xiàn)Runable 接口中run() 方法
c:創(chuàng)建該類對(duì)象
d:再創(chuàng)建一個(gè) Thread類的對(duì)象件蚕,傳遞一個(gè)實(shí)現(xiàn)Runnable接口類的對(duì)象
e:再調(diào)用 Thread類的對(duì)象 的 start()方法(因?yàn)橹挥芯€程Thread有start方法)
在Thread類中可以:
this.getName()來(lái)獲取線程的名稱
在非Thread類中可以:
Thread.currentThread().getName() 來(lái)獲取當(dāng)前正在運(yùn)行線程的名稱
3) 線程中常見(jiàn)方法:
- boolean isAlive() 判斷線程是否處于活動(dòng)狀態(tài)(就緒)
一個(gè)線程類對(duì)象 在start()之前 沒(méi)有處于活動(dòng)狀態(tài)
在start()之后 run() 運(yùn)行完成之前 都處于 活動(dòng)狀態(tài)
run()運(yùn)行完成之后 沒(méi)有處于活動(dòng)狀態(tài)- join() 合并線程
- yield() 讓出 cpu 的使用權(quán)
- sleep(long millis) 讓當(dāng)前線程休眠指定的時(shí)間 毫秒數(shù)
sleep 但不會(huì)釋放cpu的使用權(quán) 也不釋放占用的資源- interrupt() 中斷線程孙技。
- 線程的優(yōu)先級(jí) 默認(rèn)值是 5 范圍 0-9 值越大 越優(yōu)先
getPriority() 返回線程的優(yōu)先級(jí)产禾。
setPriority(int newPriority) 更改線程的優(yōu)先級(jí)。
優(yōu)先級(jí) 越高 只是越有機(jī)會(huì)獲得cpu的使用權(quán) 并不是一定先運(yùn)行- stop();讓線程消亡
- wait();讓當(dāng)前線程暫停執(zhí)行牵啦,進(jìn)入等待隊(duì)列亚情,需要notify()或noyifyAll()喚醒才能進(jìn)入就緒狀態(tài)
- notify();喚醒等待隊(duì)列中的一個(gè)線程
- notifyAll();喚醒等待隊(duì)列中的所有線程
4) 多線程安全問(wèn)題(synchronized)
Java程序可以讓多線程來(lái)同時(shí)執(zhí)行,如果多線程要訪問(wèn)共同的數(shù)據(jù)哈雏,可能會(huì)造成數(shù)據(jù) 的不一致的問(wèn)題楞件,所以要做線程的同步問(wèn)題。
線程的同步就是讓同一個(gè)時(shí)間點(diǎn)只有一個(gè)線程可以訪問(wèn)共享的資源.
5) 同步的方式:
- synchronized修飾方法 同步方法
同一時(shí)間只能有一個(gè)線程可以訪問(wèn)該方法 - synchronized 代碼塊
Synchronized(共享資源的對(duì)象){}
同一時(shí)間只能有一個(gè)線程可以訪問(wèn)該對(duì)象 - 一個(gè)可重入的互斥鎖類 ReentrantLock
Lock();unlock();注意要用try-catch-finally來(lái)處理裳瘪,避免死鎖 - volatile 特殊的類型變量來(lái)達(dá)到同步的目的
- ThreadLocal
7.java反射(java.lang.reflect)
程序一般原理:Java創(chuàng)建對(duì)象——>知道類的源碼——>調(diào)用構(gòu)造土浸、屬性、方法
反射原理 :沒(méi)有源碼盹愚,只有字節(jié)碼——>反射類屬性栅迄、方法和父類實(shí)現(xiàn)的接口——>調(diào)用方法、構(gòu)造
反射 就是把一個(gè)類 用其他的類來(lái)表示 ;
獲取類的字節(jié)碼:
- 類路徑(包名+類名).class ( Class c=包名+類名.class;)
- Class.forName("類路徑");
- 通過(guò)類的對(duì)象 .getClass();
獲取父類:Class suoerc=c.getSupperclass();
獲取實(shí)現(xiàn)的接口:Class[] interfaces=c.getInterfaces();
獲取類的屬性(Filed(java.lang.reflect)):
Filed[] fs=c.getFilelds();獲取public 屬性(自身與父類繼承過(guò)來(lái)的)
Filed[] fs=c.getDeclaredFields();獲取自身所有的屬性
獲取類的方法(Method(java.lang.reflect)):
Method[] ms=c.getDeclaredMethods();獲取自身所有的方法
Method[] ms2=c.getMethods();獲取public 方法(自身與父類,父類的父類繼承過(guò)來(lái)的)
獲取類的構(gòu)造方法(Constructor (java.lang.reflect)):
Constructor[] crs=c.getConstructors() ;
8.設(shè)計(jì)模式之二
工廠模式:根據(jù)配置動(dòng)態(tài)產(chǎn)生一組類中某個(gè)類的實(shí)例
通常這一組類有共同的父類或?qū)崿F(xiàn)了相同的接口
配置:key——>value
key值保持不變皆怕,value根據(jù)實(shí)際情況改變 value=xxx(key)
父類(接口)對(duì)象= Class.forName(value).newIntance();
9.不常用知識(shí)點(diǎn)
1)內(nèi)部類
- 普通的內(nèi)部類 (成員內(nèi)部類 )
在一個(gè)類的類體里面申明的一個(gè)類- 靜態(tài)內(nèi)部類
在一個(gè)類的類體里面申明的一個(gè)類 加上static 修飾符- 匿名內(nèi)部類
2) 網(wǎng)絡(luò)編程
目的:使網(wǎng)絡(luò)中的計(jì)算機(jī)可以進(jìn)行通信
定位網(wǎng)絡(luò)中的一臺(tái)計(jì)算機(jī)InetAddress
數(shù)據(jù)的傳輸
TCP是Tranfer Control Protocol的簡(jiǎn)稱毅舆, 是一種面向連接的保證可靠傳輸?shù)膮f(xié)議
UDP是User Datagram Protocol的簡(jiǎn)稱,是一種無(wú)連接的不可靠協(xié)議愈腾。
傳輸?shù)臄?shù)據(jù)受到限制 最大64K (QQ離線)
Socket——> 套接字
網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換憋活,
這個(gè)雙向鏈路的一端稱為一個(gè)Socket。
Socket通常用來(lái)實(shí)現(xiàn)客戶方和服務(wù)方的連接虱黄。
Socket是TCP/IP協(xié)議的一個(gè)十分流行的編程界面悦即,
一個(gè)Socket由一個(gè)IP地址和一個(gè)端口號(hào)唯一確定