JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类

         一Collection接口

         Collection接口定义了存取一组对象的方法,其子接口Set、List和Queen分别定义了存储方式。

        使用Collection接口需要注意:

        1Collection接口是List、Set和Queen接口的父接口。

        2定义了可用于操作List、Set和Queen接口的方法,也就是增删改查的方法。

        3Set接口中的数据对象没有顺序且不可以重复;List接口中的数据对象有顺序且可以重复。

        二Collection接口中定义的方法

        在Collection接口的介绍中我们知道Collection接口中定义了一些用于操作集合接口的有关增加、删除、查找、排

序和修改的方法。

       查看Java API知道:

JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类_第1张图片

JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类_第2张图片

       我们可以先来看看若是不使用集合框架创建一列对象的实例:

public class Test{
	public static void main(String[] args){
                //每次只能创建一个对象,即使是数组也只能添加相同类型的对象
		Name name1 = new Name("f1","l1");
                Name name2 = new Name("f2","l2");
                Name name3 = new Name("f3","l3");
                System.out.println(name1);
                System.out.println(name2);
                System.out.println(name3);                     
	}
}

class Name{
	private String firstName;
	private String lastName;
	
	public Name(String firstName,String lastName){
		this.firstName = firstName;
		this.lastName = lastName;
	}
	
	public String getFirstName(){
		return firstName;
	}
	
	public String getLastName(){
		return lastName;
	}
	
	public String toString(){
		return firstName + " " +lastName;
	}
}

       运行结果: 

JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类_第3张图片

       我们使用Collection集合接口的实现类来创建对象以及使用add()方法来添加对象的实例:

import java.util.*;

public class Test{
	public static void main(String[] args){
		Collection c = new ArrayList();
		//可以放入不同类型的对象
		c.add("hello");
		c.add(new Name("f1","l1"));
		c.add(new Integer(100));
		System.out.println(c.size());
		System.out.println(c);
	}
}

class Name{
	private String firstName;
	private String lastName;
	
	public Name(String firstName,String lastName){
		this.firstName = firstName;
		this.lastName = lastName;
	}
	
	public String getFirstName(){
		return firstName;
	}
	
	public String getLastName(){
		return lastName;
	}
	
	public String toString(){
		return firstName + " " +lastName;
	}
}

       运行结果:

JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类_第4张图片

       如果是使用remove()方法呢?

import java.util.*;

public class Test{
	public static void main(String[] args){
		Collection c = new HashSet();
		//可以放入不同类型的对象
		c.add("hello");
		c.add(new Name("f1","l1"));
		c.add(new Integer(100));
		c.remove("hello");
		c.remove(new Integer(100));
		System.out.println(c.remove(new Name("f1","l1")));
		System.out.println(c);
	}
}

class Name{
	private String firstName;
	private String lastName;
	
	public Name(String firstName,String lastName){
		this.firstName = firstName;
		this.lastName = lastName;
	}
	
	public String getFirstName(){
		return firstName;
	}
	
	public String getLastName(){
		return lastName;
	}
	
	public String toString(){
		return firstName + " " +lastName;
	}
}

       运行结果:

JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类_第5张图片

       重写类的equals()方法必须重写hashCode()方法

       集合类对象在调用remove()、contains()等方法时需要比较对象是否相等,这回涉及到对象类型的equals()方法和

hashCode()方法;对于自定义的类型,需要重写equals()方法和hashCode()方法以实现自定义的对象相对规则。

       注意:

       1相等的对象应该具有相等的hasd codes。

       2增加Name类的equals()方法hashCode()方法如下:

        public boolean equals(Object obj){
		if(obj instanceof Name){
			Name name = (Name)obj;
			return (firstName.equals(name.firstName))

&&(lastName.equals(name.lastName));
		}else{
			return super.equals(obj);
		}
	}
	
	public int hashCode(){
		return firstName.hashCode();
	}
       再次改写上面实例的代码:

import java.util.*;

public class Test{
	public static void main(String[] args){
		Collection c = new HashSet();
		//可以放入不同类型的对象
		c.add("hello");
		c.add(new Name("f1","l1"));
		c.add(new Integer(100));
		c.remove("hello");
		c.remove(new Integer(100));
		System.out.println(c.remove(new Name("f1","l1")));
		System.out.println(c);
		
		System.out.println("-----------------------");
		Collection lt = new LinkedList();
		lt.add(new Name("f1","l1"));
		lt.add(new Name("f2","l2"));
		System.out.println(lt.contains(new Name("f2","l2")));
		lt.remove(new Name("f1","l1"));
		System.out.println(lt);
	}
}

