黑马程序员--Map集合、集合框架工具类

本文深入解析Java中的Map集合,包括其子类Hashtable、HashMap和TreeMap的特点与应用场景,以及Map集合的基本操作方法。同时,提供了丰富的示例代码帮助理解。

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

第一节--Map集合

Map集合和Collection集合不同的是,Map集合双列集合,存储的是一对元素,即键值对,键和值有映射关系,键具有唯一性。

       Map

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

|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。取代了HashTablejdk1.2.效率高。

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

 Map中常用的方法:

1.添加

V put(K,V);添加键值对,当K值已存在时,会将原来的V覆盖,并返回原来的V

void putAll(Map<? extends M,? extends N> m);添加一个集合

2、删除

        clear();//清空

        Vremove(Object key);//删除指定键值对

3、判断

        containsKey(Objectkey);//判断键是否存在

        containsValue(Objectvalue)//判断值是否存在

        isEmpty();//判断是否为空

4、获取

        Vget(Object key);//通过键获取对应的值

        size();//获取集合的长度

        Collection<V>value();//获取Map集合中所以得值,返回一个Collection集合

还有两个取出方法,接下来会逐个讲解:

        Set<Map.Entry<K,V>>entrySet();

        Set<K>  keySet();

注:HashMap集合可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。

/*练习:使用Map集合中取出元素的两种方式
思路:定义学生类,学生属性有姓名和年龄,同时学生有住址,学生和住址作为键值对存入Map集合
取出的第一种方式:将键存入Set集合,使用Set集合中的迭代器,根据键使用get()方法获取值
取出的第二种方式:将将键值对这种映射 关系存入Set集合,使用Set集合中的迭代器,同时可以获得
键和值
 */
public class MapDemo {

	public static void main(String[] args) {
		//创建HashMap集合,并存入Student对象
		HashMap<Student, String> hm = new HashMap<Student,String>();
		//TreeMap<Student, String> hm = new TreeMap<Student,String>();
		hm.put(new Student("lisi01",22), "heze");
		hm.put(new Student("lisi05",25), "tianjin");
		hm.put(new Student("lisi02",12), "shangqiu");
		hm.put(new Student("lisi31",26), "heze");
		hm.put(new Student("lisi05",25), "tianjin");
		//getOutAnother(hm);
		getOut(hm);
		//System.out.println(hm);

	}
	//定义取出HashMap集合中元素的方法,并打印元素
	public static void getOut(HashMap<Student, String> hm){
		//通过keySet()方法获取hm的键的Set集合,使用迭代器
		Iterator<Student> iter = hm.keySet().iterator();
		while(iter.hasNext()){
			Student s = iter.next();
			System.out.println(s.toString()+'\t'+hm.get(s));
		}
	}
	public static void getOutAnother(HashMap<Student, String> hm){
		//通过entrySet()方法获取hm的键值映射的Set集合,使用迭代器
		Iterator<Map.Entry<Student,String>> iter = hm.entrySet().iterator();
		while(iter.hasNext()){
			Map.Entry<Student, String> me = iter.next();
			Student stu = me.getKey();
			String str = me.getValue();
			System.out.println(stu.toString()+"\t"+str.toString());
		}
	}
}
//定义学生类
class Student implements Comparable<Student>{
	private String name;
	private int age;
	Student(String name,int age){
		this.name = name;
		this.age = age;
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
	//复写hashCode方法和equals方法,使对象可以存入HashSet集合,保证对象唯一性
	//并实现自然排序,年龄为主
	public int hashCode(){
		return this.name.hashCode()+this.age;
	}
	public boolean equals(Object obj){
		if(!(obj instanceof Student))
			throw new RuntimeException("类型错误");
		Student s = (Student)obj;
		return this.name.equals(s.name)&&this.age==s.age;
	}
	//复写comparaTo()方法,定义对象的比较规则,使对象可以存入TreeSet集合,保证对象的唯一性
	//让TreeSet集合可以对对象进行自然排序
	@Override
	public int compareTo(Student s) {
		int num = (new Integer(this.age)).compareTo(new Integer(s.age));
		if(num==0)
			return this.name.compareTo(s.name);
		return num;
	}
	public String toString(){
		return name+":"+age;
	}
}

集合使用技巧

1、各种集合的特点

看到Array就是数组结构,元素有脚标,查询速度快

看到Linked就是链表结构,增删速度快,有特有方法:addFirst()addLast();removeFirst()removeLast();getFirst()getLast();

看到Tree就是二叉树结构,必须进行排序,排序需要比较

比较有两种方式:

第一种:让元素自身具备比较性。元素实现Comparable接口,复写comparaTo方法

第二种:让集合具备比较性。自定义比较器实现Comparator接口,复写Compara方法。将自定义比较器对象作为集合构造函数参数进行传递。

看到Hash就是哈希表结构,就想到哈希值,就想到唯一性,就想到存入该类集合中的元素必须覆盖hashCodeequals方法。

LinkedHashSetLinkedHashMap,这两个集合可以保证元素存入顺序和取出顺序一致,保证哈希表有序。

2、如何选择集合

元素是单个对象,使用 Collection 集合
元素是有映射关系的一对对象,使用 Map 集合
需要保证元素唯一性,使用 Set 集合
不需要保证元素唯一性,使用 List 集合

/*
 * 练习:获取字符串,并以a(3)b(2)...的格式打印结果
 * 思路:
 * 1.定义一个功能,给出任意一个字符串都能实现上述结果
 * 2.将字母作为键,次数作为值,用Map集合存储
 * 3.将字符串转换成字符数组,便于操作
 * 4.判断字符作为键在集合中是否存在,使用get()方法判断,如果不存在,则返回null,将该字母
 * 	和1作为键值对,存入集合中,否则就将该字母和键值自增,存入集合
 * 5.取出集合中键值对,用StringBuidler存储。
 * 6.转换成字符串返回给调用者
 */
class Test{
	public static void main(String [] args){
		String str = "cabillaacbicjjkahgaufas;uiofheriao;gjfji";
		charCount(str);
	}
	public static String charCount (String str){
		TreeMap<Character,Integer>  tm = new TreeMap<>();
		char[]arr = str.toCharArray();
		for(int x = 0;x < arr.length;x++){
			Integer value = tm.get(arr[x]);
			if(value==null){
				tm.put(arr[x], 1);
			}
			else{
				value = value + 1;
				tm.put(arr[x], value);
			}
		}
		Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
		Iterator<Map.Entry<Character,Integer>> iter = entrySet.iterator();
		StringBuilder sb = new StringBuilder();
		while(iter.hasNext()){
			Map.Entry<Character, Integer> me = iter.next();
			Character chr = me.getKey();
			Integer in = me.getValue();
			sb.append(chr+"("+in+")");
		}
		System.out.print(sb.toString());
			
		return sb.toString();
	}
}

 

第二节--集合框架工具类

Collections:

是对集合对象进行操作的工具类,提供的方法都是静态方法,不需要创建对象。很多方法都是对List集合进行操作的。

常见操作

1、查找

