Дублирующиеся элементы в java.util. Набор

Хотя вы не можете редактировать код во время пошагового выполнения с помощью отладчика, проекты веб-сайтов позволяют вам просто редактировать исходный код и затем перезагружать страницу. Это почти так же полезно, как «Редактировать и продолжить». Динамическая компиляция ASP.NET позволяет изменять исходный код, который запускает автоматическую перекомпиляцию.

Вот связанная статья по Общие сведения о динамической компиляции ASP.NET

Эта страница также полезна и имеет раздел под названием Сравнение проектов веб-сайтов и проектов веб-приложений

11
задан Joachim Sauer 29 October 2009 в 09:31
поделиться

4 ответа

На самом деле AFAIK из исходников большинство реализаций Set в java даже не проверяют, содержится ли элемент уже.

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

например, HashSet вызывает помещает (K, V) во внутреннюю HashMap , который просто вставляет новый объект, перезаписывая старую запись в случае дублирования.

14
ответ дан 3 December 2019 в 03:35
поделиться

Немного углубившись в свой вопрос, я предполагаю, что вы наблюдаете странное поведение с java.util.HashSet (обычно то, что все используют по умолчанию).

В отличие от контракта java.util.Set , можно получить один и тот же объект в java.util.HashSet дважды следующим образом:

import java.util.HashSet;
import java.util.Set;

public class SetTest 
{
  public static void main(String[] args) 
  {
    MyClass myObject = new MyClass(1, "testing 1 2 3");

    Set<MyClass> set = new HashSet<MyClass>();
    set.add(myObject);

    myObject.setHashCode(2);
    set.add(myObject);

    System.out.println(set.size());  // this will print 2.
  }

  private static class MyClass 
  {
    private int hashCode;
    private String otherField;

    public MyClass(int hashCode, String otherField) 
    {    
      this.hashCode = hashCode;
      this.otherField = otherField;
    }

    public void setHashCode(int hashCode) 
    {
      this.hashCode = hashCode;
    }

    public boolean equals(Object obj) 
    {    
      return obj != null && obj.getClass().equals(getClass()) && ((MyClass)obj).otherField.equals(otherField);
    }

    public int hashCode() 
    {
      return hashCode;
    }
  }
}

После указателя из @jitter и взглянув на источник, вы поймете, почему это произошло.

Как говорит @jitter, java.util.HashSet использует java.util.HashMap внутри . Когда хеш изменяется между первым и вторым add , в java.util.HashMap используется другой сегмент, и объект находится в наборе дважды.

Пример кода может выгляжу немного надуманным, но я

11
ответ дан 3 December 2019 в 03:35
поделиться

Самый простой способ узнать это - поискать в исходном коде интересующий вас код.

В каждый JDK включен файл src.zip, содержащий исходный код для общедоступных классов, так что вы можете просто найти источник для HashSet и взгляните :) Я часто использую для этого Eclipse. Запустите его, создайте новый проект Java, установите JVM как установленный JDK (в противном случае вы используете системную JRE по умолчанию, у которой нет src.zip) и Ctrl-Shift-T для перехода к HashSet.

2
ответ дан 3 December 2019 в 03:35
поделиться

Read your question more detailed:

You can't add duplicates, from java doc for Set.add() or do you mean addAll?:

Adds the specified element to this set if it is not already present (optional operation). More formally, adds the specified element e to this set if the set contains no element e2 such that (e==null ? e2==null : e.equals(e2)). If this set already contains the element, the call leaves the set unchanged and returns false. In combination with the restriction on constructors, this ensures that sets never contain duplicate elements.

0
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: