双列集合Map的特点

  1 import java.util.HashMap;
  2 import java.util.Map;
  3 /**
  4  * 双列集合Map的特点:
  5  * 如果键是自定义对象,必须重写equals和hashcode方法  
  6  * @author 罗摩衔那
  7  *
  8  */
  9 public class Demo_Maps
 10 {
 11   public static void main(String[] args) 
 12   {     
 13     //自定义一个容器
 14       Map<IdCard,people>map=new HashMap<>();
 15       //初始两个键
 16       IdCard idcard1=new IdCard("张三丰", "001");
 17       IdCard idcard2=new IdCard("张三丰", "001");
 18       //对应键值
 19       map.put(idcard1, new people("张三丰", "男", "200"));
 20       map.put(idcard2, new people("张三丰", "男", "100"));
 21       System.out.println(map);
 22   }
 23 }
 24 
 25 class people
 26 {
 27     private String name;
 28     private String gender;
 29     private String age;
 30     
 31     public people(String name,String gender,String age)
 32     {
 33         this.name=name;
 34         this.gender=gender;
 35         this.age=age;
 36     }
 37 
 38     @Override
 39     public String toString() {
 40         return "name=" + name + ", gender=" + gender + ", age=" + age ;
 41     }
 42 
 43     @Override
 44     public int hashCode() {
 45         final int prime = 31;
 46         int result = 1;
 47         result = prime * result + ((age == null) ? 0 : age.hashCode());
 48         result = prime * result + ((gender == null) ? 0 : gender.hashCode());
 49         result = prime * result + ((name == null) ? 0 : name.hashCode());
 50         return result;
 51     }
 52 
 53     @Override
 54     public boolean equals(Object obj) {
 55         if (this == obj)
 56             return true;
 57         if (obj == null)
 58             return false;
 59         if (getClass() != obj.getClass())
 60             return false;
 61         people other = (people) obj;
 62         if (age == null) {
 63             if (other.age != null)
 64                 return false;
 65         } else if (!age.equals(other.age))
 66             return false;
 67         if (gender == null) {
 68             if (other.gender != null)
 69                 return false;
 70         } else if (!gender.equals(other.gender))
 71             return false;
 72         if (name == null) {
 73             if (other.name != null)
 74                 return false;
 75         } else if (!name.equals(other.name))
 76             return false;
 77         return true;
 78     }    
 79     
 80 }
 81 
 82 class IdCard
 83 {
 84     private String name;
 85     private String ID;
 86     public  IdCard(String name,String ID)
 87     {
 88         this.name=name;
 89         this.ID=ID;        
 90     }
 91     @Override
 92     public String toString() {
 93         return "name=" + name + ", ID=" + ID ;
 94     }
 95     @Override
 96     public int hashCode() {
 97         final int prime = 31;
 98         int result = 1;
 99         result = prime * result + ((ID == null) ? 0 : ID.hashCode());
100         result = prime * result + ((name == null) ? 0 : name.hashCode());
101         return result;
102     }
103     @Override
104     public boolean equals(Object obj) {
105         if (this == obj)
106             return true;
107         if (obj == null)
108             return false;
109         if (getClass() != obj.getClass())
110             return false;
111         IdCard other = (IdCard) obj;
112         if (ID == null) {
113             if (other.ID != null)
114                 return false;
115         } else if (!ID.equals(other.ID))
116             return false;
117         if (name == null) {
118             if (other.name != null)
119                 return false;
120         } else if (!name.equals(other.name))
121             return false;
122         return true;
123     }
124 }

 1 import java.util.HashMap;
 2 import java.util.Map;
 3 /**
 4  * 双列集合Map的特点:
 5  *  键值对只能是意义对应
 6  *     添加键值对的时候出现了键重复,新的值会把对应的之前的值覆盖
 7  *   
 8  * @author 罗摩衔那
 9  *
10  */
11 public class Demo_Maps
12 {
13   public static void main(String[] args) 
14   {
15      Map<String,String>map=new HashMap<>();
16      map.put("001", "刘亦菲");
17      map.put("002", "迪丽热巴");
18      System.out.println(map);
19      map.put("001", "赵灵儿");
20      System.out.println(map);
21   }
22 }

 

转载于:https://www.cnblogs.com/zjm1999/p/10043119.html

### 关于双列集合的数据结构、使用方法及其实现原理 #### 数据结构概述 双列集合是一种基于键值对(key-value pair)存储数据的集合类型。它在 Java 中主要由 `Map` 接口及其具体实现类构成,例如 `HashMap`、`TreeMap` 和 `LinkedHashMap` 等[^1]。这些实现类提供了不同的功能和性能特点。 - **键值对存储**:双列集合的核心特点是通过键来定位其对应的值。每个键只能映射到一个值,而多个键可以共享同一个值[^2]。 - **无序性与有序性**:大多数双列集合(如 `HashMap`)不保证元素的迭代顺序。然而,某些实现类(如 `TreeMap` 和 `LinkedHashMap`)则提供特定的排序或插入顺序保障[^3]。 --- #### 使用方法详解 以下是双列集合的主要操作方式: 1. **创建实例** 创建一个双列集合可以通过指定具体的实现类完成。例如: ```java Map<String, Integer> map = new HashMap<>(); ``` 2. **添加键值对** 使用 `put()` 方法将键值对插入集合中。如果键已存在,则会覆盖原有的值。 ```java map.put("Alice", 25); map.put("Bob", 30); ``` 3. **获取值** 利用 `get()` 方法通过键检索对应的值。如果键不存在,则返回 `null`。 ```java int ageOfAlice = map.get("Alice"); // 返回 25 ``` 4. **删除键值对** 调用 `remove()` 方法移除指定键的条目。 ```java map.remove("Bob"); ``` 5. **判断是否存在某个键或值** - 检查键的存在性:`containsKey()` - 检查值的存在性:`containsValue()` ```java boolean hasAlice = map.containsKey("Alice"); // true boolean hasAge30 = map.containsValue(30); // false ``` 6. **遍历集合** 遍历双列集合有多种方式,常见的包括: - 遍历键集 (`keySet`): ```java for (String key : map.keySet()) { System.out.println(key + ": " + map.get(key)); } ``` - 遍历条目集 (`entrySet`): ```java for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } ``` 7. **清空集合** 使用 `clear()` 方法清除所有键值对。 ```java map.clear(); ``` --- #### 实现原理分析 1. **哈希表机制(以 `HashMap` 为例)** - `HashMap` 基于哈希表实现,内部维护了一个数组用于存储桶(bucket),每个桶可能是一个链表或红黑树[^4]。 - 当调用 `put()` 插入键值对时,计算键的哈希码并将其映射到相应的桶位置。如果发生冲突(两个键具有相同的哈希码),则通过链地址法解决冲突。 - 如果链表长度超过阈值(默认为8),该链表会被转换为红黑树以提高查询效率。 2. **平衡二叉树(以 `TreeMap` 为例)** - `TreeMap` 基于红黑树实现,能够保持按键的自然顺序或自定义比较器规定的顺序排列。 - 所有的插入、删除和查找操作的时间复杂度均为 O(log n),因为每次调整都会重新平衡树结构。 3. **链接列表(以 `LinkedHashMap` 为例)** - `LinkedHashMap` 继承自 `HashMap` 并额外维护了一条双向链表,记录了键值对的插入顺序。 - 这种设计使其既具备高效访问能力又保留了迭代顺序。 --- #### 总结 双列集合Java 编程中非常重要的工具之一,适用于需要快速按键查找值的场景。理解其基本特性和底层实现有助于开发者更合理地选择合适的实现类,并优化程序性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值