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语句提前将类中的静态成员导入,以达到简化书写的目的。