首页 > 代码库 > java中的Map接口

java中的Map接口

前言

在学习Map接口之前,先来看看散列表的概念;本节主要讲讲Map接口的实现类和集合的工具类。
这里先提一下泛型编程:通常情况下用来限制集合的存储的数据类型。在定义集合时使用<引用类型>来限制集合。其中<>的类型只为引用类型。

正文

散列桶

1.散列桶的概念

散列桶的目的是使用空间换时间,即它是使用索引来提高效率。
散列桶把一组数据通过散列算法,将数据分散开来;存储于连续的内存空间中(数组),将散列值作为数组的下标;如果散列值有重复的,将重复的数据放置在散列桶中。散列桶是线性表。这样就能快速通过散列值(下标)快速查找数据。
注:
1)散列表的容积率达到75%时效率最高;如果超过75%的容积率时,散列表自动扩容到原长度的2倍,重新进行散列。
2)容积率与散列桶无关,它是 (将占用key的空间)/(存储key的空间)

2.应用场景

快速查找数据。尤其是查找大量的数据。

3.原理

元素对长度取余的值,为散列值;该散列值与数组的下标做匹配;将元素存在散列表中。如果当前空间已经被占用,那么就将元素存在于散列桶中。

MAP接口

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 

它的常用实现类有HashMap、Hashtable、Properties和TreeMap。

1.HashMap

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用null 值和null 键。
key只能有一个为空,value可以对个null。
此实现不是同步的。
当集合在迭代的过程中,不允许map自身进行增加。删除操作,只能通过set迭代器完成。
1)API
1))public HashMap()
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。 
2))V put(K key, V value) 
在此映射中关联指定值与指定键。并返回放置在MAP的value的对象。如果key重复,直接将前一次key对应的value值覆盖掉。

3)) V get(Object key) 
          返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。 

4))boolean containsKey(Object key) 
          如果此映射包含对于指定键的映射关系,则返回 true。 

5))boolean containsValue(Object value) 
          如果此映射将一个或多个键映射到指定值,则返回 true。 

6)) boolean isEmpty() 
          如果此映射不包含键-值映射关系,则返回 true 

7)) int size() 
          返回此映射中的键-值映射关系数。 

8)) V remove(Object key) 
          从此映射中移除指定键的映射关系(如果存在)。  在MAP集合中,根据key移去key所对应的value对象,并将value作为返回值。同时释放key的内容;如果key在MMAP中不存在,则返回null。

9)) Set<K> keySet() 
          返回此映射中所包含的键的 Set 视图。 

10)) Collection<V> values() 
          返回此映射所包含的值的 Collection 视图。 

11)) Set<Map.Entry<K,V>> entrySet() 
          返回此映射所包含的映射关系的 Set 视图。 

1))) 获取hashMap的key和value的示例示例:

方式一

<script src="https://code.csdn.net/snippets/314693.js" type="text/javascript"></script>

方式二

先利用 Set<K> keySet()           返回此映射中所包含的键的 Set 视图 ;再通过获取的set视图中的key来获取对应的value。



2.Hashtable


此类实现一个哈希表,该哈希表将键映射到相应的值。此类实现一个哈希表,该哈希表将键映射到相应的值。此类实现一个哈希表,该哈希表将键映射到相应的值。此类实现一个哈希表,该哈希表将键映射到相应的值。此类实现一个哈希表,该哈希表将键映射到相应的值。key不可为空。
Java早期版本引入的,是线程安全的。
1).为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
2).api
1))public Hashtable()
用默认的初始容量 (11) 和加载因子 (0.75) 构造一个新的空哈希表。
 

3.Properties

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

该类可以读取和写入数据到流中。
1)Properties的继承结构

java.lang.Object
  java.util.Dictionary<K,V>
      java.util.Hashtable<Object,Object>
          java.util.Properties

 

 2)此类是线程安全的:多个线程可以共享单个 Properties 对象而无需进行外部同步。

3)构造器

public Properties()

创建一个无默认值的空属性列表。即默认大小为零。

4.API

1))void load(InputStream inStream)
Reads a property list (key and element pairs) from the input byte stream ,即把I/O流的数据加载到当前对象(内存)。

注:

所以的数据只能在内存中操作。

 

2))String getProperty(String key)
Searches for the property with the specified key in this property list。

3))Object setProperty(String key, String value)
Calls the Hashtable method put

4))读取配置文件信息的例子:

<script src="https://code.csdn.net/snippets/319637.js" type="text/javascript"></script>

注:

properties的方法只能改变已读到内存中的信息,不能直接修改文件内容(可以将修改后的数据使用输出流写到文件中);

4.TreeMap

  A Red-Black tree based NavigableMap implementation。

Note that this implementation is not synchronized.

1)API

1))TreeMap()
Constructs a new, empty tree map, using the natural ordering of its keys.

 

小结

1.Collection接口和Map的区别:

Collection接口用来定义使用集合的接口;

而MAP接口用于成对放置对象的集合,key不重复,value可重复。如果key重复,后面的value覆盖前面的value。

 

2.实现类:

hashMap 采用散列表的算法实现

TreeMap 采用红黑树算法实现,利用key进行排序。

3.应用场景:

Map集合适用于查找,而且是一一映射的。

集合的工具类Collections

同数组的工具类Arrays类似,Collections提供了排序、二分查找、乱序和填充等功能。

1.API

1)static <T extends Comparable<? super T>> void sort(List<T> list)
Sorts the specified list into ascending order, according to the natural ordering of its elements.

2)static <T> void sort(List<T> list, Comparator<? super T> c)
Sorts the specified list according to the order induced by the specified comparator.

3)static void swap(List<?> list, int i, int j)
Swaps the elements at the specified positions in the specified list

4)


static <T> List<T> synchronizedList(List<T> list)
Returns a synchronized (thread-safe) list backed by the specified list.

 

static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
Returns a synchronized (thread-safe) map backed by the specified map.

 

static <T> Set<T> synchronizedSet(Set<T> s)
Returns a synchronized (thread-safe) set backed by the specified set.
5)static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
Searches the specified list for the specified object using the binary search algorithm.

 

Comparable 和Comparator比较器

1.compatable的特点

1)实现这个接口的类的实例是可以比较的,可以进行自然排序。

2)int compareTo(T o)
Compares this object with the specified object for order;返回值为正数时,表示大,返回值为负数时表示小,返回零表示相等。

3)Comparable的实现必须与equals方法的结果一致。即comparableTo方法的返回值为零时,equals方法就应该返回true。

2.Comparator比较工具

用于临时定义比较的规则,而不是采用默认的比较规则

1)int compare(T o1, T o2)
Compares its two arguments for order.

2)案例:计算从控制台获取的字符串的字符次数,按次数的降序输出。

<script src="https://code.csdn.net/snippets/322251.js" type="text/javascript"></script>

集合的复制

java默认的复制是浅拷贝。

1)clone()方法

 

 

 

2)使用构造器复制

ArrayList(Collection c);

 

注:

使用的集合都有复制构造器,而且他们是浅复制。

 

 

总结

1.Compable 和Comparator的区别

1)Compable是对象与对象之间的比较。(equals 方法是判断当前对象和另一个对象是否内容一样;compareTo方法是判断当前对象与另一个对象的大小关系)该接口用于实体类中。

2)Comparator是独立存在的比较算法,该算法一般被集合调用。

2.Collection和collections的区别
Collection是接口,Collections是集合的工具类。
 
 
 
 
 

java中的Map接口