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

本文详细讲解了Java中的Map集合,包括其特点、主要方法、常见子类如Hashtable、HashMap和TreeMap。重点阐述了Map的取出方式、Map与Set的关系,以及Map的嵌套使用。此外,还介绍了如何将集合转换成数组,以及集合框架工具类Collections的常用方法,如排序、查找、替换等。最后提到了操作数组的工具类Arrays。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

五、Map集合

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

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集合

3Map集合常见子集:

|--Hashtable:底层是哈希表数据结构,不可以存入null键和null值。该集合是线程同步的,JDK1.0出产,效率低。

|--HashMap:底层是哈希表数据结构,允许存入null键和null值。该集合是不同步的,JDK1.2出产,效率高。

   (注意和上面的区别,面试多)

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

MapSet很像,其实,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集合还要注意有一个默认排序,所以这个实体的类一定要先复写hashCodeequals方法,还要实现Comparable接口实现copareTo方法。

6、TreeMap练习:

(1)需求:对学生对象的年龄进行升序排序。

     思路:使学生类实现Comparable,给学生对象一个自然顺序,复写hashCodeequals方法。

(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 

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

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

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

   你可以使用containsgetindexOfsubList方法,但是不能使用增删,那样会产生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);








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值