Java學(xué)習(xí)筆記:集合和IO流知識(shí)合集,線程,生命周期,堵塞,守護(hù)線程等【詩書畫唱】

集合的分類:
list:ArrayList、LinkedList、Vector
1.有序(可以使用下標(biāo)進(jìn)行訪問)
2.大小任意
3.存儲(chǔ)的類型任意
set:HashSet
1. 無序(沒有下標(biāo))
2.大小任意
3.存儲(chǔ)的類型任意
4.取數(shù)據(jù)的時(shí)候取的順序和存入的順序可能不一致
map:HashMap
1. 無序(沒有下標(biāo))
2.大小任意
3.采用的鍵值對(duì)的方式進(jìn)行存儲(chǔ),鍵是不能重復(fù),值是可以重復(fù)
// Collections類是一個(gè)工具類,主要是對(duì)于集合操作的工具類,其中的方法全部都是靜態(tài)的。
// 常用方法:
// 1.addAll():一次性對(duì)集合添加多條數(shù)據(jù)
// 2. Sort():對(duì)集合內(nèi)容進(jìn)行排序
// 3.shuffle():對(duì)集合元素進(jìn)行隨機(jī)排序
// 4.copy():復(fù)制集合,要求復(fù)制的集合的長(zhǎng)度大于被復(fù)制的集合的長(zhǎng)度
// 5.max():得到集合中的最大值
// 6.min():得到集合中的最小值
SQL_PreparedStatement:
什么是防注入?直接字符串拼接用戶再后輸入一個(gè)or 1=1的時(shí)候那么這個(gè)條件是肯定成立的,所以用戶輸入不輸入用戶名沒有多大的關(guān)系了為了解決這個(gè)問題,就要使preparedstatement解決,它默認(rèn)將sql語句編譯成函數(shù),每次只要傳入相應(yīng)的參數(shù)就可以了,就可以防止用戶sql注入
預(yù)處理:
我們每次對(duì)于數(shù)據(jù)庫操作數(shù)據(jù)庫都要將sql語句編譯成函數(shù)
如果我們使用預(yù)處理的時(shí)候,數(shù)據(jù)庫就默認(rèn)生成了一個(gè)函數(shù),以后再
傳入相同的內(nèi)容的時(shí)候只需要調(diào)用這個(gè)函數(shù)就可以了,這個(gè)就可以提升sql執(zhí)行的效率
//1.導(dǎo)入數(shù)據(jù)包
//2.加載數(shù)據(jù)包
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//3.創(chuàng)建連接數(shù)據(jù)庫的對(duì)象(Connection)
Connection con=DriverManager.getConnection("jdbc:sqlserver://localhost;databaseName=fuxi","qqq","11111");
//4.創(chuàng)建執(zhí)行sql語句的對(duì)象,是statement,preparedStatement(防注入,預(yù)處理)
String sql="select * from denglu where uid=? and uname=?";//1
PreparedStatement ps=con.prepareStatement(sql);//編譯sql語句
ps.setObject(1, 1);
ps.setObject(2, "qwe");
//5.寫并且執(zhí)行sql語句,ResultSet的對(duì)象
ResultSet res=ps.executeQuery();//使用這個(gè)方法去執(zhí)行sql語句
//6.遍歷這個(gè)對(duì)象
while(res.next()){
System.out.println(res.getObject(1)+"? "+res.getObject(2));
}
為什么要讀取配置文件://將一些常用的配置信息保存在配置文件里,
//java類一旦編譯,雖然我們不能直接修改編譯后的文件,但是我們
//可以修改配置文件,寫的代碼對(duì)于配置都是去配置文件里讀的,萬一
//數(shù)據(jù)庫用戶或者密碼修改里之后,我直接修改配置文件即可
//讀取配置文件:
//1.建立一個(gè)文件,src目錄下,文件名稱可以
//隨便,但是后綴名必須為.properties
//2.添加幾個(gè)內(nèi)容
//3.在main中添加一下代碼
//1.將這個(gè)配置文件轉(zhuǎn)化為字節(jié)流
//使用類加載器轉(zhuǎn)化文件
InputStream is=qqq.class.getResourceAsStream ("../zz.properties");
Properties p=new Properties();
p.load(is);
System.out.println(p);
//獲取指定的單個(gè)內(nèi)容
System.out.println(p.getProperty("qq"));
事務(wù):
事務(wù)是指一組操作,要么都執(zhí)行成功,要么都執(zhí)行失敗。四個(gè)特性;
1)原子性:一組操作,要么都執(zhí)行成功,要么都執(zhí)行失敗。
?2)隔離性:一個(gè)事務(wù)的操作沒有完成之前,其他事務(wù)是不能對(duì)這個(gè)事務(wù)處理的結(jié)果進(jìn)行操作的,需要犧牲速度
3)一致性:事物發(fā)生和發(fā)生后的總金額依然匹配。
4)持久性:事務(wù)產(chǎn)生的影響是不能撤銷的。Connection c=DBUtil.getCon();c.setAutoCommit(false);//設(shè)置連接為手動(dòng)提交
c.commit();//在執(zhí)行完操作后提交事務(wù)
c.rollback();出現(xiàn)異常執(zhí)行回滾File操作:
構(gòu)造方法:
new File("路徑");
new File("父級(jí)路徑","文件名稱");
常用方法:
createNewFile():創(chuàng)建文件
mkdir():創(chuàng)建文件夾
mkdirs():創(chuàng)建多級(jí)文件夾
delete():刪除文件,當(dāng)你的文件夾中包含內(nèi)容的時(shí)候,是不會(huì)刪除的
判斷文件:判斷文件是否存在:exists();
判斷輸入的路徑是否是絕對(duì)路徑:isAbsolute()
判斷是否是一個(gè)文件夾:isDirectory();
判斷是否是一個(gè)文件:isFile();
判斷文件是否是隱藏文件:isHidden();
獲取的方法:
獲取文件的絕對(duì)路徑:getAbsoluteFile()
獲取文件的父路徑:getParentFile();
獲取文件的名字:getName();
返回創(chuàng)建對(duì)象時(shí)的路徑:getPath()
返回文件最后修改時(shí)間:lastModified()
返回文件的字節(jié)數(shù):length()
返回文件是否可讀:CanRead()
返回文件是否可寫:CanWrite();
list:得到文件夾下的所有的文件名稱,它得到的是一個(gè)String類型的數(shù)組
listFiles:得到文件夾下的所有的文件,它得到的是文件類型的數(shù)組
listRoots:得到計(jì)算機(jī)的根目錄
IO流的介紹:
輸入輸出流,將你的程序作為中心點(diǎn),從計(jì)算機(jī)中傳入到程序里叫做輸入流,從程序里往計(jì)算機(jī)輸出文件叫做輸出流
字節(jié)流,字符流,計(jì)算機(jī)文件的最基本單位是字節(jié),1個(gè)字符可以包含1-3個(gè)字節(jié)
1.字符流每次讀取兩個(gè)字節(jié),所以相較于字節(jié)流速度要快
2.字符流只能夠處理文本文件,字節(jié)流可以處理其他任何文件結(jié)論:只要是純文本數(shù)據(jù)優(yōu)先使用字符流,除此之外都使用字節(jié)
讀取文本內(nèi)容語法:
File f=new File("ceshi.txt");
//輸出流(追加內(nèi)容)
FileReader fw=new FileReader(f);
char[] cs=new char[100];
int len;
while((len=fw.read(cs))!=-1){
System.out.println(new String(cs,0,len));
}
fw.close();
寫入文本內(nèi)容語法:
File f=new File("ceshi.txt");
//輸出流(追加內(nèi)容)
FileWriter fw=new FileWriter(f);
char[] cs=new char[100];
int len;
while((len=fw.read(cs))!=-1){
fw.writer(new String(cs,0,len));
}
fw.close();
字節(jié)流:
FileInputStream:字節(jié)輸入流
FileOutputStream:字節(jié)輸出流
字節(jié)流是可以讀取任何文件,每次讀取的時(shí)候是1字節(jié)
緩沖流(包裝流):
BufferedReader:字符輸入緩沖流
BufferedWriter:字符輸出緩沖流
BufferedInputStream:字節(jié)輸入緩沖流
BufferedOutputStream:字節(jié)輸出緩沖流
為了提高讀寫流的效率,引入了緩沖機(jī)制,進(jìn)行批量的讀寫,提高了讀寫的效率。Buffered包裝類用于加快了讀寫內(nèi)容的速度轉(zhuǎn)換流:
兩個(gè)功能:1.將輸入的字節(jié)轉(zhuǎn)換為字符
2.進(jìn)行編碼轉(zhuǎn)換
InputStreamReader:字節(jié)輸入轉(zhuǎn)換流
OutputStreamWriter:字節(jié)輸出轉(zhuǎn)換流
ObjectInputStream:對(duì)象輸入流
ObjectOutputStream:對(duì)象輸出流
特點(diǎn):以前的流可以存儲(chǔ)文本,其他類型數(shù)據(jù),但是不可以存儲(chǔ)對(duì)象,這個(gè)流唯一特點(diǎn)就是可以存儲(chǔ)對(duì)象。
為什么要存儲(chǔ)對(duì)象:
因?yàn)樵趥鬏攦?nèi)容的時(shí)候,如果傳輸?shù)氖瞧胀?,一旦?nèi)容被獲取到,其他人可以通過轉(zhuǎn)碼將數(shù)據(jù)轉(zhuǎn)會(huì)源碼,但是對(duì)象流一旦被別人獲取到,別人要需要將其轉(zhuǎn)換為相應(yīng)的對(duì)象格式,才可以看到里面的內(nèi)容
RandomAccessFile:分割流
兩個(gè)參數(shù):1、地址? ?2、r(只讀)? rw(讀寫)
seek():從哪里開始讀數(shù)據(jù)
RandomAccessFile:
1.可以從任意位置進(jìn)行讀取數(shù)據(jù)
2.它是一個(gè)讀寫流既可以讀數(shù)據(jù),也可以寫數(shù)據(jù)
transient:只可以修飾屬性,修飾后的屬性不參與序列化
多線程怎么執(zhí)行的:
多個(gè)線程同時(shí)去搶奪cpu的執(zhí)行權(quán),那個(gè)線程搶到就執(zhí)行那個(gè)線程
進(jìn)程和線程的區(qū)別:一個(gè)進(jìn)程是包含多個(gè)線程的,進(jìn)程是在正在執(zhí)行的程序在內(nèi)存中的執(zhí)行區(qū)域
單線程和多線程的區(qū)別:單線程安全性高,效率低,多線程安全性低,效率高
thread英[θred]
seek英[si?k]
current英[?k?r?nt]
run() 線程
start() 啟動(dòng)線程
getName() 獲取線程的名稱
setName() 設(shè)置線程的名稱
Thread.CurrentThread.getName() 獲取線程的名稱
sleep() 線程休眠
activeCount() 返回線程的總數(shù)
seek():從哪里開始讀數(shù)據(jù)
返回文件是否可寫:CanWrite();
線程使用的第一種方式(繼承):
class a extends Thread{
public void run(){
//重寫run方法
}
}
//使用線程:
a aa=new a();
aa.start();
線程的生命周期:
1.就緒狀態(tài):實(shí)例化好了這個(gè)線程,但是并沒有啟動(dòng)這個(gè)線程
2.可運(yùn)行狀態(tài):啟動(dòng)了這個(gè)線程,但是這個(gè)線程并沒有搶到cpu的使用權(quán)
3.運(yùn)行狀態(tài):這個(gè)線程搶到了cpu的使用權(quán)
4.死亡狀態(tài):這個(gè)線程的代碼全部執(zhí)行完畢之后,就釋放掉這個(gè)線程
線程在運(yùn)行狀態(tài)的時(shí)候會(huì)觸發(fā)堵塞:
堵塞分為三種堵塞:
休眠:當(dāng)前獲取cpu使用權(quán)的線程會(huì)休眠,其他線程會(huì)暫停執(zhí)行,cpu的執(zhí)行權(quán)仍是有休眠的線程獲取
禮讓:當(dāng)前獲取到cpu使用權(quán)的線程會(huì)進(jìn)行禮讓,禮讓的時(shí)候會(huì)將cpu的使用權(quán)拋出,多個(gè)線程再重新?lián)寠Zcpu的使用權(quán),當(dāng)前線程仍有搶到cpu使用權(quán)的權(quán)利
插入隊(duì)列:
守護(hù)線程:為了保證正常線程的使用,對(duì)其進(jìn)行服務(wù)的,當(dāng)正常線程全部執(zhí)行完畢之后,守護(hù)線程也就會(huì)自動(dòng)釋放掉
setDaemon(true):設(shè)置用戶線程改為守護(hù)線程
join:插入隊(duì)列
sleep:線程休眠
yield:禮讓線程
stop:終止線程(盡量少用)