Когда pthread_spin_lock подходит для использования (например, мьютекс pthread)?

Поведение карты не указывается, если значение объекта изменяется таким образом, что влияет на сравнение сравнений, а объект (Mutable) - это ключ. Даже для Set также с использованием изменяемого объекта в качестве ключа это не очень хорошая идея.

Давайте посмотрим здесь пример:

public class MapKeyShouldntBeMutable {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Map<Employee,Integer> map=new HashMap<Employee,Integer>();

    Employee e=new Employee();
    Employee e1=new Employee();
    Employee e2=new Employee();
    Employee e3=new Employee();
    Employee e4=new Employee();
    e.setName("one");
    e1.setName("one");
    e2.setName("three");
    e3.setName("four");
    e4.setName("five");
    map.put(e, 24);
    map.put(e1, 25);
    map.put(e2, 26);
    map.put(e3, 27);
    map.put(e4, 28);
    e2.setName("one");
    System.out.println(" is e equals e1 "+e.equals(e1));
    System.out.println(map);
    for(Employee s:map.keySet())
    {
        System.out.println("key : "+s.getName()+":value : "+map.get(s));
    }
}

  }
 class Employee{
String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public boolean equals(Object o){
    Employee e=(Employee)o;
    if(this.name.equalsIgnoreCase(e.getName()))
            {
        return true;
            }
    return false;

}

public int hashCode() {
    int sum=0;
    if(this.name!=null)
    {
    for(int i=0;i<this.name.toCharArray().length;i++)
    {
        sum=sum+(int)this.name.toCharArray()[i];
    }
    /*System.out.println("name :"+this.name+" code : "+sum);*/
    }
    return sum;

}

}

Здесь мы пытаемся добавить к карте изменчивый объект «Сотрудник». Он будет работать хорошо, если все добавленные ключи различны. Если у меня есть переопределенные равные и хэш-коды для класса сотрудников.

См. Сначала Я добавил «e», а затем «e1». Для обоих из них equals () будет истинным, а hashcode будет таким же. Таким образом, карта видит, что добавляется тот же ключ, поэтому он должен заменить старое значение значением e1. Затем мы добавили e2, e3, e4, на данный момент мы прекрасны.

Но когда мы меняем значение уже добавленного ключа i.e «e2» как единое целое, оно становится ключом, подобным ранее добавленному. Теперь карта будет вести себя проводной. В идеале e2 должен заменить существующий такой же ключ i.e e1. Но теперь карта также берет это. И вы получите это в o / p:

 is e equals e1 true
{Employee@1aa=28, Employee@1bc=27, Employee@142=25, Employee@142=26}
key : five:value : 28
key : four:value : 27
key : one:value : 25
key : one:value : 25

См. Здесь оба ключа с одним и тем же значением. Итак, его неожиданность. Теперь снова запустите ту же программу, изменив здесь e2.setName("diffnt");, который является e2.setName("one"); здесь ... Теперь o / p будет следующим:

 is e equals e1 true
{Employee@1aa=28, Employee@1bc=27, Employee@142=25, Employee@27b=26}
key : five:value : 28
key : four:value : 27
key : one:value : 25
key : diffnt:value : null

Итак, добавив изменение изменчивого ключа на карте не рекомендуется.

37
задан Lyke 6 July 2011 в 21:43
поделиться