java集合操作查找表
2017-06-27 21:22
260 查看
2017年6月27日学习总结
Map接口
Map接口定义的集合又称查找表,用于存储"key-value"映射对。key可以看成是value的索引,作为key的对象在集合中
不可以重复。
根据内部数据结构的不同,Map接口有多种实现类,其中常用的有内部为hash表实现的HashMap和内部为排序二叉树实现的TreeMap。
V put(K key, V value)方法:
将key-value对存入Map,如果在集合中已经包含该key,则操作将替换该key所对应的value,返回值为该key原来所对应的value(如果没有则返回null)。
V get(Object key)方法:
返回参数key所对应的value对象,如果不存在则返回null。
boolean containsKey(Object key)方法:
若Map中包含给定的key则返回true,否则返回false。
HashMap
hashCode的常规协定是
在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用
hashCode方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括get 和
put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。
如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。
Set<K> keySer()方法:
将当前Map中所有的key存入一个Set集合后返回。
Set<Entry<K,V>> entrySet()方法:
将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合后返回。
Collection<V> values()方法:
将当前Map中所有的value存入一个Collection集合后返回。
有序的Map
LinkedHashMap实现有序Map
使用Map接口的哈希表和链表实现,具体可预知的迭代顺序。此实现与HashMap的不同之处在于:
LinkedHashMap维护着一个双向循环链表。此链表定义了迭代顺序,该迭代顺序通常就是存放元素的顺序。
案例:
package june;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* 测试查找表的类
* @author overfront
*
*/
public class MapTest {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("小牛", 5000);
map.put("中牛", 10000);
map.put("大牛", 20000);
Integer salary = map.get("大牛");
System.out.println("大牛的薪资是:"+salary);
boolean whether = map.containsKey("攻城狮");
System.out.println("有攻城狮吗:"+whether);
Set<Entry<String,Integer>> setEntry = map.entrySet();
for(Entry<String,Integer> e : setEntry){
String name = e.getKey();
Integer wages =e.getValue();
System.out.println(name+"月工资是"+wages);
}
}
}
控制台输出结果:
大牛的薪资是:20000
有攻城狮吗:false
小牛月工资是5000
中牛月工资是10000
大牛月工资是20000
相关文章推荐
- java io 操作集合
- JAVA文件操作集合
- 黑马程序员——java集合元素排序存储操作
- java 集合的常用操作(排序、查找、打乱顺序)
- java 集合操作
- java io 操作集合
- android基础篇------------java基础(9)(集合的操作)
- Java集合工具类(二)-泛型集合工具类,用于便捷快速的定义、操作集合。包含Set的交集、并集...
- Java集合工具类(一)-泛型集合工具类,用于便捷快速的定义、操作集合。包含Set的交集、并集...
- JAVA之ArrayList迭代时对集合进行增改操作
- Java26日通—第 3 天 表管理与集合操作
- Java中对集合的并,交,联集,差操作
- java IO操作 (读写、追加、删除、移动、复制) 源码集合
- Java集合工具类(三)-泛型集合工具类,用于便捷快速的定义、操作集合。包含Set的交集、并集...
- java 基本集合操作
- 操作图像的Java类库集合
- java集合的交并差补操作
- java对集合和迭代的操作基础总结
- 好用java库(二) : lambdaj (集合操作)
- JAVA集合操作的利器:CollectionUtils