做业_java基础第十二天_集合

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

}

}

}

相关文章
相关标签/搜索