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
}
}
分享到:
相关推荐
map支持下标操作,但需要注意的是,如果键不存在,会自动插入一个新元素: ```cpp Value& value = myMap[key]; ``` 9. **比较操作** map支持比较操作,例如`==`和`!=`用于比较两个map的键值对是否完全相同或不...
总的来说,处理Map中Key的驼峰命名转换是Java开发中的常见需求,通过自定义工具类或利用现有的库,我们可以轻松地解决这个问题,提高代码质量。在实际项目中,还应注意处理异常情况,确保在Key不存在或者格式不正确...
- 当使用自定义类型作为键时,需要确保类型重载了比较运算符,以供红黑树内部使用。 通过理解这些基本概念和操作,你可以有效地在C++项目中利用`map`容器来管理和操作数据。结合模板知识,`map`能帮助你构建更高效...
但当键为自定义类型时,需要提供自己的哈希函数。例如,对于`std::string`,我们可以创建一个名为`str_hash`的结构体,重载`()`运算符来计算哈希值。 4. **自定义键的相等比较**:`_EqualKey`参数允许自定义键的...
在JavaScript中,`Map`对象是一种内置的数据结构,用于存储键值对,其中键可以是任何类型,而不仅仅是字符串。然而,在某些情况下,我们可能需要自定义一个类似于`Map`的功能,特别是在旧版本的JavaScript中,它不...
在Java开发中,特别是在使用Spring框架时,将数据库中的数据转换为Map对象是一种常见的操作。这样做可以简化数据处理,使得数据以键值对的形式存储,便于快速查找和使用。Spring框架提供了强大的数据访问抽象,包括...
- `count`:返回指定键的元素数量,通常在键可能重复的自定义map中使用。 - `lower_bound`:返回大于等于指定键的第一个元素的迭代器。 - `upper_bound`:返回大于指定键的第一个元素的迭代器。 三、map的操作与...
值得注意的是,Map对象中的键在转换为JSON时必须是可以序列化的,这意味着它们必须是字符串或者能被转换为字符串的类型。例如,数字、布尔值、null、字符串、数组和对象等。如果Map的键是不能被序列化的非字符串对象...
需要注意的是,如果Map的键是自定义对象而非基本类型或字符串,那么需要重写这些对象的`compareTo`方法来实现自定义的排序逻辑。此外,如果希望根据值进行排序,可以创建一个新的`TreeMap`实例,并提供一个自定义的...
Java中的Map集合是一种存储键值对的数据结构,它允许通过键来访问对应的值。Map接口在Java的`java.util`包中定义,提供了多种方法来处理键值对。以下是关于Map集合的一些关键知识点: 1. **创建Map实例**: 创建...
在编程领域,`Map`是一种数据结构,它存储键值对,允许我们通过键来...在实际项目中,根据需求选择合适类型的Map,例如需要保持插入顺序时可以选择LinkedHashMap,需要排序则选择TreeMap,追求效率则优先考虑HashMap。
- **序列化与反序列化**:对象转换为JSON或Map时,需要考虑哪些字段需要包含,哪些应该忽略,以及如何处理复杂类型如日期和自定义类型。 - **性能**:大量数据转换时,要考虑效率,选择合适的库和方法进行优化。 ...
2. **自动排序**:`map`会根据键的值自动进行排序,通常默认使用键类型的`运算符来决定顺序。 3. **迭代器支持**:`map`提供迭代器,允许我们遍历容器中的所有元素。 4. **红黑树实现**:在C++标准库中,`map`通常是...
从概念上讲,可以将List视为键为数值的特殊Map,但实际上两者之间没有直接的关系。Map在Java中有多重实现,每种实现都有其特定的特性和适用场景。本文将探讨Map接口及其主要实现,并讨论如何根据应用需求选择合适的...
这将创建一个空的`map`,键类型为`std::string`,值类型为`int`。 #### 2. 初始化列表构造 ```cpp std::map, int> myMap = {{"apple", 1}, {"banana", 2}, {"cherry", 3}}; ``` 这将创建一个包含了三个键值对的`map...
- **clear()**: 移除`Map`中的所有键值对,使其为空。 除了上述方法之外,`Map`接口还定义了以下常用方法: - **putAll(Map t)**: 将指定`Map`中的所有映射复制到当前`Map`中。如果存在相同的键,则覆盖原来的值。 ...
`map`在C++中被定义为模板类`std::map`,它可以存储键值对,其中键通常是唯一的。键和对应的值可以是任何类型,只要它们满足特定的比较要求。`map`内部通常使用红黑树实现,保证了插入、查找和删除操作的时间复杂度...
4. **自定义Set的创建:** 如果你希望创建的Set具有特定的特性,例如排序或线程安全性,可以在创建Map时选择相应的实现。例如,使用`TreeMap`得到一个有序的键集,使用`ConcurrentHashMap`得到线程安全的键集。 ...
`MapUtils`类通常用于将Map对象转换为Java Bean对象,这在我们需要将存储在Map中的键值对数据转化为具有明确属性的对象时非常有用。例如,假设我们有一个用户信息的Map,其中键是属性名(如"name","age"),值是...