黑马程序员--Java基础之集合框架(2)

来源:互联网 发布:淘宝一件代发货源网免费加盟代理 编辑:程序博客网 时间:2024/05/19 12:16
------------------ android培训、java培训、期待与您交流! ---------------------

五、Map集合

1Map集合特点:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。

2、该接口主要方法:

 *添加:V put(K key,V value);// put方法添加元素时,如果相同的键添加两次,那么后添加的值会覆盖原有键对应的值,并且put方法会返回该键原来对应的value值void putAll(Map<? extends K,? extends V>m);  *删除:void clear();//删除所有V remove(Object key);//删除含有Key的映射  *判断:boolean containsValue(Object value);//是否包含含有该value值的映射boolean containsKey(Object key);//是否包含含有该key值的映射boolean isEmpty();//判断集合是否为空  *获取:V get(Object key);//返回Key的valueint size();//返回映射的个数,即集合的长度。Collection<V> values();//返回一个包含在该Map中的所有value的集合。即获取Map集合中所有的值。并存到collection集合中Set<Map.Entry<K,V>>  entrySet();//返回包含有键值对的Set集合Set<K>  keySet();//返回包含所有键的Set集合

3Map集合常见子集:

|--Hashtable:底层是哈希表数据结构,不可以存入null键和null值。该集合是线程同步的,JDK1.0出产,效率低。

|--HashMap:底层是哈希表数据结构,允许存入null键和null值。该集合是不同步的,JDK1.2出产,效率高。

   (注意和上面的区别,面试多)

|--TreeMap:底层是二叉树数据结构,线程不同步。可以用于给Map集合中的键进行排序。

MapSet很像,其实,Set底层就是使用了Map集合。

4、Map集合的两种取出方式:

*Set<key> keySet():将map中个所有的键存入到set集合,返回一个装满键的Set集合。因为set具备迭代器,所以可以通过迭代方式取出所有的键,再根据get方法,获取每一个键对应的值。

示例代码如下:

Map<String,String> map = new HashMap<String,String>;map.put("01","zhangsan01");map.put("02","zhangsan02");Set<String> keyset = map.keySet();Iterator<String> it = keyset.iterator();while(it.hasNext()) {String key = it.next(); value = map.get(key);}

*Set<Map.Entry<K,V>> entrySet():将Map集合中的映射关系取出,存入到Set集合中。

实例代码如下:

Map<String,String> map = new HashMap<String,String>;map.put("01","zhangsan01");map.put("02","zhangsan02");Set<Map.Entry<String,String>> entryset = map.entrySet();Iterator<Map.Entry<String,String>> it = entryset.iterator();while(it.hasNext()) {Map.Entry<String,String> me = it.next(); String key = me.getKey();Strig value = me.getValue();}

Map集合的取出原理:将map集合转成set集合,再通过迭代器取出。

5、Map练习

    注意,存入hashMap类似于存入hashSet集合,会先看哈希值再看equals方法来判断两个对象是不是同一个对象,如果存入TreeSet集合还要注意有一个默认排序,所以这个实体的类一定要先复写hashCodeequals方法,还要实现Comparable接口实现copareTo方法。

6、TreeMap练习:

(1)需求:对学生对象的年龄进行升序排序。

     思路:使学生类实现Comparable,给学生对象一个自然顺序,复写hashCodeequals方法。

(2)需求:“seghivsderjldhalwie”获取该字符串中的字母出现的次数。希望打印结果:a(1)c(2)...

     分析:通过结果发现,每一个字母都有对应的次数。说明字母和次数之间都有映射关系。

     思路:将字符串转换成字符数组。因为要对每一个字母进行操作。

           定义一个Map集合,因为打印结果的字母有顺序,所以使用treemap集合。

           遍历字符数组:将每一个字母作为键去查map集合。如果返回null,将字母和1存入到map集合中。如果返回的不是null,说明该字母在map集合中已经存在并有对应次数。那么就获取该次数并进行自增。然后将该字母和自增后的次数存入到map集合中,覆盖调用原有键所对应的值。将map集合中的数据变成指定的字符串形式返回。

7、Map集合的嵌套问题,嵌套解决。

六、集合转换成数组

集合变数组:Collection接口中的toArray方法。

1、指定类型的数组到底要定义多长呢?

  当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size

  当指定类型的数组长度大于了集合的size,就不会新创建数组了,而是使用传递进来的数组。

  所以创建一个刚刚好的数组最优。

例如:String[] arr = al.toArray(new String[al.size()]);

2、为什么要将集合变数组呢?

  为了限定对元素的操作,不需要进行增删操作了。

七、集合框架的工具类Collections

常用方法总结

sort排序

使用集合框架工具类collections中的sort方法为集合排序,集合中存放的对象要么实现comparable,要么使用一个实现了comparator的比较器。sort可以为没有排序功能的集合排序,如ArrayList。使用代码示例:Collections.sort(list);

max求最大值

binarySearch对集合进行二分查找。

前提必须是有序集合,如果没有找到,则返回:插入点-1 

fill替换全部,将集合中的所有元素替换成指定元素。

replace替换某个。

reverse反转。

reverseOrder逆向比较器reverseOrder返回的是一个比较器。会将存入集合的对象按照自然顺序的反序排列。

   用法与比较器一致。

synchronizedList返回线程同步的列表。

*static void swap(List<T> list, int x,int y)//交换任意两个元素。

*static void shuffle(List<?> list)//将集合list随机排序。  

八、用于操作数组的工具类:Arrays 

1Arrays用于操作数组的工具类,里面都是静态方法。

2asList:将数组变成list集合。

   注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定的。

   你可以使用containsgetindexOfsubList方法,但是不能使用增删,那样会产生UnsupportedOperationException不支持操作异常。

3、如果数组中的元素都是对象,那么变成集合时,数组中的对象元素就直接转成集合中的元素。

   如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

如:String[] arr = {"are","dhdttj","ghfhd","dh"};

//这样是正确的List<String> list = Arrays.asList(arr);//这里需要这样才行int[] nums = {2,4,6};List<int[]> li = Arrays.asList(nums);//这样也是可以的。Integer[] mm = {1,4,7}List<Integer> li1 = Arrays.asList(mm);