Java 正在从ArrayList中删除URLConnection对象<;URLConnection>;
在我的程序中,我需要跟踪到某个HTTP服务器的已打开连接列表,以便在需要时立即断开连接 我面临以下问题。如果我连接到HTTP服务器,一切正常,但如果连接到HTTPS,则不会从列表中删除连接。它会导致内存泄漏 例如:Java 正在从ArrayList中删除URLConnection对象<;URLConnection>;,java,arraylist,urlconnection,Java,Arraylist,Urlconnection,在我的程序中,我需要跟踪到某个HTTP服务器的已打开连接列表,以便在需要时立即断开连接 我面临以下问题。如果我连接到HTTP服务器,一切正常,但如果连接到HTTPS,则不会从列表中删除连接。它会导致内存泄漏 例如: package test; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; public class Main { public static void ma
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);
}
}
}
封装测试;
导入java.net.URL;
导入java.net.URLConnection;
导入java.util.ArrayList;
公共班机{
公共静态void main(字符串[]args){
试一试{
ArrayList al=新的ArrayList();
URL=新URL(“http://www.example.com");
URLConnection conn=url.openConnection();
艾加(康涅狄格州);
System.out.println(“移除的结果=“+al.remove(conn));
}捕获(例外情况除外){
例如printStackTrace(System.err);
}
}
}
如果URL指向“”,则“删除结果=真”
但如果URL指向“”,则“删除的结果=false”
我不理解这种行为。我有一些假设,但不确定
有人能帮忙吗?简而言之(至少在HotSpot JVM 23.7-b01中),当URL方案为HTTPS时,我们有conn.equals(conn)==false
操作remove(Object o)
就像移除一个元素e,使得(o==null?e==null:o.equals(e))
(即remove是根据equals定义的)。可以预期remove(conn)会成功,因为元素刚刚被插入,但是由于conn.equals(conn)
是false
,集合实现理解该元素未被包含
这是一个奇怪的情况,equals不是反身的。原因很清楚:HttpsURLConnectionImpl
将equals的实现委托给内部对象,而内部对象不等于包装器
public class HttpsURLConnectionImpl {
protected DelegateHttpsURLConnection delegate;
public boolean equals(Object obj) {
return delegate.equals(obj);
}
}
所以,这确实是平等者奇怪行为的例子。。。我送走了这样的解释,因为它真的很疯狂。。。谢谢顺便说一句,你不知道还有其他类具有这种equals行为的例子吗?不,事实上我也不知道这一个。我现在能回忆起的唯一一个equals实现有缺陷的例子是java.net.URL(在这种情况下,缺陷是关于一致性的:equality关系取决于DNS解析,因此两个URL实例可能相等,也可能不相等,这取决于解析的IP地址,但情况不同)。