class Name{
	private String firstName;
	private String lastName;
	
	public Name(String firstName,String lastName){
		this.firstName = firstName;
		this.lastName = lastName;
	}
	
	public String getFirstName(){
		return firstName;
	}
	
	public String getLastName(){
		return lastName;
	}
	
	public String toString(){
		return firstName + " " +lastName;
	}
	
	public boolean equals(Object obj){
		if(obj instanceof Name){
			Name name = (Name)obj;
			return (firstName.equals(name.firstName))&&(lastName.equals(name.lastName));
		}else{
			return super.equals(obj);
		}
	}
	
	public int hashCode(){
		return firstName.hashCode();
	}
}

       运行结果:

JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类_第6张图片

       Collection集合接口定义的其它方法就不再一一用实例说明,在后面的模拟学生选课功能的实例时,我们可以再尝

试使用,以便深入了解。

       三Collections工具类

       Collection工具类是Java集合框架中用来操作集合对象的工具类,也是Java集合框架的成员。

       (1)比较器——Comparable和Comparator接口

       1)Comparable接口——可比较接口

        Comparable实现该接口的提示:这个类的实例可以比较大小,可以进行自然排序,定义了默认的比较规则。

        Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()

方法被称为它的自然比较方法。

       实现此接口的对象可以通过Collections.sort()和Arrays.sort()进行自动排序,也可以用作有序映射中的键或有序集合

中的元素,无需指定比较器。

       compareTo()方法返回正数表示大,负数表示小,0表示相等。

       comparable接口定义的方法:


       接口声明:

public interface Comparable{
        int compareTo(T o);
}

       2)Comparator接口——比较器接口

       Comparator接口用于定义临时比较规则,而不是默认比较规则。可以将Comparator传递给sort()方法,从而允许

在排序顺序上实现精确控制。还可为那些没有自然顺序的对象collection提供排序。

       Comparator接口比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或

正整数。

       Comparator接口的方法:

JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类_第7张图片

       接口声明:

public interface Comparator{
        int compare(T o1, T o2);        
}

       这里就不举例说明了,后面的一篇博文会专门把它们拿出来详细介绍。

       (2)迭代器——Iterator接口

       所有实现了Collection接口的容器类型都有一个iterator()方法用以返回一个实现了Iterator接口的对象。Iterator对象

称作迭代器,用以方便的实现对象容器内元素的遍历操作。

       Iterator接口定义了如下的方法:

       依然使用上面实例的代码:

import java.util.*;

public class Test{
	public static void main(String[] args){
		Collection c = new HashSet();
		c.add(new Name("f1","l1"));
		c.add(new Name("f2","l2"));
		c.add(new Name("f3","l3"));
		Iterator i = c.iterator();
		while(i.hasNext()){
			//next()方法返回值为Object类型,需要转换为相应类型
			Name n = (Name)i.next();
			System.out.println(n.getFirstName()+"");
		}
		
		System.out.println("---------------");
		Collection hs = new HashSet();
		hs.add(new Name("fff1","lll1"));
		hs.add(new Name("f2","l2"));
		hs.add(new Name("fff3","lll3"));
		for(Iterator j=hs.iterator();j.hasNext();){
			Name name = (Name)j.next();
			if(name.getFirstName().length()<3){
				//如果换成c.remove(name)会产生例外
			    j.remove();
			}
		}
		System.out.println(hs);
	}
}

class Name{
	private String firstName;
	private String lastName;
	
	public Name(String firstName,String lastName){
		this.firstName = firstName;
		this.lastName = lastName;
	}
	
	public String getFirstName(){
		return firstName;
	}
	
	public String getLastName(){
		return lastName;
	}
	
	public String toString(){
		return firstName + " " +lastName;
	}
	
	public boolean equals(Object obj){
		if(obj instanceof Name){
			Name name = (Name)obj;
			return (firstName.equals(name.firstName))&&(lastName.equals(name.lastName));
		}else{
			return super.equals(obj);
		}
	}
	
	public int hashCode(){
		return firstName.hashCode();
	}
}

       运行结果:

JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类_第8张图片

       在这里只是介绍一下比较器和迭代器,在后面的系列文章中还会详细的说明和使用实例代码加以解释。


你可能感兴趣的:(JavaSE,JavaSE由浅入深)