Java中将HashMap转为URL查询字符串需对每个key和value单独URL编码并拼接,推荐用URIBuilder或手动调用URLEncoder.encode(key/value,"UTF-8").replace("+","%20"),跳过null值,避免空格变+号。

Java 中将 HashMap 转为 URL 查询字符串(QueryString),核心是按 key=value 格式拼接,并对键和值做 URL 编码,再用 & 连接。不能直接拼接,否则中文、空格、特殊符号会出错。
使用 URLEncoder 正确编码每个 key 和 value
必须对每个键和值单独调用 URLEncoder.encode(str, "UTF-8"),避免乱码或非法字符。注意:编码后会把空格转成 +,但标准 QueryString 要求空格为 %20,所以建议替换 + 为 %20(或使用 StandardCharsets.UTF_8 + 手动处理)。
- 不要对整个字符串统一编码,只编码单个 key/value
- 跳过 null 或空字符串的 entry,避免生成
key=或=value - 忽略 value 为 null 的条目(常见需求)
手动拼接(无第三方依赖)
适合轻量场景,逻辑清晰可控:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
<font color="#888">Map<String, String> params = new HashMap<>();<br>params.put("name", "张三");<br>params.put("city", "北京&上海");<br>params.put("page", "1");<br><br>StringBuilder sb = new StringBuilder();<br>for (Map.Entry<String, String> entry : params.entrySet()) {<br> String key = entry.getKey();<br> String value = entry.getValue();<br> if (key == null || value == null) continue;<br> try {<br> String encodedKey = URLEncoder.encode(key, "UTF-8").replace("+", "%20");<br> String encodedValue = URLEncoder.encode(value, "UTF-8").replace("+", "%20");<br> if (sb.length() > 0) sb.append("&");<br> sb.append(encodedKey).append("=").append(encodedValue);<br> } catch (UnsupportedEncodingException e) {<br> throw new RuntimeException(e);<br> }<br>}<br>String queryString = sb.toString(); // name=%E5%BC%A0%E4%B8%89&city=%E5%8C%97%E4%BA%AC%26%E4%B8%8A%E6%B5%B7&page=1</font>
用 Apache HttpClient 的 URIBuilder(推荐)
更健壮,自动处理编码、空值、重复 key 等,需引入 httpclient 依赖(5.0+):
立即学习“Java免费学习笔记(深入)”;
<font color="#888">import org.apache.http.client.utils.URIBuilder;<br><br>Map<String, String> params = Map.of("name", "李四", "tag", "java+web");<br>String queryString = new URIBuilder()<br> .addParameters(params.entrySet().stream()<br> .map(e -> new BasicNameValuePair(e.getKey(), e.getValue()))<br> .collect(Collectors.toList()))<br> .build()<br> .getRawQuery(); // name=%E6%9D%8E%E5%9B%9B&tag=java%2Bweb</font>
注意事项
- 如果 value 是集合(如 List),需自行展开为多个同名参数(如
ids=1&ids=2&ids=3) - GET 请求中总长度有限制(通常 2KB 左右),大数据量慎用 QueryString
- 敏感信息(密码、token)不应放在 QueryString 中,易被日志/代理泄露
- Spring Web 项目中,Controller 方法可直接用
@RequestParam Map<String,String>接收,无需手动转

















