集合框架Map

Map

集合框架的另一个顶层容器。用于存储key和value的对应关系的集合。其中要保证key在集合中是唯一的。

Map的子类及其特点如下:

         |--HashTable底层数据结构:哈希表。不允许null键和null值。线程同步。

                   |--Properties用于储存键值对型的文件配置信息,可以和IO技术相结合。

         |--HashMap   底层数据结构:哈希表。允许null键和null值。线程不同步。

         |--TreeMap   底层数据结构:二叉树。可以给键进行排序。线程不同步。

同hashset和treeSet一样,为了保证元素的唯一性(key)的唯一性,hashMap使用hashCode()和equals()方法来保证key的唯一,treeMap通过使元素具有比较性(即类定义时实现comparable接口)或者在定义集合是指定自己定义的比较器来比较元素(即使用自己定义的比较器实现Comparator,实现其中的compare()方法。),另外,treeMap可以按照比较的结果对存入的元素进行排序。

Map中元素取出方法:

1、  先取出键值对中的key的值,然后根据key的值取出value的值。

使用keyset()返回map中key的集合,然后用Iterator遍历取出key值,然后根据key值取出value的值。

例如:

package collectionTest;
import java.util.*;
public class KeySetDemo {
	public static void main (String args[])
	{
		HashMap<String,Integer> hm = new HashMap<String,Integer>();
		hm.put("zhangsan", 20);
		hm.put("lisi", 21);
		hm.put("wangwu", 22);
		hm.put("ni", 23);
		Set<String> set = hm.keySet();
		for(Iterator<String> it = set.iterator();it.hasNext();)
		{
			String key = it.next();
			Integer n = hm.get(key);
			System.out.println(key+"..."+n);
		}
		
	}
}

2、  先取出键值对的对应关系(把key,value)的值共同取出,再遍历取出key和value的值。

使用entrySet()方法返回Map.Entry类型的集合,再使用getValue()和getKey()方法来取出key和value。
例如:

package collectionTest;

import java.util.*;
public class EntrySetDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HashMap<String,Integer> hm = new HashMap<String,Integer>();
		hm.put("zhangsan", 20);
		hm.put("lisi", 21);
		hm.put("wangwu", 22);
		hm.put("ni", 23);
		Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();//注意返回值是Map.Entry类型的集合,加上正确的泛型限定。
		for(Iterator<Map.Entry<String, Integer>> it = entrySet.iterator();it.hasNext();)//得到entrySet的迭代器
		{
			Map.Entry<String, Integer> entry = it.next();//得到具体的Map.Entry。
			String name = entry.getKey();//得到Map.Entry中的key
			Integer age = entry.getValue();//得到Map.Entry中的value
			System.out.println(name+"..."+age);
		}
	}

}

Map的练习题:

1、"fdgavcbsacdfs"获取该字符串中,每一个字母出现的次数。要求打印结果是:a(2)b(1)...;

package collectionTest;

import java.util.*;
import java.util.Map.Entry;

public class countString {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(countCharNum("abcdefghijabc"));
	}
	public static String countCharNum( String s){
		Map<Character,Integer> m = new HashMap<Character,Integer>();
		char[] charArray = s.toCharArray();
		for(int i=0;i<charArray.length;i++)
		{
			if((charArray[i]>='a'&&charArray[i]<='z')||(charArray[i]>='A'&&charArray[i]<='Z'))
			{
				Integer in = (Integer) m.get(charArray[i]);
				int value = 1;
				if(in!=null)
					m.put(charArray[i],in+value);
				else
					m.put(charArray[i], value);
					
			}
			
		}
		return mapToString(m);
		
	}
	
	public static String mapToString(Map<Character,Integer> map)
	{
		Set<Map.Entry<Character, Integer>> set =  map.entrySet();
		StringBuilder sb = new StringBuilder();
		for(Iterator<Entry<Character, Integer>> it = set.iterator();it.hasNext();)
		{
			Map.Entry<Character, Integer> entryset = (Map.Entry<Character, Integer>) it.next();
			Character c = entryset.getKey();
			sb.append(c);
			Integer n = entryset.getValue();
			sb.append("("+n+")");
			
		}
		return sb.toString();
	}
	
}

两个工具类:

Collections类:里面的方法都是方便对Collection进行操作的静态方法,可以通过类名直接调用,而不用建立相应的类的对象。

几个常用的方法:

