笔记==>map

来源:互联网 发布:分析淘宝网的特点 编辑:程序博客网 时间:2024/06/05 19:57

Map接口

如果程序中存储了几百万个学生,而且经常需要使用学号来搜索某个学生,那么这个需求有效的数据结构就是Map。
Map是一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。

在Map中键(key)可以使任意类型的对象。Map中不能有重复的键(Key),每个键(key)
都有一个对应的值(value)。

一个键(key)和它对应的值构成map集合中的一个元素。

Map中的元素是两个对象,一个对象作为键,一个对象作为值。键不可以重复,但是值可以重复。

双列集合:

-------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的, 键不可重复,值可以重复。 ----------------| HashMap   底层也是基于哈希表实现的。 ----------------| TreeMap    TreeMap也是基于红黑树(二叉树)数据结构实现 的,                                特点:会对元素的键进行排序存储。 ----------------| Hashtable  底层是哈希表数据结构,线程是同步的,效率较低,被HashMap 替代。

Map与Collection的异同:

1.Map与Collection在集合框架中属并列存在。

2.Map存储的是键值对,collection存储的是单个值。

3.Map存储元素使用put方法,Collection使用add方法

4.Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素

5.Map集合中键要保证唯一性

也就是Collection是单列集合, Map 是双列集合。

总结:

Map一次存一对元素, Collection 一次存一个。Map 的键不能重复,保证唯一。

Map 一次存入一对元素,是以键值对的形式存在.键与值存在映射关系.一定要保证键的唯一性.

Map接口的常用方法:
添加:

1、V put(K key, V value)    /*(可以相同的key值,但是添加的value值会覆盖前面的,返回值是前一个,                             如果没有就返回null)*/                                          2、putAll(Map<? extends K,? extends V> m) // 从指定映射中将所有映射关系复制到此映射中(可选操作)。

删除

1、remove()    //根据键删除一条map中的数据,返回的是该键对应 的值。   2、clear()     //清空集合中的所有数据。

获取

 1value get(key); //根据指定的键获取对应的值;可以用于判断键是否存在的情况。                     //当指定的键不存在的时候,返回的是null。

判断:

1boolean isEmpty()   //长度为0返回true否则false2boolean containsKey(Object key)  //判断集合中是否包含指定的key3boolean containsValue(Object value)  //判断集合中是否包含指定的value

长度:

Int size()  // 获取map集合键值对个数

遍历Map的方式:

1//将map 集合中所有的键取出存入set集合。    Set<K> keySet()   //返回所有的key对象的Set集合,   再通过get方法获取键对应的值。2、 values() ,//获取所有的值.    Collection<V> //values()不能获取到key对象3Map.Entry对象  推荐使用    Set<Map.Entry<k,v>> entrySet()  //将map 集合中的键值映射关系打包成一个对象,                                    // Map.Entry对象通过Map.Entry 对象的getKey,getValue获取其键和值。

map集合遍历方式一: 使用keySet方法进行遍历

缺点:keySet方法只是返回了所有的键,没有值。

       //keySet()把Map集合中的所有键都保存到一个Set类型的集合对象中返回。        Set<String>  keys = map.keySet();        Iterator<String>  it = keys.iterator();        while(it.hasNext()){            String key = it.next();            System.out.println("键:"+ key+"  值:"+ map.get(key));        }

map集合遍历方式二:使用values方法进行遍历

缺点:values方法只能返回所有的值,没有键

//values() 把所有的值存储到一个Collection集合中返回。        Collection<String>  c = map.values();          Iterator<String> its = c.iterator();        while(its.hasNext()){            System.out.println("值: " + its.next());        }

map集合的遍历方式三:使用entry方法遍历。

/*通过Map中的entrySet()方法获取存放Map.Entry<K,V>对象的Set集合。 用面向对象的思想将map集合中的键和值映射关系打包为一个对象,就是Map.Entry, 将该对象存入Set集合, Map.Entry是一个对象,那么该对象具备的getKey,getValue获得键和值。*/        Set<Map.Entry<String, String>>  entrys = map.entrySet();        Iterator<Map.Entry<String, String>>  itss = entrys.iterator();        while(itss.hasNext()){            Map.Entry<String, String>  entry = itss.next();            System.out.println("键: "+ entry.getKey()+ "  值: "+ entry.getValue());        }

Map接口下的实现类—HashMap类

底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。要保证键的唯一性,需要覆盖hashCode方法,
和equals方法。 HashMap的存储原理:
往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素的哈希码值,然后经过运算
就可以算出该元素在哈希表中的存储位置。

情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。

情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,
如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,
不允存储。

Map接口下的实现类—TreeMap类

TreeMap也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储。

TreeMap 要注意的事项:

  1. 往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。

  2. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口, 把键的比较规则定义在CompareTo方法上。

  3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口, 那么就必须在创建TreeMap对象的时候传入比较器。

注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;
注意:Set的元素不可重复,Map的键不可重复,如果存入重复元素如何处理?
Set元素重复元素不能存入add方法返回false

Map的重复健将覆盖旧键,将旧值返回。

Collections类与Arrays类

1.集合框架中的工具类:特点:该工具类中的方法都是静态的。

Collections:常见方法:

1,对list进行二分查找:

//前提该集合一定要有序。int binarySearch(list,key);//必须根据元素自然顺序对列表进行升级排序//要求list 集合中的元素都是Comparable 的子类。int binarySearch(list,key,Comparator);

2,对list集合进行排序。

sort(list); //对list进行排序,其实使用的事list容器中的对象的compareTo方法
sort(list,comaprator);//按照指定比较器进行排序

3,对集合取最大值或者最小值。

max(Collection)max(Collection,comparator)min(Collection)min(Collection,comparator)

4,对list集合进行反转。

reverse(list);

5,可以将不同步的集合变成同步的集合。

Set synchronizedSet(Set<T> s)Map synchronizedMap(Map<K,V> m)List synchronizedList(List<T> list)

2.Arrays:用于对数组操作的工具类

1,二分查找,数组需要有序

binarySearch(int[])binarySearch(double[])

2,数组排序

sort(int[])sort(char[])……

2,将数组变成字符串。

 toString(int[])

3,复制数组。

 copyOf();

4,复制部分数组。

copyOfRange():

5,比较两个数组是否相同。

equals(int[],int[]);

6,将数组变成集合。

List asList(T[]);

这样可以通过集合的操作来操作数组中元素,

但是不可以使用增删方法,add,remove。因为数组长度是固定的,会出现UnsupportOperationExcetion。可以使用的方法:contains,indexOf。。。

如果数组中存入的基本数据类型,那么asList会将数组实体作为集合中的元素。
如果数组中的存入的引用数据类型,那么asList会将数组中的元素作为集合中的元素。