Java双例集合下Map接口及其常用实现类

一.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()     清空集合中的所有数据。

获取

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

判断:

1、boolean isEmpty()   长度为0返回true否则false

2、boolean containsKey(Object key)  判断集合中是否包含指定的key

3、boolean containsValue(Object value)  判断集合中是否包含指定的value

长度:

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

遍历Map的方式:

1、将map 集合中所有的键取出存入set集合。
    Set<K> keySet()   返回所有的key对象的Set集合
                         再通过get方法获取键对应的值。

2、 values() ,获取所有的值.
    Collection<V> values()不能获取到key对象

3、Map.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会将数组中的元素作为集合中的元素。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值