标签:总结 Map System value 学习 println key 集合 out
集合学习总结(2)
1.2.9 LinkedHashSet
- LinkedHashSet是HashSet的子类
- LinkedHashSet的底层是一个LinkedHashMap,底层维护了一个数组加双向链表
- LinkedHashSet根据元素的hashcode的值来决定元素的存储位置,同时使用链表来维护元素的次序,这是的元素看起来是以插入顺序保存的
- LinkedHashSet不允许添加重复元素
1.2.10 Map接口和常用方法
Map接口实现类的特点
- Map与Collection并列存在,用于保存具有映射关系的数据:Key - Value
- Map中的key和value可以是任意类型的数据,会封装到HashMap$Node对象中
- Map中的key不允许重复
- Map中的value可以重复
- Map中的key可以为null,value也可以为null,注意key为null,只能有一个,value为null,可以多个
- 常用String 类可以作为Map中的KEY;
- key和value之前存在一对一的关系,即通过指定的key总能找到对应的value
常用方法
- map.put加入一个k-v对
- map.remove 根据键删除映射关系
- get 根据键获取值
- size 元素的个数
- clear 清除K-V
- coutainsKey: 查找键是否存在
- keyset 获取所有的键
- entrySet 获取所有关系k-v
- values 获取所有的值
1.2.11 Map.Entry 详解
- Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键/值对。通过这个集合的迭代器,获得每一个条目(唯一获取方式)的键或值并对值进行更改。
Map.Entry 的作用
- Map.Entry是为了更方便的输出map键值对。一般情况下,要输出Map中的key 和 value 是先得到key的集合keySet(),然后再迭代(循环)由每个key得到每个value。values()方法是获取集合中的所有值,不包含键,没有对应关系。而Entry可以一次性获得这两个值。
以此引申出Map遍历的方法
Set keyset = map.keySet();
//(1) 增强 for
System.out.println("-----第一种方式-------");
for (Object key : keyset) {
System.out.println(key + "-" + map.get(key));
}
//(2) 迭代器
System.out.println("----第二种方式--------");
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
//第二组: 把所有的 values 取出
Collection values = map.values();
//这里可以使用所有的 Collections 使用的遍历方法
//(1) 增强 for
System.out.println("---取出所有的 value 增强 for----");
for (Object value : values) {
System.out.println(value);
}
//(2) 迭代器
System.out.println("---取出所有的 value 迭代器----");
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
Object value = iterator2.next();
System.out.println(value);
}
//第三组: 通过 EntrySet 来获取 k-v
Set entrySet = map.entrySet();// EntrySet<Map.Entry<K,V>>
//(1) 增强 for
System.out.println("----使用 EntrySet 的 for 增强(第 3 种)----");
for (Object entry : entrySet) {
//将 entry 转成 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
//(2) 迭代器
System.out.println("----使用 EntrySet 的 迭代器(第 4 种)----");
Iterator iterator3 = entrySet.iterator();
while (iterator3.hasNext()) {
Object entry = iterator3.next();
//向下转型 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
1.2.12 HashMap
- Map接口的常用实现类:HashMap、Hashtable和Properties。
- HashMap是Map接口使用频率最高的实现类。
- HashMap是以key-val对的方式来存储数据(HashMap$Node类型)
- key不能重复,但是值可以重复,允许使用null键和null值
- 如果添加相同的key,则会覆盖原来的key-val ,等同于修改.(key不会替换,val会替换)
- 与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的. (jdk8的hashMap底层数组+链表+红黑树)
- HashMap没有实现同步,因此是线程不安全的,方法没有做同步互斥的操作,没有synchronized
具体的HashMap底层在其他地方单独进行总结,和HashSet一样,因HashSet底层就是HashMap
1.2.13 HashTable
- 存放的元素是键值对:即K-V
- hashtable的键和值都不能为null, 否则会抛出NullPointerException
- hashTable使用方法基本上和HashMap一样
- hashTable是线程安全的(synchronized), hashMap是线程不安全的
二者对比
线程安全(同步) | 效率 | 允许null键null值 | |
---|---|---|---|
HashMap | 不安全 | 高 | 可以 |
HashTable | 安全 | 较低 | 不可以 |
标签:总结,Map,System,value,学习,println,key,集合,out 来源: https://www.cnblogs.com/qzguo/p/16552668.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。