1、接口中不能包含普通方法,所有方法均为抽象方法,允许在接口中定义默认方法,默认方法可以提供方法实现
2、接口中不包含构造器和初始化块定义
成员变量(只能是静态常量)总是public static final修饰
方法(只能是抽象实例方法、类方法、或者默认方法),如果不是默认方法或类方法(这俩一定要有方法体),系统自动添加abstract
内部类(内部接口或者枚举)
权限均为public

public interface ex extends 接口1,接口2...{//public可以省略,默认是包内可访问,可以有多个父接口但是不能继承类
常量定义;
抽象方法定义;
内部类、接口、枚举定义;
默认方法或类方法定义;
}
package practice;
import java.util.*;
public interface outPut{
	int Max=50;
	void out();
	void getData(String msg);
	default void print(String...msgs) {//在接口中定义默认方法需要用default
		for(String msg:msgs) {
			System.out.println(msg);
		}
	}
	default void test() {
		System.out.println("默认方法");//默认方法没有static要通过接口的实现类的实例来调用默认方法
	}
	static String staticTest(){
		return "接口里的类方法";//可以直接用接口来调用
	}
}

接口可以被当做特殊的类,一个Java源文件只能有一个public接口,如果源文件定义了定义了一个public接口,则文件名要与该接口名字相同
接口的继承

package practice;
import java.util.*;
interface A{
	int a=1;
	void testa();
}
interface B{
	int b=2;
	void testb();
}
interface C extends A,B{
	int c=3;
	void testc();
}
public class Main{
	public static void main(String[] args) {
		System.out.println(C.a);
		System.out.println(C.b);
	}
}

接口的使用
1、定义变量,也可用于强制转换
2、调用接口中定义的常量
3、被其他类实现
一个类可以实现多个接口实现关键字:implements
一个类必须重写所有该接口里的抽象方法
Collection接口里的操作集合元素方法
books跟c的实现类虽然不同,但是这些都是Collection可用的方法,所以不要紧

package practice;
import java.lang.*;
import java.util.*;
public class Main{
	public static void main(String[] args) {
		Collection c=new ArrayList();
		c.add("孙悟空");//添加元素
		c.add(6);
		System.out.println("c集合里有几个元素"+c.size());
		c.remove(6);
		System.out.println("c集合里有几个元素"+c.size()+c.contains("孙悟空"));//是否包含孙悟空这个元素
		c.add("疯狂Java");
		System.out.println("c集合里的元素"+c);
		Collection books=new HashSet();
		books.add("轻量级");
		books.add("疯狂");
		System.out.println("c是否包含books合集"+c.containsAll(books));
		c.removeAll(books);//用c集合除去books集合里的元素
		System.out.println(c);
		c.clear();//删除c的所有元素
		books.retainAll(c);//books中只剩下c中也包含的元素
	}
}

当使用System.out.println©时输出的是集合全部元素,是因为Collection所有实现类都重写了toString()

Iterator主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也称为迭代器
Iterator接口中定义了四种方法
1、boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回true
2、Object next():返回集合里的下一个元素
3、void remove():删除集合里上一次next方法返回的元素

Set集合
1、不能记住元素添加顺序
2、不允许包含相同元素
HashSet类
1、不能保证元素的排列顺序,顺序可能与添加顺序不同
2、HashSet不是同步的,如果有多线程同时访问一个HashSet必须通过代码来保证其同步
3、集合元素值可以是null
4、判断元素相等equals要返回true,hashCode也要一样
当存入一个元素时,会先调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据值决定储存位置,如果两个元素equal是相等的,但是hashCode不相等,两者都可以存入HashSet

package practice;
import java.lang.*;
import java.util.*;
class A{
	public boolean equals(Object obj) {
		return true;
	}
}
class B{
	public int hashCode() {
		return 1;
	}
}
class C{
	public int hashCode(){
		return 2;
	}
	public boolean equals(Object obj) {
		return true;
	}
}
public class Main{
	public static void main(String[] args) {
		HashSet books=new HashSet();
		books.add(new A());
		books.add(new A());
		books.add(new B());
		books.add(new B());
		books.add(new C());
		books.add(new C());
	}
}

重写hashCode方法的要求
1、同一对象多次调用该方法返回值相同
2、当连个对象equals返回true时,hashCode()也返回相同

package practice;
import java.lang.*;
import java.util.*;
class R{
	int count;
	public R(int count) {
		this.count=count;
	}
	public String toString() {//重写表达式,影响println
		return "R[count:"+count+"]";
	}
	public boolean equals(Object obj) {
		if(this==obj)
		return true;
		if(obj!=null&&obj.getClass()==R.class) {//如果obj属于R这一类里
			R r=(R)obj;
			return this.count==r.count;//得到相同的hashCode
		}
		return false;
	}
	public int hashCode() {
		return this.count;
	}
}
public class Main{
	public static void main(String[] args) {
		HashSet hs=new HashSet();
		hs.add(new R(5));
		hs.add(new R(-3));
		hs.add(new R(9));
		hs.add(new R(-2));
		System.out.println(hs);
		Iterator it=hs.iterator();
		R first=(R)it.next();//添加可变对象
		first.count=-3;
		System.out.println(hs);//输出重复元素
		hs.remove(new R(-3));
		System.out.println(hs);
	}
}

List集合方法

{
books.add(1,new String("疯狂"));
books.remove(2);
books.set(1,new String("疯狂"));//将第二个元素进行替换
books.indexOf(new String("疯狂"));//判断指定元素在集合里的位置
books.suList(1,2);//截取成子集合
}

List判断对象相等的标准是equals返回true