Java基础之梳理类集框架

框架梳理

知识的获得在于形成在框架,尤其是像Java中的类集框架纷繁复杂,在实际应用中如何使用,各自有什么注意点?必须梳理清楚!

两大阵营的选择

类集框有Collection 和 Map两大阵营,在实际开发中如何选择哪个,或者说他们的主要区别是什么?

  • 数据存储的区别:Collection旗下类集存储的是单值数据,Map旗下的类集存储的是二元偶数据,以key 和 value成对存储
  • 功能的区别:Collection一般实现的时输出操作,Map一般是根据key查找

Collection旗下的类集

在这里插入图片描述
Collection接口主要靠其两个子类接口子类实例化对象,一般不直接出现。

List 和 Set的区别:

  • List允许数据重复,Set不允许保存重复数据

————————————————————————————————
List三个子类的区别:

  • ArrayList看名字就可以知道,它的内部是依靠动态开辟数组实现。
  • LinkedList的内部是依靠链表实现,数据较多时使用
  • Vector是线程安全的,可实现线程同步

Set两个子类的区别:

  • HashSet存储是无序的,和添加的顺序无关
  • TreeSet存储时有序的,可以将数据升序输出

————————————————————————————————
List主要的使用的方法有:

  • add()
  • contains()
  • Iterator()
  • remove()
  • get()
    注意:若数据的数据类型是自定义类,需要在自定义类中覆写equals方法才能正确使用remove()和contains 方法

Set主要的使用的方法有:

  • add()
  • remove()
  • contains()
    注意:若数据的数据类型是自定义类,需用在自定义类中覆写Comparable接口的中的ComparTo方法才能使TreeSet的对象正确排序,需要在自定义类中覆写equals()和 hashCode()方法才能使HashSet 的对象不保存重复数据

————————————————————————————————
我们可以看到Set和List都有一个iterator()方法,该方法可以返回一个Iterator对象对集合进行迭代输出。

Iterator类(向后迭代输出)有两个主要方法:

  • hashNext():判断迭代类中是否还有数据
  • next():获得对象

LinkedIterator类不同于Iterator类,LinkedIterator类是一个双向迭代仅适用与List接口实现类,实现与Iterator相似,多了一个向前迭代,只有使用过了向后迭代才能使用向前迭代

代码演示:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class Demo1 {
	public static void main(String[] args) {
		Set<Person> set = new HashSet<Person>();
		set.add(new Person("入云龙",21));
		set.add(new Person("穿天猴",23));
		set.add(new Person("白日鼠",34));
		set.add(new Person("金毛鼠",12));
		set.add(new Person("金毛鼠",12));
		set.remove(new Person("入云龙",21));
		Iterator<Person> itr = set.iterator();
		while(itr.hasNext()) {
			Person person = itr.next();
			System.out.println(person);
		}
	}
}

class Person{
	private String name;
	private int age;
	
	public Person() {}
	public Person(String name,int age) {
		this.age = age;
		this.name = name;
	}
	public String toString() {
		return "姓名:"+this.name+",年龄:"+this.age;
	}
	
	public boolean equals(Object obj) {
		if(this == obj) {
			return true;
		}
		if(obj == null) {
			return false;
		}
		if(!(obj instanceof Person)) {
			return false;
		}
			Person data = (Person)obj;
			return this.name.equals(data.name)&&this.age == data.age;
	}
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result +age;
		result = prime * result + ((name == null)?0:name.hashCode());
		return age;
	}
}

Map旗下的类集

在这里插入图片描述
hashMap 和 Hashtable 的区别:

  • 两者都是以节点保存
  • hashtable是线程安全的,hashtable 中key 和 value都不能存储null

————————————————————————————————
hashMap 和 LinkedHashMap 的区别:

  • hashMap 当数据过大时可以转换成红黑树存储查询,数据不多时作为链表存储,LinkedhashMap只能以链表存储
  • hashMap是无序的,而LinkedHashMap 是有序的

————————————————————————————————
Map的主要方法:

  • put()
  • entrySet()
    注意:因为Map类集中的put方法调用了生成了hash码,所以当数据的数据类型为自定义类要覆写hashCode() 和 equals() 方法
    ————————————————————————————————
    Map类集的输出,实际上Map类集并没有继承Iterator接口,但是提供了一个entrySet方法将Map类集转换成Set类集,再进行迭代

代码演示:

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Demo1 {
	public static void main(String[] args) {
		Map<Person,Integer> map = new HashMap<Person,Integer>();
		map.put(new Person("入云龙",21),1);
		map.put(new Person("穿天猴",23),2);
		map.put(new Person("白日鼠",34),3);
		map.put(new Person("金毛鼠",12),4);
		map.put(new Person("金毛鼠",12),5);
		map.remove(new Person("入云龙",21),1);
		Set<Map.Entry<Person,Integer>> set = map.entrySet();
		Iterator<Map.Entry<Person,Integer>> itr = set.iterator();
		while(itr.hasNext()) {
			Entry<Person,Integer> me = itr.next();
			System.out.println(me.getKey()+" "+me.getValue());
		}
	}
}

class Person{
	private String name;
	private int age;
	
	public Person() {}
	public Person(String name,int age) {
		this.age = age;
		this.name = name;
	}
	public String toString() {
		return "姓名:"+this.name+",年龄:"+this.age;
	}
	
	public boolean equals(Object obj) {
		if(this == obj) {
			return true;
		}
		if(obj == null) {
			return false;
		}
		if(!(obj instanceof Person)) {
			return false;
		}
			Person data = (Person)obj;
			return this.name.equals(data.name)&&this.age == data.age;
	}
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result +age;
		result = prime * result + ((name == null)?0:name.hashCode());
		return age;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44078014/article/details/105800720