## Why is this an issue?

The `equals` and `hashCode` methods of `java.net.URL` may trigger a name service lookup (typically DNS) to resolve the hostname or IP address. Depending on the configuration, and network status, this lookup can be time-consuming.

On the other hand, the `URI` class does not perform such lookups and is a better choice unless you specifically require the functionality provided by `URL`.

In general, it is better to use the `URI` class until access to the resource is actually needed, at which point you can convert the `URI` to a `URL` using `URI.toURL()`.

This rule checks for uses of `URL` 's in `Map` and `Set` , and for explicit calls to the `equals` and `hashCode` methods. It suggests reconsidering the use of `URL` in such scenarios to avoid potential performance issues related to name service lookups.

## How to fix it

Use the `URI` class until access to the resource is actually needed.

### Code examples

#### Noncompliant code example

    public void checkUrl(URL url) {
      Set<URL> sites = new HashSet<URL>();               // Noncompliant

      URL homepage = new URL("http://sonarsource.com");  // Compliant
      if (homepage.equals(url)) {                        // Noncompliant
        // ...
      }
    }

#### Compliant solution

    public void checkUrl(URL url) {
      Set<URI> sites = new HashSet<URI>();               // Compliant

      URI homepage = new URI("http://sonarsource.com");  // Compliant
      URI uri = url.toURI();
      if (homepage.equals(uri)) {                        // Compliant
        // ...
      }
    }

## Resources

- Oracle Java SE - java.net.URL