黑马程序员——java基础--集合(篇二)

来源:互联网 发布:淘宝重复铺货定义 编辑:程序博客网 时间:2024/05/23 22:45

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、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:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。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.Entry。Entry其实就是Map中的一个static内部接口。

                为什么要定义在内部呢?

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


4、代码演示

(a),MAP的基本使用

import java.util.*;class  MapDemo{public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();//添加元素,添加元素,如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。//并put方法会返回被覆盖的值。System.out.println("put:"+map.put("01","zhangsan1"));System.out.println("put:"+map.put("01","wnagwu"));map.put("02","zhangsan2");map.put("03","zhangsan3");System.out.println("containsKey:"+map.containsKey("022"));//System.out.println("remove:"+map.remove("02"));System.out.println("get:"+map.get("023"));map.put("04",null);System.out.println("get:"+map.get("04"));//可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。//获取map集合中所有的值。Collection<String> coll = map.values();System.out.println(coll);System.out.println(map);}}
<pre name="code" class="java">(b),MAP的取出方式

import java.util.*;class MapDemo2 {public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();map.put("02","zhangsan2");map.put("03","zhangsan3");map.put("01","zhangsan1");map.put("04","zhangsan4");//将Map集合中的映射关系取出。存入到Set集合中。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();String value = me.getValue();System.out.println(key+":"+value);}/*//先获取map集合的所有键的Set集合,keySet();Set<String> keySet = map.keySet();//有了Set集合。就可以获取其迭代器。Iterator<String> it = keySet.iterator();while(it.hasNext()){String key = it.next();//有了键可以通过map集合的get方法获取其对应的值。String value  = map.get(key);System.out.println("key:"+key+",value:"+value);}*/}}
(c),TreeMap练习
/*练习:"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。希望打印结果:a(1)c(2).....通过结果发现,每一个字母都有对应的次数。说明字母和次数之间都有映射关系。注意了,当发现有映射关系时,可以选择map集合。因为map集合中存放就是映射关系。思路:1,将字符串转换成字符数组。因为要对每一个字母进行操作。2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。3,遍历字符数组。将每一个字母作为键去查map集合。如果返回null,将该字母和1存入到map集合中。如果返回不是null,说明该字母在map集合已经存在并有对应次数。那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。4,将map集合中的数据变成指定的字符串形式返回。*/import java.util.*;class  MapTest3{public static void main(String[] args) {String s= charCount("ak+abAf1c,dCkaAbc-defa");System.out.println(s);}public static String charCount(String str){char[] chs = str.toCharArray();TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();int count = 0;for(int x=0; x<chs.length; x++){if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))continue;Integer value = tm.get(chs[x]);if(value!=null)count = value;count++;tm.put(chs[x],count);//直接往集合中存储字符和数字,为什么可以,因为自动装箱。count = 0;/*if(value==null){tm.put(chs[x],1);}else{value = value + 1;tm.put(chs[x],value);}*/}//System.out.println(tm);StringBuilder sb = new StringBuilder();Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();Iterator<Map.Entry<Character,Integer>>  it = entrySet.iterator();while(it.hasNext()){Map.Entry<Character,Integer> me = it.next();Character ch = me.getKey();Integer value = me.getValue();sb.append(ch+"("+value+")");}return sb.toString();}}

二、Collections

1、简介

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

2、Collections和Collection的区别

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

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

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

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

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

3、代码演示

(a),数组变集合

/*asList:将数组变成list集合*/import java.util.*;class  ArraysDemo{public static void main(String[] args) {//int[] arr = {2,4,5};////System.out.println(Arrays.toString(arr));String[] arr = {"abc","cc","kkkk"};//把数组变成list集合有什么好处?/*可以使用集合的思想和方法来操作数组中的元素。注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定。contains。getindexOf()subList();如果你增删。那么会反生UnsupportedOperationException,*/List<String> list = Arrays.asList(arr);//sop("contains:"+list.contains("cc"));//list.add("qq");//UnsupportedOperationException,//sop(list);//int[] nums = {2,4,5};Integer[] nums = {2,4,5};List<Integer> li = Arrays.asList(nums);/*如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。*/sop(li);}public static boolean myContains(String[] arr,String key){for(int x=0;x<arr.length; x++){if(arr[x].equals(key))return true;}return false;}public static void sop(Object obj){System.out.println(obj);}}

(b),集合变数组
/*集合变数组。Collection接口中的toArray方法。*/import java.util.*;class  CollectionToArray{public static void main(String[] args) {ArrayList<String> al = new ArrayList<String>();al.add("abc1");al.add("abc2");al.add("abc3");/*1,指定类型的数组到底要定义多长呢?当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。所以创建一个刚刚好的数组最优。2,为什么要将集合变数组?为了限定对元素的操作。不需要进行增删了。*/String[] arr = al.toArray(new String[al.size()]);System.out.println(Arrays.toString(arr));}}




------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0