hashmap 和hashtable 其实在用法上没有什么区别 ,就如同arraylist和vector一样,一个是在jdk 1.0时一个是在jdk1.2后出现的,hashmap采用的是异步处理方式所以比hashtable的同步处理效率上要高一些,hashmap是非线程安全,hashtable是线程安全
hashmap是借口map的实现类,其实hashmap并非直接实现map借口,它是继承 AbstractMap<K, V>类,通过他来实现map借口
关于hashmap 的使用< k,v> 最主要就是 根据k 很快查找 出v
public class Hashmap1 {
public static void main(String[] args) {
Map<String, Integer> hashmMap = new HashMap<String, Integer>();
hashmMap.put("zhang", 12);
hashmMap.put("zhang", 12);
hashmMap.put("zhang", 32);
hashmMap.put("li", 28);
hashmMap.put("wang", 32);
System.out.println(hashmMap);
}
输出{li=28, zhang=32, wang=32}可以看出hashmap是无序,散列的 其不存在重复项,两个相同的值将被覆盖
关于 entrySet()方法的使用
public static void main(String[] args) {
Map<String, Integer> hashmMap = new HashMap<String, Integer>();
hashmMap.put("zhang", 12);
hashmMap.put("zhang", 12);
hashmMap.put("zhang", 32);
hashmMap.put("li", 28);
hashmMap.put("wang", 32);
Set<Map.Entry<String, Integer>> set=hashmMap.entrySet();
Iterator<Map.Entry<String, Integer>> iterator=set.iterator();
while (iterator.hasNext())
{
Map.Entry<String, Integer> entry=iterator.next();
System.out.println(entry.getKey()+" "+entry.getValue());
}
输出 li 28
zhang 32
wang 32
get()方法
public static void main(String[] args) {
Map<String, Integer> hashmMap = new HashMap<String, Integer>();
hashmMap.put("zhang", 12);
System.out.println(hashmMap.get(new String ("zhang")));
}
输出 12
但当我们get(new 自定义类())时
自定义类Person
private String nameString;
private int age;
public Person(String nameString,int age){
this.nameString=nameString;
this.age=age;
}
public String toString()
{
return "姓名:"+this.nameString+" 年龄:"+this.age;
}
然后执行
public static void main(String[] args) {
Map<Person, Integer> hashmMap = new HashMap<Person, Integer>();
hashmMap.put(new Person("zhang",11), 12);
System.out.println(hashmMap.get(new String ("zhang")));
}
输出 null
其实String类已经实现了 Object类中的equal()和hashcode()方法,这是Object中最重要的两个方法,关于这个类中的native方法()本人研究的不深,只认为不是java代码实现的,它是本地系统的底层代码
而 我们自定义的类person并没有实现这两个方法,所以我们要手工添加他
@Override
public boolean equals(Object obj) {
Person person=(Person)obj;
if(this.nameString==person.nameString&&this.age==person.age)
{
return true;
}
else {
return false;
}
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.age*this.age;
}
然后再执行原来代码输出
12
其实string这个类还实现了一个很重要的借口comparable
假如我们自己写一个类person没有实现comparable接口,然后创建treeset或treemap集合时里面存放的是person实例的话会出现以下错误(以treeset为例)
Exception in thread "main" java.lang.ClassCastException: com.tet.map.Person cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at com.tet.map.TestHaspMap.main(TestHaspMap.java:12)
就是说treeset集合不知道按照何种方式排序
我们要指定 实现comparable借口中的comparaTo()方法
public class Person implements Comparable<Person>
@Override
public int compareTo(Person arg0) {
if (this.age>arg0.age)
return 1;
else if(this.age<arg0.age)
return -1;
else {
return 0;
}
treeset集合为:
Set<Person> treesSet=new TreeSet<Person>();
treesSet.add(new Person("zhang", 12));
treesSet.add(new Person("li", 23));
treesSet.add(new Person("wang", 18));
System.out.println(treesSet)
输出 [姓名:zhang 年龄:12, 姓名:wang 年龄:18, 姓名:li 年龄:23]