2015-04-16 3 views
1

Прежде всего, добавьте элемент в HashSet и напечатайте размер HashSet, который возвращается как ожидалось. но я изменил одно из значений объекта и снова сохранил его в HashSet и удалил объект с использованием имени объекта. но все же я получаю тот же размер, что и предыдущий. Мой код в соответствии с:Удалить элемент из HashSet

public class Test { 

    private String s; 
    public Test(String s){ 
     this.s = s ; 
    } 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     HashSet<Object> hs = new HashSet<Object>(); 
     Test t1 = new Test("Keval"); 
     Test t2 = new Test("Keval"); 

     String s1 = new String("Keval");   

     hs.add(t1); 
     hs.add(t2); 
     hs.add(s1);  
     System.out.println("Set Size :: " + hs.size()); 

     s1 = new String("Demo");   
     hs.remove(s1); 
     System.out.println("Set Size :: " + hs.size()); 


    } 
} 

Вывод выше код:

Set Size :: 3 
Set Size :: 3 // Why it prints 3 insted of 2??? 
+2

Подсказка: '' Keval "! =" Demo "' – TheLostMind

+2

Не то, чтобы он отвечал на ваш вопрос, но вы должны реализовать методы 'hashcode' и' equals' в вашем классе 'Test', если вы хотите использовать их в структуре хэша, например HashSet. – Pshemo

+1

Значение s1 было изменено до 'hs.remove (s1);' statement – Rupesh

ответ

7
String s1 = new String("Keval");  
.... 
hs.add(s1); 
.... 
s1 = new String("Demo");   
hs.remove(s1); 

Вы добавляете String, которая равна String «Keval» к вашему HashSet, но вы пытаясь удалить String, равный String «Демо» от Set.

Ваш HashSet не содержит String равно «Demo», поэтому remove() вызов не удаляет ничего из Set, и не влияет на ее размер.

При удалении s1 = new String("Demo") линии, s1 все еще относится к String, который был добавлен к Set (тот, который равен «Keval»), так hs.remove(s1) удаляет что String из Set.

+0

Можете ли вы уточнить свой ответ? потому что когда я удаляю s1 = новый String («Demo»); от кода он отлично работает. –

+0

Посмотрите на свой код @KevalTrivedi – Rupesh

+2

@KevalTrivedi Ваш добавленный в ваш набор 'new String (« Keval »);' но пытается удалить 'new String (« Demo »);' которые не являются равными объектами. Другими словами, вы пытаетесь удалить объект, который не существует в наборе. – Pshemo

2

Если вы хотите, чтобы Hashset идентифицировал ваш объект, вам придется переопределить метод equals и hashcode.

С тех пор как вы добавили «Keval» и попытались удалить «Демо», изменений в настройках не существует.

Помните, поскольку вы используете HashSet объектов, будьте осторожны при игре с методом hashcode и equals, который может иметь непреднамеренные последствия. See this question для получения дополнительной информации об этом.

0

После того как вы сделали s1 = new String("Demo"), ссылка s1 просто ссылается на новый объект, а не на HashSet.

Так что не вынимая ничего из набора

1

Вашей проблемы есть несколько вопросов, и я думаю, что вы должны знать несколько основ.

  1. Всякий раз, когда вы делаете новое, он создает новый объект. s1 = new String("Demo");

  2. HashSet работает на объект, hashcode() и equals(). Поэтому, если вы используете свой собственный класс для добавления в Hashset, пожалуйста, переопределите оба этих метода. Для получения дополнительной информации обратитесь к Google.

  3. Теперь для вашей проблемы, когда вы создали новый объект, делая s1 = new String("Demo");, а затем пытается удалить этот новый объект из HashSet по hs.remove(s1);, HashSet будет использовать методы equals() и hashcode() идентифицировать объект, который должен быть удален , Поскольку этот новый объект отсутствует в hashset, ничего не будет удалено.

Следовательно, размер не изменяется.

0

Вы инициализируете строку как новой строки, которая создаст новую в строке pool.If удалить, прежде чем изменить значение строки будет удалить из хэша набора и даст размер как два (его потому, что при добавлении hs.remove, значение s1 является «Demo» не «keval».

String s1 = new String("Keval"); 
    hs.add(t1); 
    hs.add(t2); 
    hs.add(s1);  
    System.out.println("Set Size :: " + hs.size()); //3 
    s1 = new String("Demo"); 
    hs.remove(s1); //equals() method fails to find Demo and none of the element will be removed 
    System.out.println("Set Size :: " + hs.size()); 
0

HashSet находит ведро/место в HashSet путем вычисления хэш-код ключа. при добавлении s1 в ГВ ключ был «Keval», который будет генерировать хэш-код и объект s1 будет сохранен в этом ведре. Теперь вы изменили s1 на «Demo». При удалении s1 ведро будет поиск на основе hashcode, сгенерированный из ключа «Demo». Это ведро не найдено в hs и, следовательно, оно не удаляется. Хашед «Кеваль» и «Демонстрация» не то же самое. Надеюсь, это очистит ваше замешательство и ответит на ваш запрос.

Смежные вопросы