        T max(Collection<? extends T> coll);根据集合的自然顺序,获取coll集合中的最大元素

        T max(Collection<? extends T> coll,Comparator<? super T> comp);根据指定比较器comp的顺序,获取coll集合中的最大元素

        int binarySearch(Lsit<? extends Comparable<? super T>> list,Tkey);二分法搜索list集合中的指定对象

2、替换

        voidfill(List<? super T> list, T obj);将list集合中的全部元素替换成指定对象obj

        booleanreplaceAll(List<T> lsit,T oldVal,T newVal);用newVal替换集合中的oldVal值

        void swap(Listlist,int i,int j);/在指定列表的指定位置处交换元素

3排序:

        void shuffle(List<?> list);使用默认随机源对list集合中的元素进行随机排序

        void sort(Lsit<T> list);根据自然顺序对list集合中的元素进行排序

        voidsort(List<T> lsit,Comparator<? super T> c);根据指定比较器c的排序方式对list集合进行排序

4、反转

        reverse(List<?> list);反转list集合中元素的顺序

        Comparator reverseOrder();返回一个比较器,强行逆转了实现Comparable接口的对象的自然顺序

        ComparatorreverseOrder(Comparator<T> cmp);返回一个比较器,强行逆转了指定比较器的顺序

5、同步的集合

        List<T>synchronizedList(List<T> list);返回支持的同步(线程安全的)List集合

       Map<K,V>synchronizedList(Map<K,V> m);返回支持的同步(线程安全的)Map集合

Arrays

对数组对象进行操作的工具类,内部定义的都是静态方法。

常见操作:

1、Lsit<T> asList(T... a);//将数组转换为集合

        a、将数组转换成集合,不可使用集合的增删方法,因为数组的长度是固定的。如果进行增删操作,则会产生UnsupportedOperationException的编译异常。

        b、如果数组中的元素都是对象,则变成集合时,数组中的元素就直接转为集合中的元素。

        c、如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

2、binarySearch():二分查找方法,fill():替换方法,sort():排序方法等

  特点:可对数组元素进行相应操作,可以接受除boolean之外的其他各种基本数据类型及有序的引用类型数组的参数,且还可以对指定元素的范围,并可根据指定比较器进行相应的操作。

    如:sort(T[]a,Comparator<? super T> c)

               fill(int[]a,int from,int to)等

3、String toString();//可以接收各种数组类型参数,并返回指定数组内容的字符串表现形式。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值