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

------- 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中的键值映射关系看成一个对象,通过getKeygetValue的方法获取其键和值。

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

工具类

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

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

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

高级for循环

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

{
}

局限:只能取出 不能修改

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

传统for和高级for有什么区别?
高级for有一个局限性 必须有被遍历的目标   例如 将helloword 打印100次 高级for不可以

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

5  JDk1.5 新特性

可变参数

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

{

Soparr);
 }

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

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培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值