天天看点

黑马程序员——黑马学习日志之十一 集合(二)

------- android培训、java培训、期待与您交流! ----------

黑马学习日志之十一 集合(二)

1 Map集合

Map<K,V>: 和Collection是并行的接口,将键映射到值的对象,该集合存储键值对,一对一对往里存,而且要保证键的唯一性,一个映射不能包含重复的键,每个键最多只能映射到一个值。

K—此映射所维护的键的类型

V—映射值的类型

Collection 是单列集合。Map是双列集合,像是夫妻,可以给元素加索引甚至起名字。

Map集合方法:

添加:

V put(k ,v): 返回值。键是唯一的,当再次存入的键和集合中已有的键相同,会将原有的值覆盖。

void putAll(map); 将整个集合的元素添加到调用的集合中。

删除:

void clear():清除集合中所有的元素。

v remove(k) 通过键去删除元素,并返回该键对应的值。

判断:

boolean containsKey(Object key):是否包含这个键,返回值是布尔类型。

boolean containsValue(Object value):是否包含这个值,返回值的类型是布尔类型。

boolean isEmpty(): 返回值是布尔类型,判断集合是否为空。

获取:

v get(k):根据键获取值。当键不存在返回null,要尽量使用引用类型进行接收。

int size():获取集合中的长度。

Collection values() 获取集合中所有的值,返回是单列的集合。

Set keySet():获取map集合中所有的键,返回的是Set集合

Set entrySet():获取的是键值的映射的关系。将映射关系封装成对象存入到了Set集合。

2 Map集合的取出

第一种方法:

Set keyset(): 返回此集合映射中的所有的键的集合Set集合,返回的是Set集合。然后通过    遍历键的方法,通过get的方法获取到键的值。

第二种方法:

Set entrySet(): 返回一对键值对象,将map中的键值映射关系看成一个对象,通过getKey和getValue的方法获取其键和值。

Map中的键值映射关系是Map.Entry。  Map.Entry:其实Entry也是一个接口 它是Map接口中的一个内部接口

例子:

第一种:

import java.util.*;

class MapDemo2

{

 public static void main(String [] args){

  Map<String,String> map= new HashMap<String ,String>();

     map.put("02","sun2");

   map.put("03","sun3");

   map.put("01","sun1");

   map.put("04","sun4");

   //先获取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);

   }

 }

}

第二种:

//将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);

   }

2 Map的子类

Map集合的子类:

HashTable  底层是哈希表数据结构,不可以存入null键和null值。该集合是线程同步。

HashMap  底层是哈希表数据结构,允许使用null键和null值。该集合不同步。

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

和Set集合很像,其实Set集合底层就是Map。

3 工具类

Collections类

sort() 对指定列表按升序进行排序。

sort( list, new Comparator()) 对指定的列表用我们指定的方式排序

reverseOrder() 将原先的集合的自然顺序倒序排序。

reverseOrder(new Comparator()) 返回一个比较器,它强行逆转指定比较器的顺序。

binarySearch() 对有序的集合二分查找,返回值是集合中的索引,如果不存在该元素,  就返回-(插入点)-1。

fill( list, obj)用obj将集合中的元素替代

reverse(List list)集合反转

swap(List list, int i, int j);指定位置的交换

shuffle(List list);对集合中的元素随机置换(洗牌)

replaceAll(List list, T oldVal, T newVal)新元素替换老元素

同步集合 synchronizedList(List<T> list)  synchronizedMap(Map<T> map)    synchronizedSet(Set<T> sett)

Arrays类

asList() 将数组转换成List集合。可以使用集合的方法和思想来操作数组。

注意:

(1)数组变成集合,但是不可以使用集合的增删方法。数组长度是固定的,增删会发生   不支持操作异常

(2)当数组中存储的是基本数据类型,变成集合后,会将这个数组变成集合中的元素

(3)当数组中存储的是引用数据类型,变成集合后,就将数组中的元素作为集合中的元素

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

ArrayList<String> al = new ArrayList<String>();

String[] arr = al.toArray(new String[0]);

长度该怎么定义呢?

当指定的长度小于集合的长度,该方法内部会自动创建一个该类型的新数组长度和集合长度一致 。用于存储集合中的元素。

如果指定的数组长度大于集合的长度,那么该方法就不会创建新数组。而是使用传递进来的数组,存储完集合的元素后,其他的未存储的位置为null。

所以在定义数组是,最好定义长度和集合长度相同的数组最优。

将集合变成数组其实是限定了对元素的增删操作。

4 高级for循环

格式:

for(数据类型 变量名:被遍历的集合Collection或者数组)

{

}

局限:只能取出 不能修改

高级for循环变量 只是指向了集合中的元素 当变量名=其他值时 ,实际是变量名指向发生变化 没有指向集合中的元素 所以集合中的元素还是不变的

传统for和高级for有什么区别?

高级for有一个局限性 必须有被遍历的目标   例如 将helloword 打印100次 高级for不可以

建议在遍历数组的时候,使用传统for,因为可以定义脚标,对脚标进行操作

5  JDk1.5 新特性

可变参数

其实就是上一种数组参数的简写形式,不用每一次都手动的建立数组对象,只要将要操作的元素作为参数传递即可,隐式将这些参数封装成了数组。

   show(3,4);

   show(3,4,5);

 publicstaticvoidshow(int...arr)

{

Sop(arr);

 }

注意:可变参数一定要定义在参数列表的最后面

show(int...arr,int a) 不可以

show(int...arr,String a)不可以

show(String a ,int...arr) 可以

静态导入

当类名重名时,需要指定具体的包名

当方法名重名时,指定具体所属的对象或者类

import static java.util.Arrays.*;   导入Arrays这个类中的所有静态成员

import static java.lang.System.*;  导入System类中所有静态成员

------- android培训、java培训、期待与您交流! ----------