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();

}

}

}


}