W moim programie muszę śledzić listę otwartych połączeń z jakimś serwerem HTTP - w razie potrzeby rozłączyć je natychmiast.Usuwanie obiektu URLConnection z tablicy ArrayList <URLConnection>
Napotkałem następujący problem. Jeśli podłączę się do serwera HTTP, wszystko działa idealnie, ale jeśli do HTTPS, połączenia nie zostaną usunięte z listy. Prowadzi to do wycieku pamięci.
Przykład:
package test;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
try {
ArrayList<URLConnection> al = new ArrayList<URLConnection>();
URL url = new URL("http://www.example.com");
URLConnection conn = url.openConnection();
al.add(conn);
System.out.println("Result of removing = " + al.remove(conn));
} catch (Exception ex) {
ex.printStackTrace(System.err);
}
}
}
Jeśli adres URL wskazuje na "http://www.example.com", a następnie "Wynik usuwania = true".
Ale jeśli URL wskazuje na "https://www.example.com", to "Wynik usunięcia = fałsz".
Nie rozumiem takiego zachowania. Mam pewne założenia, ale nie jestem pewien ...
Czy ktoś może pomóc?
Tak, to jest naprawdę przypadek dziwnego zachowania _equals _... Wysłałem takie wyjaśnienie, ponieważ jest naprawdę szalone ... Dzięki! BTW, czy nie znasz innych przykładów klas o takim _równomiernym zachowaniu? –
Nie, w istocie też tego nie znałem. Jedyny przypadek wadliwej implementacji * równa się *, którą teraz mogę sobie przypomnieć, to java.net.URL (w tym przypadku wada dotyczy spójności: relacja równości zależy od rozdzielczości DNS, dlatego dwie instancje URL mogą lub nie być równy w zależności od rozwiązanego adresu IP, ale to już inna historia). – Javier
Teraz wszystko jest jasne. Dzięki! –