Map接口

本文深入解析Java中的HashMap和TreeMap,详细阐述了这两种Map实现的使用场景、特点及区别,包括查询操作、排序能力及对键类hashCode实现的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


“集合框架”提供两种常规的Map实现:HashMapTreeMap。和所有的具体实现一样,使用哪种实现取决于特定需要

在Map中插入、删除和定位元素,HashMap是最好的选择。但如果要按顺序遍历键,那么TreeMap会更好。

使用HashMap要求添加的键类明确定义了hashCode()实现(助理解:Map.keySet返回的是键的Set集合,而Set集合对hashCode实现有限制,因此作为键的类也要遵守该限制)。有了TreeMap实现,添加到映射的元素一定是可排序的



一、HashMap

package cn.hncu.map;


import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;




public class MapDemo {


public static void main(String[] args) {
HashMap map=new HashMap();
map.put("1001", "张军");
map.put("1002", "张三");
map.put("1003", "王铰");
map.put("1004", "李元");
//查询1----key视图
Set keys = map.keySet();
Iterator it = keys.iterator();//是集合的查询组件
while(it.hasNext()){
String str = map.get( it.next() ).toString();
System.out.println(str);
}

   System.out.println("----------------");
//查询2----entrSet视图
   Set entry=map.entrySet();
   it = entry.iterator();//是集合的查询组件
while(it.hasNext()){
Entry e=(Entry) it.next();
System.out.println(e.getKey()+" "+e.getValue());
System.out.println(e);
}
System.out.println("----------------");
//查询2----values视图
Collection c=map.values();
it = c.iterator();//是集合的查询组件
while(it.hasNext()){
System.out.println(it.next());
}
}

}



二、TreeMap


package cn.hncu.sort;


import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;


public class TreeMapDemo {
public static void main(String[] args) {
TreeMap map=new TreeMap();//有排序
//HashMap map=new HashMap();没有排序
map.put("1002", "张军");
map.put("1001", "李元");
map.put("1011", "张三");
map.put("1003", "王铰");
Set set=map.entrySet();
Iterator it=set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}


}

### select map 接口的使用方法及功能 在 MyBatis 中,`select` 标签结合 `Map` 接口是一种常见的参数传递方式。通过这种方式,可以实现多参数查询,尤其适用于动态 SQL 场景。 #### 1. 使用 Map 作为参数 MyBatis 允许将 `Map` 作为参数传递给 SQL 映射语句。`Map` 的键用于标识参数名称,值为对应的参数值。以下是一个典型的例子: ```xml <select id="selectStu" resultType="com.wst.pojo.Stu" parameterType="map"> select * from stu where name like concat('%',#{u_name},'%') and age = #{u_age} </select> ``` 上述代码中,`parameterType="map"` 表示传递的是一个 `Map` 对象[^3]。在 Java 代码中,可以通过如下方式调用: ```java Map<String, Object> params = new HashMap<>(); params.put("u_name", "张"); params.put("u_age", 12); List<Stu> students = sqlSession.selectList("selectStu", params); ``` #### 2. 返回结果为 Map 除了作为参数外,`select` 标签也可以返回 `Map` 类型的结果。例如: ```xml <select id="getEmpReturnMap" resultType="map"> select * from employee where id = #{id} </select> ``` 这段代码会将查询结果以 `Map` 的形式返回,其中每一行数据对应一个 `Map`,键为列名,值为列值[^2]。 #### 3. 动态 SQL 和 Map 结合 当需要根据多个条件动态生成 SQL 时,`Map` 是一种灵活的选择。例如: ```xml <select id="dynamicQuery" resultType="com.example.User" parameterType="map"> SELECT * FROM users WHERE 1=1 <if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="age != null"> AND age = #{age} </if> </select> ``` Java 调用代码如下: ```java Map<String, Object> params = new HashMap<>(); params.put("name", "John"); params.put("age", 30); List<User> users = sqlSession.selectList("dynamicQuery", params); ``` #### 4. 与 JSP 的结合 在 Web 开发中,`Map` 可以用于填充下拉框(`<select>`)的内容。例如,在 Controller 中设置 `Map` 并传递到 JSP 页面: ```java request.setAttribute("maps", Constant.maps); ``` 然后在 JSP 页面中使用 JSTL 遍历 `Map` 并生成选项: ```jsp <select name="XXXX"> <option value="">=请选择=</option> <c:forEach items="${maps}" var="map"> <option value="${map.key}" ${object.value eq map.key ? 'selected' : ''}> ${map.value} </option> </c:forEach> </select> ``` 这段代码展示了如何将后端传递的 `Map` 数据渲染为前端的 `<select>` 元素[^1]。 #### 5. 限制和替代方案 尽管 `Map` 提供了灵活性,但它也有一些缺点。由于 `Map` 的键是字符串类型,无法在编译时检查错误,且业务逻辑不够清晰[^4]。因此,对于复杂的 SQL 查询,推荐使用 Java Bean 作为参数类型。例如: ```xml <select id="selectUser" resultType="com.example.User" parameterType="com.example.UserParam"> SELECT * FROM users WHERE name LIKE CONCAT('%', #{name}, '%') AND age = #{age} </select> ``` 对应的 Java Bean 定义如下: ```java public class UserParam { private String name; private Integer age; // Getters and Setters } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值