集合(二)

一、Map

二、Collections

 

一、Map

该集合存储键值对。一对一对往里存。而且要保证键的唯一性。和Set很像。Set底层就是使用了Map集合。

什么使用map集合呢?
当数据之间存在这映射关系时,就要先想map集合。

1、方法

1),添加。

      put(K key, V value)

      putAll(Map<? extends K,? extends V>m)

2),删除。

      clear()

      remove(Object key)

3),判断。

      containsValue(Object value)

      containsKey(Object key)

      isEmpty()

4),获取。

      get(Object key)

      size()

      values()

      entrySet()

      keySet()

2、子类

Hashtable:底层是哈希表数据结构,不可以存入nullnull值。该集合是线程同步的。jdk1.0.效率低。

HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。

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

3、集合的取出方式

1),Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。

                所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。        

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

2),Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.EntryEntry其实就是Map中的一个static内部接口。

                为什么要定义在内部呢?

因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。而且该事物在直接访问Map集合中的元素。

4、代码演示

a,MAP的基本使用

377import java.util.*;  
378class  MapDemo  
379{  
380    public static void main(String[] args)   
381    {  
382        Map<String,String> map = new HashMap<String,String>();  
383  
384        //添加元素,添加元素,如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。  
385        //并put方法会返回被覆盖的值。  
386        System.out.println("put:"+map.put("01","zhangsan1"));  
387        System.out.println("put:"+map.put("01","wnagwu"));  
388        map.put("02","zhangsan2");  
389        map.put("03","zhangsan3");  
390  
391        System.out.println("containsKey:"+map.containsKey("022"));  
392        //System.out.println("remove:"+map.remove("02"));  
393  
394        System.out.println("get:"+map.get("023"));  
395  
396        map.put("04",null);  
397        System.out.println("get:"+map.get("04"));  
398        //可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。  
399  
400  
401          
402        //获取map集合中所有的值。  
403        Collection<String> coll = map.values();  
404  
405        System.out.println(coll);  
406        System.out.println(map);  
407  
408  
409    }  
410}  
[java] view plaincopy

411<pre name="code" class="java">(b),MAP的取出方式  

[java] view plaincopy

412import java.util.*;  
413  
414  
415class MapDemo2   
416{  
417    public static void main(String[] args)   
418    {  
419        Map<String,String> map = new HashMap<String,String>();  
420  
421        map.put("02","zhangsan2");  
422        map.put("03","zhangsan3");  
423        map.put("01","zhangsan1");  
424        map.put("04","zhangsan4");  
425  
426        //将Map集合中的映射关系取出。存入到Set集合中。  
427        Set<Map.Entry<String,String>> entrySet = map.entrySet();  
428  
429        Iterator<Map.Entry<String,String>> it = entrySet.iterator();  
430  
431        while(it.hasNext())  
432        {  
433            Map.Entry<String,String> me = it.next();  
434            String key = me.getKey();  
435            String value = me.getValue();  
436  
437            System.out.println(key+":"+value);  
438  
439        }  
440  
441        /* 
442        //先获取map集合的所有键的Set集合,keySet(); 
443        Set<String> keySet = map.keySet(); 
444 
445        //有了Set集合。就可以获取其迭代器。 
446        Iterator<String> it = keySet.iterator(); 
447 
448        while(it.hasNext()) 
449        { 
450            String key = it.next(); 
451            //有了键可以通过map集合的get方法获取其对应的值。 
452            String value  = map.get(key); 
453            System.out.println("key:"+key+",value:"+value); 
454        } 
455 
456        */  
457  
458    }  
459}  

c,TreeMap练习

