集合
Collection接口
- Set接口(元素?zé)o序蜂林,不可重復(fù)的集合,無(wú)序性:針對(duì)的是元素在底層存儲(chǔ)的位置是無(wú)序的)
set存儲(chǔ)自定義類(lèi)拇泣,一定要重寫(xiě)equals()和hashcode()方法噪叙,當(dāng)向set中添加對(duì)象時(shí),首先調(diào)用此對(duì)象所在類(lèi)的hashCode()方法挫酿,計(jì)算此對(duì)象的哈希值构眯,此哈希值決定了此對(duì)象的set中的存儲(chǔ)位置。若此位置之前沒(méi)有對(duì)象存儲(chǔ)早龟,則這個(gè)對(duì)象直接存儲(chǔ)到此位置惫霸,若此位置已有對(duì)象存儲(chǔ),再通過(guò)equals()比較兩個(gè)對(duì)象是否相同,如果相同葱弟,后一個(gè)對(duì)象就不能再添加進(jìn)來(lái)壹店。
- HashSet
時(shí)HashMap的一個(gè)特別的實(shí)現(xiàn)
- LinkedHashSet
使用鏈表維護(hù)了一個(gè)添加進(jìn)集合中的順序,遍歷集合元素是芝加,是按照添加時(shí)的順序遍歷的硅卢。插入性能略低于HashSet,但是在迭代訪問(wèn)Set里面的全部元素時(shí)有很好的性能。
- TreeSet
- 添加的元素必須時(shí)同一個(gè)類(lèi)的(其他例如,list,HashSet等都是可以添加任意類(lèi)型的)
- 可以按照添加進(jìn)集合的元素的指定的順序遍歷藏杖,例如String将塑,包裝類(lèi)等默認(rèn)按照從小到大的順序遍歷。
- 當(dāng)自定義類(lèi)沒(méi)有實(shí)現(xiàn)Comparable接口時(shí)蝌麸,當(dāng)向TreeSet添加該類(lèi)對(duì)應(yīng)的對(duì)象時(shí)候点寥,會(huì)報(bào)錯(cuò),因?yàn)槔捶裕琓reeSet存儲(chǔ)必須有個(gè)順序,這個(gè)順序計(jì)算規(guī)則就是實(shí)現(xiàn)Comparable接口后敢辩,重寫(xiě)的compareTo()方法
- List接口(元素有序,可重復(fù)的集合)
- ArrayList
底層是數(shù)據(jù)弟疆,增刪慢戚长,查找快
- LinkedList
> 底層是鏈表,增刪快怠苔,查找慢
- Vector
> 是線程安全的
- ArrayList
Map接口(鍵值對(duì)集合)
- HashMap:遍歷順序和添加順序不見(jiàn)得相同(可以null鍵和值)
- LinkedHashMap:使用鏈表維護(hù)添加的順序,保證遍歷順序和添加順序相同
- TreeMap:按照添加進(jìn)Map中的元素key的指定屬性進(jìn)行排序,key必須時(shí)同一個(gè)類(lèi)的對(duì)象
- HashTable:線程安全(不可以null鍵和值)
- Properties:常用來(lái)處理屬性文件,鍵和值都為String類(lèi)型(例如:jdbc.properties文件)
Collections工具類(lèi)(操作Map和Collection)
- 排序操作(均為static方法)
- reverse(List):反轉(zhuǎn)List中元素的順序
- shuffle(List):對(duì)List集合元素進(jìn)行隨機(jī)排序
- sort(List):根據(jù)元素的自然順序?qū)χ付ǖ腖ist集合按照升序排序
-swap(List,int i,int j):將指定的List集合中的i處元素和j處元素互換
- 查找 替換
- Object max(Collection):根據(jù)元素的自然順序,返回給定集合中的最大元素
- Object max(Collection,Comparator):根據(jù)Comparator指定的順序,返回給定集合中的最大元素
- 類(lèi)似的有Object min(Collection)/Object min(Collection,Comparator)
- int frequency(Collection,Object):返回指定集合中指定元素出現(xiàn)的次數(shù)
- void copy(List dest,List src):將src內(nèi)容復(fù)制到dest
- boolean replaceAll(List list,Object oldval,Object newval):使用新值替換list對(duì)象的所有舊值.
- Collections類(lèi)中提供了多個(gè)synchronizedXXX()方法,該方法可使將指定集合包裝成線程同步的集合,從而解決線程安全問(wèn)題
例如:Collections.syncchronizedList(list)
泛型
解決元素存儲(chǔ)的安全性問(wèn)題(任何類(lèi)型都可以添加到集合中同廉,類(lèi)型不安全)
解決獲取數(shù)據(jù)元素時(shí),需要類(lèi)型強(qiáng)制轉(zhuǎn)換的問(wèn)題
注解Annotation
- JDK內(nèi)置的基本注解類(lèi)型(3個(gè))
- Override:限定重寫(xiě)父類(lèi)方法,該注釋只能用于
- Deprecated:用于表示某個(gè)程序元素(類(lèi)恤溶,方法等)已過(guò)時(shí)
- SupperessWarnings:抑制編譯器警告
- 其他還有自定義注解和元注解乓诽,不常用
File
- File的API
File f=new File("E.java");
File f1=new File("C:/Users/Administrator/Desktop/C.java");
boolean flag=f.renameTo(f1);
說(shuō)明:修改文件名,其實(shí)時(shí)剪切文件并改名咒程,要求:f必須存在而f1必須不存在
- 文件流
- 字節(jié)流
- FileInputStream
- FileOutputStream
- 字符流
- FileReader
- FileWriter
- 緩沖流
- BufferedInputStream
- BufferedOutputStream(寫(xiě)完之后要加上flush())
- BufferedReader(除了通用的read()之外還有readLine())
- BufferedWriter(寫(xiě)完之后要加上flush())
如果針對(duì)兩個(gè)輸出的緩沖流不手動(dòng)flush鸠天,則在緩沖區(qū)滿了之后會(huì)自動(dòng)刷到文件中,但是此時(shí)總會(huì)在遺失最后一次的緩沖區(qū)未滿的內(nèi)容帐姻。所以每次讀取都要手動(dòng)調(diào)用flush()
- 轉(zhuǎn)換流(字節(jié)流和字符流之間的相互轉(zhuǎn)換)
字節(jié)流中數(shù)據(jù)都是字符時(shí)稠集,轉(zhuǎn)成字符流操作更高效
- InputStreamReader
- OutputStreamWriter
- 打印流(可以打印到對(duì)應(yīng)文件中)
- PrintStream 字節(jié)流
- PrintWriter 字符流
- 數(shù)據(jù)流
為了方便操作基本數(shù)據(jù)類(lèi)型的數(shù)據(jù)(讀寫(xiě)),套接在InputStream和OutputStream上
- DataInputStream
- DataOutputStream
- 對(duì)象流(涉及序列化反序列化)
- ObjectInputStream
反序列化:用ObjectInputStream類(lèi)從IO流中恢復(fù)該java對(duì)象
- ObjectOutputStream
> 序列化:用ObjectOutputStream類(lèi)將一個(gè)java對(duì)象寫(xiě)入IO流中
- ObjectInputStream
- 隨機(jī)存取文件流
程序可以直接跳到文件的任意地方來(lái)讀饥瓷、寫(xiě)文件
- RandomAccessFile
- long getFilePointer():獲取文件記錄指針的當(dāng)前位置
- void seek(long pos):將文件記錄指針定位到pos位置
- 構(gòu)造器
- public RandomAccessFile(File file,String mode)
- public RandomAccessFile(String name,String mode)
r:只讀方式打開(kāi)剥纷,rw:打開(kāi)以便讀取和寫(xiě)入(是使用buffer的,只有cache滿的或者使用RandomAccessFile.close()關(guān)閉流的時(shí)候兒才真正的寫(xiě)到文件),rwd:打開(kāi)以便讀取和寫(xiě)入呢铆,同步文件內(nèi)容的更新(每個(gè)更新都會(huì)同步)晦鞋,rws:打開(kāi)以便讀取和寫(xiě)入,同步文件內(nèi)容和元數(shù)據(jù)的更新。
readline:讀取的內(nèi)容會(huì)忽略換行符
換行符消失問(wèn)題棺克,原內(nèi)容圖一悠垛,執(zhí)行后內(nèi)容圖二
File f1=new File("a.txt");
RandomAccessFile ra=null;
try {
ra=new RandomAccessFile(f1, "rw");
ra.seek(10);
ra.write("csabcahc".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally{
if(ra!=null){
try {
ra.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
說(shuō)明:因?yàn)镽andomAccessFile寫(xiě)內(nèi)容其實(shí)是覆蓋而不是插入,seek之后娜谊,第一行寫(xiě)入了"csabcahc"
這些字符确买,自動(dòng)會(huì)向后,會(huì)覆蓋掉本來(lái)第一行的換行符纱皆,導(dǎo)致第二行擠上來(lái)湾趾。
解決方案:使用字符讀取的方式,先讀取seek之后的內(nèi)容(可以用StringBuffer存儲(chǔ))派草,然后寫(xiě)"csabcahc"搀缠,然后把讀取的內(nèi)容在從sb中在寫(xiě)入到文件中(之所以不用readline,是因?yàn)闀?huì)忽略換行符近迁,而sb作用就是可以保留換行符)胡嘿。