Java-集合篇Map

1.Map 接口

    实现Map接口的集合类是通过"键-值"映射的方式来存储对象的。

   "键-值"映射对是通过键来唯一标识,Map底层的"键"是用Set存放的(这就保证了它的唯一性,不重复)。

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

   JDK API中Map接口的实现类常用的有:1,HashMap 2, TreeMap 3,HashTable(不常用)

   注意:键和值都可以为null,但是键不能够重复,值可以重复

2.Map接口中常用的方法

   Object  put (Object key, Object value) ; //将指定的“键—值”对存入Map中

   注意:由于key的唯一性,如果再放入相同的key的键值对,则该键值对会覆盖原来的

   Object  get (Object key); //通过key(键)取出所映射的值

   Object  remove(Object key); //根据指定的"键"将其“键-值”对从map中删除。

   boolean containsKey(Object key); //判断Map是否包含指定键的“键-值”对

   boolean containsValue(Object value) ;//判断Map是否包含指定值的“键-值”对

   boolean isEmpty(); //判断Map是否包含元素

   int size(); //获取长度

   void clear(); //清空Map中的所有“键-值”对

   Set  keySet() ;//返回Map中所包含键的set集

   Collection values(); //返回Map中所有的values的集合。

3.HashMap

   HashMap内部对“键”用Set进行散列存放(HashSet),所以根据“键”去取"值"的效率很高

4.TreeMap

   TreeMap内部对"键"用TreeSet的红黑树结构进行排序存放,所以放入TreeMap的"key-value"对的key

   必须是可"排序"的。

5.Map.Entry 接口

  Map.Entry是Map内部定义的一个接口,专门用来存放key-value的内容。

6.Collections工具类(与Collection<E>不同)

   java.util.Collections 类是操作集合的工具类,提供一些静态方法实现基于集合的一些常用算法

   void sort (List list)  ;//List列表的所有元素必须都实现comparable接口,根据元素的自然顺序按升序排列

   void shuffle (List list) ;//对List列表里的元素()随机排列。

   void reverse(List list) ;//对List列表里的元素反转。

   void copy(List dest ,List src);//src复制到dest中

   void swap(List<?> list,int i,int j) ;//交换列表指定位置的元素

   int   binarySearch(List <? extends T> list,T key); //寻找列表中某元素的位置,前提是已排序

   元素 max(Collection<? extends ?> coll) ;//根据元素的自然顺序,返回给定collection中的最大元素

   List  synchronizedList(List List) ;//返回指定列表支持的同步列表

   注意:Collections:对集合进行操作的工具类,里面都是静态方法.
            Arrays:对数组进行操作的工具类,里面都是静态方法.

7.HashTable

   旧版的HashTable ,操作大多跟HashMap相同。但是它保证线程的同步。

   它有一个子类Properties(属性集)比较常用:

  • Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性集中每个键及其对应值都是一个字符串。
  • 不建议使用put 和putAll 这类存放元素方法,应该使用setProperty(Stringkey, Stringvalue)方法,
  • 因为存放的“键-值”对都是字符串。类似取值也应该使用getProperty(Stringkey)
  • 不支持泛型操作
//Properties示例,根目录下要存在config.properties文件
import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class PropertiesTest { public static void main(String[] args) { //方法链 InputStream is = Thread.currentThread() .getContextClassLoader() .getResourceAsStream("config.properties"); Properties prop = new Properties(); try { prop.load(is); } catch (IOException e) {e.printStackTrace();} String name = prop.getProperty("name"); String pwd = prop.getProperty("pwd"); System.out.println(name + ", " + pwd); } }

8.Map接口输出

  对于Map接口来说,其本身是不能直接使用迭代进行输出的,因为Map中的每一个位置存放的是一对值(keyvalue),

  而Iterator中每次只能找到一个值。所以如果非要使用迭代进行输出的话,要按照以下操作步骤完成:

  1. 将Map的实例通过entrySet()方法变为Set接口对象
  2. 通过Set接口实例为Iterator实例化
  3. 通过Iterator迭代输出,每个内容都是Map.Entry的对象
  4. 通过Map.Entry进行keyvalue的分离。getKey,getValue
        Map<Integer,String> map = new HashMap<Integer,String>();
        //添加元素
        map.put(1, "bbb");
        map.put(2, "aaa");
        map.put(2, "eee");//如果键相同,则后面的元素会覆盖前面的元素.
        //键和值都可以为null,但是键不能够重复.值可以重复.
        //遍历Map 
        //1:先获得Map的key集合,再根据键获得值
        Set<Integer> set = map.keySet();
        //用增强for循环
        for(Integer i:set){
            System.out.println(i+":"+map.get(i));
        }
        //用Iterator进行遍历
        //2:获取Map的value集合.但是这个不能获取键.
        //3:用键值关系获取Map  ,键值关系保存在set集合里.
        //Map.Entry是描述Map集合的映射关系.
        Set<Map.Entry<Integer, String>> set2 =  map.entrySet();
        for(Map.Entry<Integer, String> m:set2){
            System.out.println("key:"+m.getKey()+"--value:"+m.getValue());
        }
        

Map大多时候用于查找,输出属于少数操作。

总结:

选择标准:
 存放要求
 无序-Set
 有序-List
 “key-value”对-Map
 读和改的效率
 Hash*-两者都最高
 Array*-读快改慢
 Linked*-读慢改快

 

posted @ 2015-01-06 11:30  beyondbycyx  阅读(189)  评论(0编辑  收藏  举报