Java常用接口

文章目录

  • Collection 和 Iterator 和 Iterable
  • Comparable 和 Comparator
  • 待补全的

Collection 和 Iterator 和 Iterable

对于for(Type elem : Elems) {...}这种foreach的语法,能迭代两种数据类型,首先是最熟悉的数组,其次是实现了JavaSE5之后引入的Iterable接口的类

  • Iterable接口:
package java.lang;
import java.util.Iterator;
// 返回一个迭代器
public interface Iterable {
    Iterator iterator();
}

由接口代码可见,Iterable的实现类必须能够返回一个迭代器Iterator,那么什么是迭代器呢?

  • 迭代器是一个接口:一般使用场景是用一个(匿名)内部类实现该接口及相应的方法,使得可以访问外部类的元素,比如说ArrayList。
// Iterator接口
package java.util;
public interface Iterator { 
	boolean hasNext();	// 是否还有需要迭代的元素
	E next();	// 返回需要下一个元素
	void remove();	// 删除最后next出来的元素
}
// Iterator例子
import java.util.Iterator;

// PS: 实现时Iterable和Itarator的范型类必须一致,否则编译出错
public class IterableClass implements Iterable {
	protected String[] words = ("And that is how we know the Earth to be banana-shaped").split(" ");
	
	@Override
	public Iterator iterator() {
		// TODO Auto-generated method stub	
		// 匿名内部类实现 Iterator 接口
		return new Iterator() {
			private int index = 0;
			public boolean hasNext() {
				return index < words.length;
			}
			@Override
			public String next() {
				// TODO Auto-generated method stub
				return words[index++];
			}
			@Override
			public void remove() {
				// TODO Auto-generated method stub
				throw new UnsupportedOperationException();
			}
		};
	}
}
  • Collection:常用容器类所实现的List、Set接口都继承自Collection接口,而Collection接口则继承自Iterable,因此必须包含iterator()方法,并在该基础上增加add()等容器类的方法,因此常见容器类如ArrayList等都可以使用foreach遍历
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

public class ForEachCollections {
	public static void main(String[] args) {
		Collection cs = new ArrayList<>();
		Collections.addAll(cs, 
				"Take the long way home".split(" "));
		for(String s : cs) {
			System.out.print("'" + s + "' ");
		}
	}
}

Comparable 和 Comparator

  • Comparable接口:可以“自定义”排序规则
package java.lang;
import java.util.*;
public interface Comparable {
	// 一般返回三种参数:负整数,0,正整数
	public int compareTo(T o);
}

多用于排序算法,compareTo的返回结果的解释与具体的排序实现有关,而JDK中提供的排序方法解释为:A.compareTo(B)返回三种结果,负整数表示AB,0表示A=B

// 使用例子
import java.util.Arrays;

public class ComparableTest {
	public static void main(String[] args) {
		Integer[] a = new Integer[]{1,3,5,7,6,4,2};		// 将会自然排序,从小到大
		MyInteger[] b = new MyInteger[a.length];		// 将会逆序,从大到小
		for(int i = 0; i < a.length; i++) {
			b[i] = new MyInteger((int)a[i]);
		}
		
		Arrays.sort(a);
		Arrays.sort(b);
		
		System.out.print("Sorted a: ");
		for(int i =0;i {
	private final int value;

	public MyInteger(int value) {
		super();
		this.value = value;
	}
	
	

	public int getValue() {
		return value;
	}

	@Override
	public int compareTo(MyInteger o) {
		// TODO Auto-generated method stub
		int oValue = o.getValue();
		if(value == oValue) return 0;
		else if (value < oValue) return 1;
		else return -1;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return Integer.toString(value);
	}
}
  • Comparator接口:实现类本身就是一个比较器
package java.util;
public interface Comparator {
    int compare(T o1, T o2);		//比较两个元素的大小
    boolean equals(Object obj);	// 比较两个元素是否相等,T不一定是数字的类型,所以需要自己定义规则
// 使用例子
import java.util.Arrays;
import java.util.Comparator;

public class ComparatorTest {
	public static void main(String[] args) {
		Person[] list = new Person[3];
		list[0] = new Person(1, 3);
		list[1] = new Person(2, 2);
		list[2] = new Person(3, 1);
		
		// 按Id排序
		System.out.print("按Id排序:" );
		Arrays.sort(list, new PersonComparatorById());
		for(int i=0;i {
	@Override
	public int compare(Person o1, Person o2) {
		// TODO Auto-generated method stub
		return o1.getId() - o2.getId();
	}	
}

class PersonComparatorByAge implements Comparator {
	@Override
	public int compare(Person o1, Person o2) {
		// TODO Auto-generated method stub
		return o1.getAge() - o2.getAge();
	}	
}

class Person {
	private int id;
	private int age;
	public Person(int id, int age) {
		super();
		this.id = id;
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", age=" + age + "]";
	}
}

待补全的

  • Serializable
  • Map、List、Set
  • Runnable

你可能感兴趣的:(Java,接口)