JavaSE基础八----<集合>Map接口及其实现类 Collections类

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE基础八----<集合>Map接口及其实现类 Collections类相关的知识,希望对你有一定的参考价值。


1.Map接口及其实现类



Map的存储方式为键值对形式; key->value;双列存储;
一个键对应一个值;键不能重复,值是可以重复的.


1.1HashMap


HashMap的默认容量为16,负载因子为0.75,即每当存储了3/4的元素后就会开始扩容,扩容速度为2倍.
当然,也可以使用构造方法来指定存储的长度以及负载因子的值.
在之前提到了HashSet的底层就是HashMap,且仅是使用了HashMap的key那一列来存储
所以,HashMap是无序(不按照添加顺序进行排序)的;而且底层是由hashcode( )方法以及equals( )方法来进行判断的,避免存入重复的;注意,当出现重复的键时,后面出现的键的值会将前面的值覆盖掉.

HashMap允许存入null键或值.

HashMap<String,Integer> hashMap=new HashMap<String, Integer>();
        hashMap.put("阿猫",10);
        hashMap.put("阿猫",30);
        hashMap.put("喵喵",5);
        hashMap.put("猫仔",5);
        hashMap.put("猫仔",10);
        hashMap.put(null,10);
        System.out.println(hashMap);
        //{null=10, 猫仔=10, 喵喵=5, 阿猫=30}

常用方法

方法
public V put(K key,V value) 添加元素的方法
public V remove(Object key)根据指定的键;删除一个键的映射
public boolean remove(Object key,Object value)删除指定的键对应的值
public void clear( )清空集合的方法
public boolean containsKey(Object key)判断该集合是否包含这个键
public boolean containsValue(Object value);判断该集合是否包含这个值
public boolean isEmpty( )判断集合是否为空
public int size( );返回该集合的有几组键值对
public V get(Object key);根据指定的键返回映射的值;
public java.util.Set keySet( )返回此集合中包含的键的Set视图(获取所有键)
public java.util.Collection values( )返回此集合中包含的值的Collection视图。(返回所有value)

1.2TreeMap


在TreeSet的底层实际用到了TreeMap;可以按照键的自然顺序进行排序;
键不能重复;键的类型必须实现接口comparable(排序时使用的);是双列存储的;

TreeMap<String,Integer> treeMap=new TreeMap<>();
        treeMap.put("阿猫",10);
        treeMap.put("阿猫",30);
        treeMap.put("喵喵",5);
        treeMap.put("猫仔",5);
        treeMap.put("猫仔",10);
        System.out.println(treeMap);
        //{喵喵=5, 猫仔=10, 阿猫=30}

1.3HashTable


HashTable是无序的;键不能重复;初始的默认容量为11,负载因子也是0.75;即容量到3/4时会开始扩容;扩容速度为2倍加1;
HashTable是线程安全的;实现了同步;不允许存入null这个键或值.

Hashtable<String,Integer> hashtable=new Hashtable<>();
        hashtable.put("阿猫",10);
        hashtable.put("阿猫",30);
        hashtable.put("喵喵",5);
        hashtable.put("猫仔",5);
        hashtable.put("猫仔",10);
        //hashtable.put(null,10);
        //HashTable不可存储null键;会出现空指针异常;
        System.out.println(hashtable);
        //{喵喵=5, 猫仔=10, 阿猫=30}


2.Map接口的迭代



例如写一个HashMap类型的hashmap;键值为{你=20, 我=10, 它=60, 他=30}.

通过一个方法遍历

//通过一个方法遍历,以流的方式输出;其中使用了拉莫达表达式
        hashMap.forEach((k,v)-> System.out.println(k+"--"+v));
        //你--20
        //我--10
        //它--60
        //他--30

增强for循环

  • 方式一:这里先用keyset方法将集合中的键获取;然后再使用foreach循环,通过get方法获取键对应的值(不建议使用);
 //增强for循环
        //这里先用keyset方法将集合中的键获取;
        Set<String> setKey=hashMap.keySet();
        //然后再使用foreach循环,通过get方法获取键对应的值;
        for (String s:setKey) {
            System.out.println(s+"--"+hashMap.get(s));
        }
        //你--20
        //我--10
        //它--60
        //他--30
  • 方式二:使用entrySet方法将键值对封装到Entry对象中;然后再使用foreach循环,通过getKey方法和getValue方法;
//增强for循环
        //使用entrySet方法将键值对封装到Entry对象中;
        Set <Map.Entry<String,Integer>> entrySet=hashMap.entrySet();
        //然后再使用foreach循环,通过getKey方法和getValue方法;
        for (Map.Entry<String,Integer> entry:entrySet) {
            System.out.println(entry.getKey()+"--"+entry.getValue());
        }

上面的两个方式,也可用迭代器输出

迭代器遍历

  • 方式一
 //也可用迭代器输出
        Set<String> setKey=hashMap.keySet();
        Iterator<String> iterator=setKey.iterator();
        while(iterator.hasNext()){
            String s=iterator.next();
            System.out.println(s+"--"+hashMap.get(s));
        }
  • 方式二:
//也可用迭代器输出
        Set <Map.Entry<String,Integer>> entrySet=hashMap.entrySet();
        Iterator<Map.Entry<String,Integer>> iterator=entrySet.iterator();
        while(iterator.hasNext()){
            Map.Entry<String,Integer> entry=iterator.next();
            System.out.println(entry.getKey()+"--"+entry.getValue());
        }



3.Collections类



注意不是Collection接口.

作为集合的工具类,其中定义了大量的静态方法;有的是同步集合对象的方法,也有对List接口的集合进行排序的方法.

常用方法

返回值类型方法
static < T> booleanaddAll(Collection<? super T> c, T… elements) 将所有指定的元素添加到指定的集合。T ... elements----可变长度的参数
static < T> intbinarySearch(List<? extends Comparable<? super T>> list, T key) 使用二叉搜索算法搜索指定对象的指定列表。(注意这个集合是要经过排序的)
static < T> List< T>emptyList( ) 返回空列表(immutable)。 (注意这个列表不能添加元素;会出异常)
static < T> voidcopy(List<? super T> dest, List<? extends T> src) 将所有元素从一个列表复制到另一个列表中。(注释:dest:目标列表;src:源列表;注意源数组的size不能大于目标列表的size;并且目标列表中一定要有内容,不能为空的集合)最后会将源列表的元素覆盖到目标列表.
static < T> voidfill(List<? super T> list, T obj) 用指定的元素代替指定列表的所有元素。
static <T extends Object & Comparable<? super T>>Tmax(Collection<? extends T> coll) 根据其元素的自然顺序返回给定集合的最大元素。
static < T> booleanreplaceAll(List list, T oldVal, T newVal) 将列表中一个指定值的所有出现替换为另一个。(oldVal:原来的元素;newVal:新元素)
static voidreverse(List<?> list) 反转指定列表中元素的顺序。 即逆序输出.
static <T extends Comparable<? super T>>voidsort(List< T> list) 根据其元素的natural ordering对指定的列表进行排序。 例如:a,b,c,d....
static voidswap(List<?> list, int i, int j) 交换指定列表中指定位置的元素。 i,j;元素的下标位置


以上是关于JavaSE基础八----<集合>Map接口及其实现类 Collections类的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE基础八----<集合>泛型集合体系Collection接口中的方法

JavaSE基础八----<集合>Set接口及其实现类,Set接口的迭代方式

JavaSE集合基础总览

Java全栈JavaSE:21.集合之Map

重点知识学习--[泛型学习]

JavaSE高级之集合类