1.描述HashMap内部实现原理。
HashMap是Map的子类实现,是key-value结构的,其中key存储的是不重复的元素,HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
HashMap底层就是一个数组结构,数组的每一项又是一个链表。hashmap的查找机制是先用对象的hashcode得出一个地址用equals比较地址中的链表的各个元素如果相同取出对应的value值。
2.描述Hashset和HashMap的区别。
除开HashMap和Hashtable外,还有一个hash集合HashSet,有所区别的是HashSet不是key value结构,
仅仅是存储不重复的元素,相当于简化版的HashMap,只是包含HashMap中的key而已,HashSet内部就是使用HashMap实现,
只不过HashSet里面的HashMap所有的value都是同一个Object而已,因此HashSet也是非线程安全的,
此外,HashSet实现Set接口,Set接口继承Collection接口;HashMap实现Map接口,Map接口与Collection接口是同级的。
他们都具有不重复的特点,采用hash机制存储和查询。
3.年级的集合使用Map的嵌套实现。
10班,每个班50人。
package com.it18zhang.day12;
/*
* 年级的集合使用Map的嵌套实现。
* 10班,每个班50人。
* Map<Integer,Map<String,Student>>
* */
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class MapDemo {
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++){
names = new HashMap<String,String>();
classes.put(i, names);
//向班级中添加50个学生
for(int j=1 ; j<=50; j++){
names.put(i+"."+j, "tom"+no);
no++;
}
}
System.out.println("\n------------------------entrySet-------------------------\n");
//遍历班级集合的entrySet
for(Entry<Integer,Map<String,String>> entry : classes.entrySet()){
//班级号
Integer key = entry.getKey();
//名单集合
Map<String,String> values = entry.getValue();
//遍历名单集合
for(Entry<String,String> entry2 : values.entrySet()){
String stuNo = entry2.getKey();
String stuName = entry2.getValue();
System.out.println(key+"\t===>\t"+stuNo+"\t-->\t"+stuName);
}
}
System.out.println("\n-------------------------------keySet-----------------------------\n");
//遍历班级集合的keySet
for(Integer classNo : classes.keySet()){
//获取班级Map
Map<String,String> map = classes.get(classNo);
//使用keySet遍历班级Map
for(String stuNo : map.keySet()){
String name = map.get(stuNo);
System.out.println(classNo+"\t===\t"+stuNo+"\t===\t"+name);
}
}
//
}
}
4.编程实现文本文件的复制。合理设计程序,得到缓冲区的大小的高效区间。
提示缓冲区设置1k开始,不超过10M。
package com.it18zhang.day12;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileDemo {
public static void main(String[] args) {
//获取系统属性行分割符
String str = System.getProperty("line.separator");
System.out.println(str);
//创建待复制文件和目标文件
String srcFile = "d:\\aa.txt";
String targFile = "d:\\bb.txt";
//定义文件字符读取和写入流
FileReader reader = null;
FileWriter writer = null;
try{
//将流指向文件路径
reader = new FileReader(srcFile);
writer = new FileWriter(targFile,false);
//创建字符缓冲数组,用于批量读取写入字符
char[] buf = new char[2];
int len = 0;
while((len = reader.read(buf)) != -1){
writer.write(buf,0,len);
}
System.out.println("------copy over--------");
}
catch(IOException e){
e.printStackTrace();
}
finally{
try{
if(reader != null)
reader.close();
if(writer != null)
writer.close();
}
catch(IOException e1){
e1.printStackTrace();
}
}
}
}