java集合

 

     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]

 

 

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值