`
zhangxiang390
  • 浏览: 216662 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Map中键为自定义类型时注意的问题

阅读更多

Map的get()源码如下:

public V get(Object key) {

        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode()); //返回key对应的hash值
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) { // 调用equals()逐个比较key集合中有无与形参相同的键值
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
}

当Map的key是自定义的对象类型时,要在自定义类中,重载Object类的两个方法,hashCode()和equals(),使得满足自己定义的“相同”的含义,这样才能用“相同”的key取到合适的value。

例子:

 

public class Point {
	private int x;
	private int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public String toString(){
		return "["+x+" , "+y+"]";

	}
	public static void main(String[] args){
               Map<Point,Integer> m=new Map<Point,Integer>();
               m.put(new Point(1,2),3);
               System.out.println(m.get(new Point(1,2));// result: null
	}
}

  以上代码的不足之处是没有重载hashCode和equals方法,纠正如下:

public class Point {
	private int x;
	private int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public String toString(){
		return "["+x+" , "+y+"]";

	}
	public boolean equals(Object o){
		System.out.println(">> in Point.equals()");
		if(((Point)o).getX()==x && ((Point)o).getY()==y)
			return true;
		return false;
	}
	public int hashCode(){
		System.out.println(">> in Point.hashCode()");
		return x*10+y;
	}
	public static void main(String[] args){
               Map<Point,Integer> m=new Map<Point,Integer>();
               m.put(new Point(1,2),3);
               System.out.println(m.get(new Point(1,2));// result: 3
	}
}
 
分享到:
评论

相关推荐

    STL中map用法详解 STL中map用法详解 STL中map用法详解

    map支持下标操作,但需要注意的是,如果键不存在,会自动插入一个新元素: ```cpp Value& value = myMap[key]; ``` 9. **比较操作** map支持比较操作,例如`==`和`!=`用于比较两个map的键值对是否完全相同或不...

    SpringBoot+Mybatis,返回Map的时候,将Map内的Key转换为驼峰的命名

    总的来说,处理Map中Key的驼峰命名转换是Java开发中的常见需求,通过自定义工具类或利用现有的库,我们可以轻松地解决这个问题,提高代码质量。在实际项目中,还应注意处理异常情况,确保在Key不存在或者格式不正确...

    STL中map用法详解

    - 当使用自定义类型作为键时,需要确保类型重载了比较运算符,以供红黑树内部使用。 通过理解这些基本概念和操作,你可以有效地在C++项目中利用`map`容器来管理和操作数据。结合模板知识,`map`能帮助你构建更高效...

    linux hash_map

    但当键为自定义类型时,需要提供自己的哈希函数。例如,对于`std::string`,我们可以创建一个名为`str_hash`的结构体,重载`()`运算符来计算哈希值。 4. **自定义键的相等比较**:`_EqualKey`参数允许自定义键的...

    JS实现的自定义map方法示例

    在JavaScript中,`Map`对象是一种内置的数据结构,用于存储键值对,其中键可以是任何类型,而不仅仅是字符串。然而,在某些情况下,我们可能需要自定义一个类似于`Map`的功能,特别是在旧版本的JavaScript中,它不...

    java中将数据库中数据赋值给Map对象源代码

    在Java开发中,特别是在使用Spring框架时,将数据库中的数据转换为Map对象是一种常见的操作。这样做可以简化数据处理,使得数据以键值对的形式存储,便于快速查找和使用。Spring框架提供了强大的数据访问抽象,包括...

    map元素映射,正确使用标准模板库

    - `count`:返回指定键的元素数量,通常在键可能重复的自定义map中使用。 - `lower_bound`:返回大于等于指定键的第一个元素的迭代器。 - `upper_bound`:返回大于指定键的第一个元素的迭代器。 三、map的操作与...

    jsMap转换为JSON 字符串.docx

    值得注意的是,Map对象中的键在转换为JSON时必须是可以序列化的,这意味着它们必须是字符串或者能被转换为字符串的类型。例如,数字、布尔值、null、字符串、数组和对象等。如果Map的键是不能被序列化的非字符串对象...

    对于java map类排序

    需要注意的是,如果Map的键是自定义对象而非基本类型或字符串,那么需要重写这些对象的`compareTo`方法来实现自定义的排序逻辑。此外,如果希望根据值进行排序,可以创建一个新的`TreeMap`实例,并提供一个自定义的...

    java中map集合的用法.doc

    Java中的Map集合是一种存储键值对的数据结构,它允许通过键来访问对应的值。Map接口在Java的`java.util`包中定义,提供了多种方法来处理键值对。以下是关于Map集合的一些关键知识点: 1. **创建Map实例**: 创建...

    地图的简单使用(Map)

    在编程领域,`Map`是一种数据结构,它存储键值对,允许我们通过键来...在实际项目中,根据需求选择合适类型的Map,例如需要保持插入顺序时可以选择LinkedHashMap,需要排序则选择TreeMap,追求效率则优先考虑HashMap。

    对象转换成JSON和Map

    - **序列化与反序列化**:对象转换为JSON或Map时,需要考虑哪些字段需要包含,哪些应该忽略,以及如何处理复杂类型如日期和自定义类型。 - **性能**:大量数据转换时,要考虑效率,选择合适的库和方法进行优化。 ...

    Map(STL).rar_C++ map_c++ map_map stl_map容器

    2. **自动排序**:`map`会根据键的值自动进行排序,通常默认使用键类型的`运算符来决定顺序。 3. **迭代器支持**:`map`提供迭代器,允许我们遍历容器中的所有元素。 4. **红黑树实现**:在C++标准库中,`map`通常是...

    Java Map 集合类简介

    从概念上讲,可以将List视为键为数值的特殊Map,但实际上两者之间没有直接的关系。Map在Java中有多重实现,每种实现都有其特定的特性和适用场景。本文将探讨Map接口及其主要实现,并讨论如何根据应用需求选择合适的...

    map构造和赋值map构造和赋值

    这将创建一个空的`map`,键类型为`std::string`,值类型为`int`。 #### 2. 初始化列表构造 ```cpp std::map, int&gt; myMap = {{"apple", 1}, {"banana", 2}, {"cherry", 3}}; ``` 这将创建一个包含了三个键值对的`map...

    Map、Set、Iterator迭代详解

    - **clear()**: 移除`Map`中的所有键值对,使其为空。 除了上述方法之外,`Map`接口还定义了以下常用方法: - **putAll(Map t)**: 将指定`Map`中的所有映射复制到当前`Map`中。如果存在相同的键,则覆盖原来的值。 ...

    STL中map用法详解.rar

    `map`在C++中被定义为模板类`std::map`,它可以存储键值对,其中键通常是唯一的。键和对应的值可以是任何类型,只要它们满足特定的比较要求。`map`内部通常使用红黑树实现,保证了插入、查找和删除操作的时间复杂度...

    如何用Map对象创建Set对象Java开发Java经验技巧

    4. **自定义Set的创建:** 如果你希望创建的Set具有特定的特性,例如排序或线程安全性,可以在创建Map时选择相应的实现。例如,使用`TreeMap`得到一个有序的键集,使用`ConcurrentHashMap`得到线程安全的键集。 ...

    Map和Bean灵活转换工具类

    `MapUtils`类通常用于将Map对象转换为Java Bean对象,这在我们需要将存储在Map中的键值对数据转化为具有明确属性的对象时非常有用。例如,假设我们有一个用户信息的Map,其中键是属性名(如"name","age"),值是...

Global site tag (gtag.js) - Google Analytics