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){}
}
}
}