gpt4 book ai didi

java - 从 ArrayList 中移除 URLConnection 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:42 25 4
gpt4 key购买 nike

在我的程序中,我需要跟踪已打开的与某些 HTTP 服务器的连接列表 - 以便在需要时立即断开连接。

我遇到了以下问题。如果我连接到 HTTP 服务器,一切正常,但如果连接到 HTTPS,则连接不会从列表中删除。它会导致内存泄漏。

例子:

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);
}
}
}

如果 URL 指向“http://www.example.com”,则“删除结果 = 真”。

但如果 URL 指向“https://www.example.com”,则“删除结果 = false”。

我不理解这样的行为。我有一些假设,但不确定...

有人可以帮忙吗?

最佳答案

简而言之(至少,对于 HotSpot JVM 23.7-b01)我们有 conn.equals(conn)==false 当 URL scheme 是 HTTPS 时。

remove(Object o) 操作是 defined删除元素 e 使得 (o==null ? e==null : o.equals(e)) (即删除是根据 定义的等于)。人们可能期望 remove(conn) 成功,因为元素刚刚被插入,但由于 conn.equals(conn)false,集合实现理解元素不包含。

这是一个奇怪的情况,其中 equals 不是自反的。来自 the openjdk implementation原因很明显:HttpsURLConnectionImplequals 的实现委托(delegate)给一个内部对象,该对象不等于 给包装器。

public class HttpsURLConnectionImpl {
protected DelegateHttpsURLConnection delegate;
public boolean equals(Object obj) {
return delegate.equals(obj);
}
}

关于java - 从 ArrayList<URLConnection> 中移除 URLConnection 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15082474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com