作業_java基礎第十二天_集合

1.描述HashMap內部實現原理。

答:

HashMap存的是K-V對,K是唯一的不重複的.

在存儲方式上hashmap底層實現了一個散列算法,散列是一種基於關鍵詞的搜索算法,提升了hashmap的查找速度。

hashmap的查找機制是先用對象的hashcode得出一個地址,用equals比較地址中的鏈表的各個元素如果相同取出對應的value值。



2.描述Hashset和HashMap的區別。

答:

Hashset:Hashset集合內部是通過HashMap進行實現的。使用的是HashMap中key部分。實現set接口,set繼承collection接口

HashMap:實現Map接口,Map接口與Collection接口是同級的。

它們都具有不重複的特點,採用hash機制進行存儲。


【--------------------------------作業3-------------------------------------------】

package 作業;

//年級的集合使用Map的嵌套實現。10班,每個班50人

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;


public class MapDemo3 {

public static void main(String[] args) {

//班級集合

Map<Integer,Map<String,String>> classes=new HashMap<Integer,Map<String,String>>();//這裏用了嵌套了

//名單集合

Map<String,String> names=null;

int no=1;

//向班級集合添加班級(名單集合)

for(int i=1;i<=10;i++){//10個班

names=new HashMap<String,String>();

classes.put(i, names);//i是班號

for(int j=1;j<=50;j++){//每個班50人

names.put(i+"."+j, "tom"+no);

no++;//編號

}

}

//EntrySet遍歷集合

for(Entry<Integer,Map<String,String>> entry:classes.entrySet()){//這裏也要導包,不然會報錯

//班號

Integer key=entry.getKey();

//名單集合

Map<String,String> values=entry.getValue();

//遍歷名單集合

for(Entry<String, String> entry0:values.entrySet()){////Set<K> keySet()返回此映射中包含的鍵的 set 視圖。

//取出學號

String stuNo=entry0.getKey();

//名稱

String stuName=entry0.getValue();

System.out.println(key+"===============}}}}}"+stuNo+"----}}}"+stuName);

}

}

//使用KeySet遍歷集合

for(Integer classNo:classes.keySet()){

Map<String,String> map=classes.get(classNo);

for(String stuNo:map.keySet()){

String name=map.get(stuNo);

System.out.println(stuNo+"=========="+name);

}

}

}

}


【--------------------------------作業4-------------------------------------------】


package 作業;


import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;


//4.編程實現文本文件的複製。合理設計程序,得到緩衝區的大小的高效區間。

//提示緩衝區設置1k開始,不超過10M。

public class CopyFileDemo4 {

public static void main(String[] args) {

//獲取系統屬性

String str=System.getProperty("line.separator");//行分隔符,不同平臺行分隔符不一樣

//public static String getProperty(String key)獲得指定鍵指示的系統屬性。 

//參數:

//key - 系統屬性的名稱。 

//返回:

//系統屬性的字符串值,如果沒有帶有此鍵的屬性,則返回 null。

System.out.println(str);

String srcFile="d:/aa.txt";

String targFile="d:/bb.txt";

//先創建一個文件aa.txt

FileWriter writer=null;//這裏先不new,不然還是得try起來

try{

writer=new FileWriter(srcFile,false);

writer.write("hello world\r\nhow are you?\r\n你好嗎?\r\n");

System.out.println("aa.txt文件生成");

}

catch(IOException e){

e.printStackTrace();

}

finally{

//釋放資源,關閉流的目的是爲了釋放資源。不寫close的話打出來的文件沒內容,writer作用是存在你內存的,要close之後再作用到文件

try{

if(writer!=null){//保證程序健壯性

writer.close();

}

}

catch(Exception e2){};

}

FileReader reader2=null;

//public class FileReader extends InputStreamReader用來讀取字符文件的便捷類。


FileWriter writer2=null;

//public class FileWriter extends OutputStreamWriter用來寫入字符文件的便捷類。

try {

//讀取src文件的reader

reader2=new FileReader(srcFile);

//FileReader(String fileName) 

//        在給定從中讀取數據的文件名的情況下創建一個新 FileReader。

writer2=new FileWriter(targFile,false);//會有異常

//FileWriter(String fileName, boolean append) 

//        在給出文件名的情況下構造 FileWriter 對象,它具有指示是否掛起寫入數據的 boolean 值。(追加的意思)

//定義字符緩衝區

char[] buf=new char[1024];

int len=0;

while((len=reader2.read(buf)) != -1){//返回-1說明到文件尾部了

//public int read(char[] cbuf) throws IOException將字符讀入數組。

writer2.write(buf,0,len);

//不能直接是writer2.writer(buf);寫入的應該是數組的子集,不是把整個字符緩衝區的數組輸出.

//比如17個字符,第一次10個,第二次7個,但數組是滿的,寫出來10個的話還有3個就是重複寫的了。或者字符串是1024,實際賦值的就10,讀的話也會出問題

}

System.out.println("bb.txt文件複製aa.txt完成");

} catch (Exception e) {//這裏寫FileNotFoundException的話不夠全面,其他的還是會報錯的

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

finally{

try{

if(reader2!=null){

reader2.close();

}

if(writer!=null){

writer2.close();

}

}

catch(Exception e2){}

}

}

}


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