首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ArrayList<URLConnection>中删除URLConnection对象

从ArrayList<URLConnection>中删除URLConnection对象
EN

Stack Overflow用户
提问于 2013-02-26 14:06:30
回答 1查看 151关注 0票数 7

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

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

示例:

代码语言:javascript
复制
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“,则”删除结果= true“。

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

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

有人能帮上忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-26 14:15:30

简而言之(至少,对于HTTPSJVM23.7-B01),当HotSpot方案是HTTPS时,我们有conn.equals(conn)==false

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

这是一个奇怪的例子,因为equals不是自反的。从the openjdk implementation中,原因很清楚:HttpsURLConnectionImpl将equals的实现委托给一个内部对象,该对象不等于包装器的。

代码语言:javascript
复制
public class HttpsURLConnectionImpl {
   protected DelegateHttpsURLConnection delegate;
   public boolean equals(Object obj) {
    return delegate.equals(obj);
   }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15082474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档