code: public Set<String> queryParameterNames() {
          if (queryNamesAndValues == null) return Collections.emptySet();
          Set<String> result = new LinkedHashSet<>();
          for (int i = 0, size = queryNamesAndValues.size(); i < size; i += 2) {
              result.add(queryNamesAndValues.get(i));
          }
          return Collections.unmodifiableSet(result);
      }
docs: Returns the distinct query parameter names in this URL, like {@code ["a", "b"]} for {@code
  http://host/?a=apple&b=banana}. If this URL has no query this returns the empty set.
  
  <p><table summary="">
  <tr><th>URL</th><th>{@code queryParameterNames()}</th></tr>
  <tr><td>{@code http://host/}</td><td>{@code []}</td></tr>
  <tr><td>{@code http://host/?}</td><td>{@code [""]}</td></tr>
  <tr><td>{@code http://host/?a=apple&k=key+lime}</td><td>{@code ["a", "k"]}</td></tr>
  <tr><td>{@code http://host/?a=apple&a=apricot}</td><td>{@code ["a"]}</td></tr>
  <tr><td>{@code http://host/?a=apple&b}</td><td>{@code ["a", "b"]}</td></tr>
  </table>