1.描述HashMap內部實現原理。java
答:算法
HashMap存的是K-V對,K是惟一的不重複的.編程
在存儲方式上hashmap底層實現了一個散列算法,散列是一種基於關鍵詞的搜索算法,提高了hashmap的查找速度。數組
hashmap的查找機制是先用對象的hashcode得出一個地址,用equals比較地址中的鏈表的各個元素若是相同取出對應的value值。app
2.描述Hashset和HashMap的區別。ide
答:spa
Hashset:Hashset集合內部是經過HashMap進行實現的。使用的是HashMap中key部分。實現set接口,set繼承collection接口設計
HashMap:實現Map接口,Map接口與Collection接口是同級的。code
它們都具備不重複的特色,採用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){}
}
}
}