Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在从ArrayList中删除URLConnection对象<;URLConnection>;_Java_Arraylist_Urlconnection - Fatal编程技术网

Java 正在从ArrayList中删除URLConnection对象<;URLConnection>;

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

在我的程序中,我需要跟踪到某个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);
        }
    }
}
封装测试;
导入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地址,但情况不同)。