460/* 
461练习: 
462"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。 
463 
464希望打印结果:a(1)c(2)..... 
465 
466通过结果发现,每一个字母都有对应的次数。 
467说明字母和次数之间都有映射关系。 
468 
469注意了,当发现有映射关系时,可以选择map集合。 
470因为map集合中存放就是映射关系。 
471 
472思路: 
4731,将字符串转换成字符数组。因为要对每一个字母进行操作。 
474 
4752,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。 
476 
4773,遍历字符数组。 
478    将每一个字母作为键去查map集合。 
479    如果返回null,将该字母和1存入到map集合中。 
480    如果返回不是null,说明该字母在map集合已经存在并有对应次数。 
481    那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。 
482 
4834,将map集合中的数据变成指定的字符串形式返回。 
484*/  
485import java.util.*;  
486class  MapTest3  
487{  
488    public static void main(String[] args)   
489    {  
490        String s= charCount("ak+abAf1c,dCkaAbc-defa");  
491        System.out.println(s);  
492    }  
493      
494    public static String charCount(String str)  
495    {  
496        char[] chs = str.toCharArray();  
497  
498        TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();  
499  
500          
501        int count = 0;  
502        for(int x=0; x<chs.length; x++)  
503        {  
504              
505  
506            if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))  
507                continue;  
508  
509            Integer value = tm.get(chs[x]);  
510  
511              
512            if(value!=null)  
513                count = value;  
514            count++;  
515            tm.put(chs[x],count);//直接往集合中存储字符和数字,为什么可以,因为自动装箱。  
516  
517            count = 0;  
518            /* 
519            if(value==null) 
520            { 
521                tm.put(chs[x],1); 
522            } 
523            else 
524            { 
525                value = value + 1; 
526                tm.put(chs[x],value); 
527            } 
528            */  
529        }  
530  
531        //System.out.println(tm);  
532  
533        StringBuilder sb = new StringBuilder();  
534  
535        Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();  
536        Iterator<Map.Entry<Character,Integer>>  it = entrySet.iterator();  
537  
538        while(it.hasNext())  
539        {  
540            Map.Entry<Character,Integer> me = it.next();  
541            Character ch = me.getKey();  
542            Integer value = me.getValue();  
543            sb.append(ch+"("+value+")");  
544        }  
545        return sb.toString();  
546    }  
547  
548}  

二、Collections

1、简介

Collections:集合框架的工具类。里面定义的都是静态方法。

2CollectionsCollection的区别

Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。它有两个常用的子接口:

List:对元素都有定义索引。有序的。可以重复元素。

Set:不可以重复元素。无序。

Collections是集合框架中的一个工具类。该类中的方法都是静态的

      提供的方法中有可以对list集合进行排序,二分查找等方法。通常常用的集合都是线程不安全的。因为要提高效率。如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。

3、代码演示

a,数组变集合

549/* 
550asList:将数组变成list集合 
551*/  
552  
553import java.util.*;  
554class  ArraysDemo  
555{  
556    public static void main(String[] args)   
557    {  
558//      int[] arr = {2,4,5};  
559//  
560//      System.out.println(Arrays.toString(arr));  
561  
562  
563  
564        String[] arr = {"abc","cc","kkkk"};  
565  
566  
567        //把数组变成list集合有什么好处?  
568        /* 
569        可以使用集合的思想和方法来操作数组中的元素。 
570 
571        注意:将数组变成集合,不可以使用集合的增删方法。 
572        因为数组的长度是固定。 
573        contains。 
574        get 
575        indexOf() 
576        subList(); 
577 
578        如果你增删。那么会反生UnsupportedOperationException, 
579 
580        */  
581        List<String> list = Arrays.asList(arr);  
582        //sop("contains:"+list.contains("cc"));  
583        //list.add("qq");//UnsupportedOperationException,  
584  
585        //sop(list);  
586  
587        //int[] nums = {2,4,5};  
588        Integer[] nums = {2,4,5};  
589  
590          
591        List<Integer> li = Arrays.asList(nums);  
592  
593  
594  
595        /* 
596        如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。 
597        如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。 
598        */  
599        sop(li);  
600  
601  
602  
603    }  
604    public static boolean myContains(String[] arr,String key)  
605    {  
606        for(int x=0;x<arr.length; x++)  
607        {  
608            if(arr[x].equals(key))  
609                return true;  
610        }  
611        return false;  
612    }  
613      
614    public static void sop(Object obj)  
615    {  
616        System.out.println(obj);  
617    }  
618  
} 

b,集合变数组

620/* 
621集合变数组。 
622Collection接口中的toArray方法。 
623*/  
624import java.util.*;  
625class  CollectionToArray  
626{  
627    public static void main(String[] args)   
628    {  
629        ArrayList<String> al = new ArrayList<String>();  
630  
631        al.add("abc1");  
632        al.add("abc2");  
633        al.add("abc3");  
634          
635        /* 
636        1,指定类型的数组到底要定义多长呢? 
637        当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。 
638        当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。 
639        所以创建一个刚刚好的数组最优。 
640         
641 
642        2,为什么要将集合变数组? 
643        为了限定对元素的操作。不需要进行增删了。 
644 
645        */  
646  
647        String[] arr = al.toArray(new String[al.size()]);  
648        System.out.println(Arrays.toString(arr));  
649    }  
650}  



你可能感兴趣的:(集合二)