1、排序:Collections.sort(List list)排序前提:list中的元素必须具有可比性,也就是实现了comparable接口。Collections.sort(Listlist,Comparator com)排序时指定比较器对元素进行排序。

2、Collections.max(List list)前提也元素可以排序,返回值为List中的元素的类型。

3、Collections.binarySearch(Listlist)二分查找,前提是该list已经排好序,返回元素在list中的索引。

4、Collections.fill(List list,T obj)将list中的所有元素替成指定元素。

5、Collections.repalceAll(List list,ToldValue,T newValue),将指定元素的值替换为新值。

6、Collections.reverse(List list)将list中的元素顺序翻转。

7、Collections.reverseOrder()返回一个比较器,该比较器强行逆转了Comparable接口的对象的自然顺序。

8、Collections.reverseOrder(Comparatorcom)返回一个比较器,该比较器强行逆转了指定Comparator所实现的顺序。

9、Collections.shuffle(List l)将list中的元素重新随机排列一次。

10、     synchronizedXxx()将指定的集合转换成线程同步的集合。

11、     Collections.toArray(c)把集合c转换成数组。

方法演示代码:

package collectionTest;
import java.util.*;
class myComparator implements Comparator<Person>
{
	public int compare(Person p1,Person p2)
	{
		int num =  p1.getAge()-p2.getAge();
		if(num ==0)
			return p1.getName().compareTo(p2.getName());
		return num;
	}

	
}
public class CollectionsTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String> l = new ArrayList<String>();
		l.add("abc");
		l.add("def");
		l.add("wed");
		l.add("sdf");
		System.out.println(l);
		Collections.sort(l);//String实现了Comparable接口,使用其默认的自然方法排序。
		System.out.println(l);
		List<Person> pl = new ArrayList<Person>();
		pl.add(new Person("zhang","男",20));
		pl.add(new Person("wang","女",23));
		pl.add(new Person("li","女",52));
		pl.add(new Person("zhao","男",25));
		pl.add(new Person("liu","男",20));
		System.out.println(pl);
		Collections.sort(pl,new myComparator());//用自己定义的比较方法排序
		System.out.println(pl);
		System.out.println(Collections.max(pl,new myComparator()));//查找年龄最大的人。
		System.out.println(Collections.binarySearch(pl, new Person("zhang","男",20)));
	}
	 
}

Arrays类:存放对array进行操作的静态方法。,通过类名直接调用。

常用方法:

1、Arrays.toStirng(arr)将数组转换成字符串。

2、Arrays.asList(arr)将数组转换成List集合。把数组编程集合的好处:可以使用集合的思想来操作元素,比如判断元素是否在集合中存在。

注意:1、转变后的List集合不能使用集合的增删方法,会出现UnsupportedOperationException.

2、如果数组中的元素都是对象,那么变成集合时,数组中的元素变成集合中的元素。如果数组中的元素都是基本数据类型,那么转化时会将数组变成集合的一个元素存进集合。

3、Arrays.equals(arr1,arr2)判断两个数组是否相等。

4、Arrays.fill(arr,value)将数组中的所有元素都设置为value。

5、Arrays.sort(arr)对数组中的元素进行排序。

6、Arrays.copyOf(arr,int length)返回arr数组中前length个元素的拷贝。

方法演示代码:

package collectionTest;
import java.util.*;
public class Arraystest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr1 = new int[]{1,2,3,4};
		int[] arr2 = new int[]{1,2,3,4};
		if(Arrays.equals(arr1, arr2))//判断两个数组是否相同
			System.out.println("两个数组相等!");
		int[]arr3 = Arrays.copyOf(arr1, 3);//复制数组
		System.out.println(Arrays.toString(arr3));
		Arrays.fill(arr3,1,3, 1);//为数组填充其他值
		System.out.println(Arrays.toString(arr3));
		Arrays.sort(arr3);//对数组进行排序
		System.out.println(Arrays.toString(arr3));
		int dex = Arrays.binarySearch(arr3, 2);//对排序后的数组进行二分查找。
	}

}

增强for()循环:

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

局限性:只能对集合或数组中的元素进行取出。但是不能修改和增删。

使用迭代器遍历:可以对集合中的元素进行remove()操作。

使用ListInterator 可以对集合中的元素进行增删改查。

可变参数:

其实就是一个数组,但是接收的是数组的元素。* 自动将这些元素封装成数组。简化了调用者的书写。

 注意:可变参数类型,必须定义在参数列表的结尾。

静态导入:

用import static语句提前将类中的静态成员导入,以达到简化书写的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值