Хотя вы не можете редактировать код во время пошагового выполнения с помощью отладчика, проекты веб-сайтов позволяют вам просто редактировать исходный код и затем перезагружать страницу. Это почти так же полезно, как «Редактировать и продолжить». Динамическая компиляция ASP.NET позволяет изменять исходный код, который запускает автоматическую перекомпиляцию.
Вот связанная статья по Общие сведения о динамической компиляции ASP.NET
Эта страница также полезна и имеет раздел под названием Сравнение проектов веб-сайтов и проектов веб-приложений
На самом деле AFAIK из исходников большинство реализаций Set
в java даже не проверяют, содержится ли элемент уже.
Они просто всегда выполняют add ()
на их внутренней структуре, которая содержит элементы набора и позволяет этому объекту обрабатывать случай дублирования.
например, HashSet
вызывает помещает (K, V)
во внутреннюю HashMap
, который просто вставляет новый объект, перезаписывая старую запись в случае дублирования.
Немного углубившись в свой вопрос, я предполагаю, что вы наблюдаете странное поведение с 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
используется другой сегмент, и объект находится в наборе дважды.
Пример кода может выгляжу немного надуманным, но я
Самый простой способ узнать это - поискать в исходном коде интересующий вас код.
В каждый JDK включен файл src.zip, содержащий исходный код для общедоступных классов, так что вы можете просто найти источник для HashSet и взгляните :) Я часто использую для этого Eclipse. Запустите его, создайте новый проект Java, установите JVM как установленный JDK (в противном случае вы используете системную JRE по умолчанию, у которой нет src.zip) и Ctrl-Shift-T для перехода к HashSet.
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.