简述HashMap的优缺点
优点:与ArrayList不同,他在查找特定的对象时,不需要每次都遍历。因为它加入元素的方法与之前不同。常用的方法如下。在使用前也需要引入包
import java.util.*;
HashMap map=new HashMap();
map.put(Object key,Object value);
map.get(Object key);
map.remove(Object key);
这里我们可以看到,它的操作是通过键值key获取对应的值value,所以每次在添加元素的时候都会给这个元素一个编号。在具体查找的过程中,只要通过一个布尔函数去判断是否包含具体的key或者value就可以找到。无需遍历。同样存进去之后类型是Object,如果想取出来给对象需要经行类型转换。
if(map.containsKey(Object key)){...}
if(map.containsValue(Object value)){...}
缺点:首先和ArrayList不同的一点是,ArrayList是允许添加相同的元素的,比如说在里面添加学生类的对象student。我可以把两个完全相同的student添加进去也不会冲突。但是HashMap的Key是唯一的,如果有第二个元素的key值与之前的一个元素相同,那么后来的这个元素的value会替换之前的。
其次。HashMap的遍历很麻烦,因为你想取出元素都是通过key的,如果用往常的循环的方法来做首先key的值就不知道。所以在这里需要用迭代器去解决这个问题。
Iterator it=map.keySet().iterator();
while(it.hasNext){
//取出key
String key=it.next().toString();
//根据key取出对象
Student su=(Student)map.get(key);
}
总而言之没有什么方法是万能的,在某方面解决了一个问题,另一方面就会有所欠缺。所以重要的是去看不同的问题去选择。例子是比较简单的所以两个集合都可以去做,主要是熟悉下语言和应用。
代码如下:
/**
*作者:光羽住一
* 作用:雇员类
*
*/
package Employee;
public class Emp {
private String empNo;
private String empName;
private double empsal;
public Emp(String empNo,String empName,double empsal) {
this.empNo=empNo;
this.empName=empName;
this.empsal=empsal;
}
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public double getEmpsal() {
return empsal;
}
public void setEmpsal(double empsal) {
this.empsal = empsal;
}
}
package Employee;
/*
* 基于HashMap的雇员管理系统
*/
import java.util.HashMap;
import javax.swing.text.html.HTMLDocument.Iterator;
public class empManage_map {
private HashMap hm=null;
public empManage_map() {
hm=new HashMap();
}
//添加新的雇员
public void addEmp(Emp emp) {
hm.put(emp.getEmpNo(), emp);
System.out.println("添加成功!");
}
//根据员工编号打印信息
public void showInfo(String empNo) {
if(hm.containsKey(empNo)) {
Emp emp=(Emp)hm.get(empNo);
System.out.println("姓名:"+emp.getEmpName()+"薪水:"+emp.getEmpsal());
}
}
//打印全部员工的信息
public void showAll() {
java.util.Iterator it=hm.keySet().iterator();
while(it.hasNext()) {
String key=it.next().toString();
Emp emp=(Emp)hm.get(key);
System.out.println("姓名:"+emp.getEmpName()+"编号:"+emp.getEmpNo()+"薪水:"+emp.getEmpsal());
}
}
//修改员工薪水
public void changeSal(String empNo,double newSal) {
if(hm.containsKey(empNo)) {
Emp emp=(Emp)hm.get(empNo);
emp.setEmpsal(newSal);
}
}
//删除某个员工
public void removeEmp(String empNo) {
hm.remove(empNo);
System.out.println("删除成功!");
}
}
package Employee;
/*
* 主界面类
*/
import java.io.*;
public class employeeCenter {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
empManage_map manage=new empManage_map();
while(true) {
System.out.println("雇员管理系统,请选择功能");
System.out.println("1.添加雇员");
System.out.println("2.查看雇员信息");
System.out.println("3.查看所有雇员信息");
System.out.println("4.修改雇员薪水");
System.out.println("5.退出系统");
String type=buf.readLine();
int choice =Integer.parseInt(type);
switch(choice) {
case 1:
System.out.println("请输入雇员编号:");
String empNo=buf.readLine();
System.out.println("请输入雇员姓名:");
String empName=buf.readLine();
System.out.println("请输入雇员薪水:");
String empSal=buf.readLine();
double sal=Double.parseDouble(empSal);
Emp emp=new Emp(empNo,empName,sal);
manage.addEmp(emp);
break;
case 2:
System.out.println("请输入要查找的员工编号:");
String empNo2=buf.readLine();
manage.showInfo(empNo2);
break;
case 3:
manage.showAll();
break;
case 4:
System.out.println("请输入要修改薪水的员工编号:");
String empNo3=buf.readLine();
System.out.println("请输入修改后的薪水:");
String empSal3=buf.readLine();
double sal3=Double.parseDouble(empSal3);
manage.changeSal(empNo3, sal3);
break;
case 5:
System.out.println("谢谢使用,再见!");
System.exit(0);
break;
default :
System.out.println("输入错误,请从新输入!");
break;
}
}
}
}