Ошибка в методе remove класса ArrayList

package Lesson20;

import java.util.ArrayList;

public class Test3_4 {
    public static void main(String[] args) {
        ArrayList<StringBuilder> list = new ArrayList<>();
        StringBuilder sb1 = new StringBuilder("Один");
        StringBuilder sb2 = new StringBuilder("Два");
        StringBuilder sb3 = new StringBuilder("Три");
        list.add(sb1);
        list.add(sb2);
        list.add(sb3);
        
        list.remove("Два");
        for(StringBuilder s: list){
            System.out.print(s + " ");
        }
    }
}

Почему не сработает метод remove?

Если тип данных будет например String, то все сработает отлично

package Lesson20;
import java.util.ArrayList;
public class Test3_3 {
    static void showInfo(ArrayList array){
        for(int i=0; i< array.size(); i++){
            System.out.print(array.get(i)+ " ");
        }
        System.out.println();
        System.out.println("-------------");
    }
    public static void main(String[] args) {
        ArrayList <String> list = new ArrayList<>();
        list.add("Ноль");
        list.add("Один");
        list.add("Два");
        list.add("Три");
        list.add("Четыре");
        showInfo(list);
        list.remove("Три");
        showInfo(list);
    }
}

Ответы (2 шт):

Автор решения: motpfofs

Как правильно написали вам в комментариях: в списке вы используете тип StringBuilder, а удалить пытаетесь объект типа string. Поэтому ничего не удаляется.
Вам нужно пытаться удалить объект:

list.remove(sb2);

Если вы хотите удалить элемент StringBuilder, но у вас есть только инфомация о строке, попробуйте воспользоваться этим кодом:

Iterator<StringBuilder> itr = list.iterator();
while (itr.hasNext()) {
   StringBuilder strbldr = itr.next(); 
   if(strbldr.toString().equals("2"))
   {
       itr.remove();
   }
}

Результат его работы

→ Ссылка
Автор решения: Barmaley

Вообще оба кода неправильные, 2-й работает, только благодаря оптимизации компилятора. Поясняю:

  1. В первом коде элемент не удаляется не потому, что хранится StringBuilder, а вы удаляете String. Сигнатура метода удаления такая: remove(Object object), то есть на вход надо подавать ссылку на объект, который вы хотите удалить, именно поэтому конструкция list.remove(new StringBuilder("Два")) не сработает, поскольку сложили 1 объект, а пытаетесь удалить другой
  2. Во второй конструкции немного хитрее, потому что компилятор "понимает", что объект "Три" в конструкции list.add("Три") и list.remove("Три") один и тот же, поэтому удаление срабатывает.

Правильный код должен быть примерно такой:

ArrayList<StringBuilder> list = new ArrayList<>();
StringBuilder sb2 = new StringBuilder("Два");
list.add(sb2);
list.remove(sb2);
→ Ссылка