您的位置:首页 > 职场人生

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

2013-11-25 15:49 232 查看
------------------
android培训、java培训、期待与您交流! ---------------------
五、Map集合

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

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的value
int size();//返回映射的个数,即集合的长度。
Collection<V> values();//返回一个包含在该Map中的所有value的集合。即获取Map集合中所有的值。并存到collection集合中
Set<Map.Entry<K,V>>  entrySet();//返回包含有键值对的Set集合
Set<K>  keySet();//返回包含所有键的Set集合


3、Map集合常见子集:
|--Hashtable:底层是哈希表数据结构,不可以存入null键和null值。该集合是线程同步的,JDK1.0出产,效率低。
|--HashMap:底层是哈希表数据结构,允许存入null键和null值。该集合是不同步的,JDK1.2出产,效率高。
(注意和上面的区别,面试多)
|--TreeMap:底层是二叉树数据结构,线程不同步。可以用于给Map集合中的键进行排序。
Map和Set很像,其实,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集合还要注意有一个默认排序,所以这个实体的类一定要先复写hashCode和equals方法,还要实现Comparable接口实现copareTo方法。
6、TreeMap练习:
(1)需求:对学生对象的年龄进行升序排序。
思路:使学生类实现Comparable,给学生对象一个自然顺序,复写hashCode和equals方法。
(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

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

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

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

你可以使用contains,get,indexOf,subList方法,但是不能使用增删,那样会产生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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: