import java.util.ArrayList;
			import java.util.Collection;

			public class A01_CollectionDemo1 {
			public static void main(String[] args) {
			/*
			public boolean add(E e)             添加
			public void clear()                 清空
			public boolean remove(E e)          删除
			public boolean contains(Object obj) 判断是否包含
			public boolean isEmpty()            判断是否为空
			public int size()                   集合长度


			注意点:
			Collection是一个接口,我们不能直接创建他的对象。
			所以,现在我们学习他的方法时,只能创建他实现类的对象。
			实现类:ArrayList
			*/
			//目的:为了学习Collection接口里面的方法
			//自己在做一些练习的时候,还是按照之前的方式去创建对象。
			Collection coll = new ArrayList<>();


			//1.添加元素
			//细节1:如果我们要往List系列集合中添加数据,那么方法永远返回true,因为List系列的是允许元素重复的。
			//细节2:如果我们要往Set系列集合中添加数据,如果当前要添加元素不存在,方法返回true,表示添加成功。
			//                                       如果当前要添加的元素已经存在,方法返回false,表示添加失败。
			//                                       因为Set系列的集合不允许重复。
			coll.add("aaa");
			coll.add("bbb");
			coll.add("ccc");
			System.out.println(coll);

			//2.清空
			//coll.clear();

			//3.删除
			//细节1:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除。
			//细节2:方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false
			//如果要删除的元素不存在,就会删除失败。
			System.out.println(coll.remove("aaa"));
			System.out.println(coll);


			//4.判断元素是否包含
			//细节:底层是依赖equals方法进行判断是否存在的。
			//所以,如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,那么在javabean类中,一定要重写equals方法。
			boolean result1 = coll.contains("bbb");
			System.out.println(result1);



			//5.判断集合是否为空
			boolean result2 = coll.isEmpty();
			System.out.println(result2);//false


			//6.获取集合的长度
			coll.add("ddd");
			int size = coll.size();
			System.out.println(size);//3

			}
			}
			
			
				
			import java.util.ArrayList;
			import java.util.Collection;

			public class A02_CollectionDemo2 {
			public static void main(String[] args) {
			//1.创建集合的对象
			Collection coll = new ArrayList<>();


			//2.创建三个学生对象
			Student s1 = new Student("zhangsan",23);
			Student s2 = new Student("lisi",24);
			Student s3 = new Student("wangwu",25);


			//3.把学生对象添加到集合当中
			coll.add(s1);
			coll.add(s2);
			coll.add(s3);

			//4.判断集合中某一个学生对象是否包含
			Student s4 = new Student("zhangsan",23);
			//因为contains方法在底层依赖equals方法判断对象是否一致的。
			//如果存的是自定义对象,没有重写equals方法,那么默认使用Object类中的equals方法进行判断,而Object类中equals方法,依赖地址值进行判断。
			//需求:如果同姓名和同年龄,就认为是同一个学生。
			//所以,需要在自定义的Javabean类中,重写equals方法就可以了。
			System.out.println(coll.contains(s4));
			}
			}
			
			
				
			import java.util.ArrayList;
			import java.util.Collection;
			import java.util.Iterator;

			public class A03_CollectionDemo3 {
			public static void main(String[] args) {
			/*
				Collection系列集合三种通用的遍历方式:
					1.迭代器遍历
					2.增强for遍历
					3.lambda表达式遍历


				 迭代器遍历相关的三个方法:
						Iterator iterator()  :获取一个迭代器对象
						boolean hasNext()       :判断当前指向的位置是否有元素
						E next()                :获取当前指向的元素并移动指针
			*/

			//1.创建集合并添加元素
			Collection coll = new ArrayList<>();
			coll.add("aaa");
			coll.add("bbb");
			coll.add("ccc");
			coll.add("ddd");

			//2.获取迭代器对象
			//迭代器就好比是一个箭头,默认指向集合的0索引处
			Iterator it = coll.iterator();
			//3.利用循环不断的去获取集合中的每一个元素
			while(it.hasNext()){
				//4.next方法的两件事情:获取元素并移动指针
				String str = it.next();
				System.out.println(str);
			}

			}
			}
			
			
				
			import java.util.ArrayList;
			import java.util.Collection;
			import java.util.Iterator;

			public class A04_CollectionDemo4 {
			public static void main(String[] args) {
			/*
			迭代器的细节注意点:
				1.报错NoSuchElementException
				2.迭代器遍历完毕,指针不会复位
				3.循环中只能用一次next方法
				4.迭代器遍历时,不能用集合的方法进行增加或者删除
			*/

			//1.创建集合并添加元素
			Collection coll = new ArrayList<>();
			coll.add("aaa");
			coll.add("bbb");
			coll.add("ccc");
			coll.add("ddd");

			//2.获取迭代器对象
			//迭代器就好比是一个箭头,默认指向集合的0索引处
			Iterator it = coll.iterator();
			//3.利用循环不断的去获取集合中的每一个元素
			while(it.hasNext()){
				//4.next方法的两件事情:获取元素并移动指针
				String str = it.next();
				System.out.println(str);
			}

			//当上面循环结束之后,迭代器的指针已经指向了最后没有元素的位置
			//System.out.println(it.next());//NoSuchElementException

			//迭代器遍历完毕,指针不会复位
			System.out.println(it.hasNext());

			//如果我们要继续第二次遍历集合,只能再次获取一个新的迭代器对象
			Iterator it2 = coll.iterator();
			while(it2.hasNext()){
				String str = it2.next();
				System.out.println(str);
			}
			}
			}
			
			
				
			import java.util.ArrayList;
			import java.util.Collection;
			import java.util.Iterator;

			public class A05_CollectionDemo5 {
			public static void main(String[] args) {
			/*
			迭代器的细节注意点:
				1.报错NoSuchElementException
				2.迭代器遍历完毕,指针不会复位
				3.循环中只能用一次next方法
				4.迭代器遍历时,不能用集合的方法进行增加或者删除
					暂时当做一个结论先行记忆,在今天我们会讲解源码详细的再来分析。
					如果我实在要删除:那么可以用迭代器提供的remove方法进行删除。
					如果我要添加,暂时没有办法。
			*/

			//1.创建集合并添加元素
			Collection coll = new ArrayList<>();
			coll.add("aaa");
			coll.add("bbb");
			coll.add("ccc");
			coll.add("ddd");
			coll.add("eee");

			//2.获取迭代器对象
			//迭代器就好比是一个箭头,默认指向集合的0索引处
			Iterator it = coll.iterator();
			//3.利用循环不断的去获取集合中的每一个元素
			while(it.hasNext()){
				//4.next方法的两件事情:获取元素,并移动指针
				String str = it.next();
				if("bbb".equals(str)){
					//coll.remove("bbb");
					it.remove();
				}
			}
			System.out.println(coll);

			}
			}
			
			
				
			import java.util.ArrayList;
			import java.util.Collection;

			public class A06_CollectionDemo6 {
			public static void main(String[] args) {
		   /* Collection系列集合三种通用的遍历方式:
			1.迭代器遍历
			2.增强for遍历
			3.lambda表达式遍历

			增强for格式:
				for(数据类型 变量名: 集合/数组){

				}

			快速生成方式:
				集合的名字 + for 回车

			*/


			//1.创建集合并添加元素
			Collection coll = new ArrayList<>();
			coll.add("zhangsan");
			coll.add("lisi");
			coll.add("wangwu");

			//2.利用增强for进行遍历
			//注意点:
			//s其实就是一个第三方变量,在循环的过程中依次表示集合中的每一个数据
			for(String s : coll){
				s = "qqq";
			}

			System.out.println(coll);//zhangsan lisi wangwu
			}
			}
			
			
				
			import java.util.ArrayList;
			import java.util.List;

			public class A01_ListDemo1 {
			public static void main(String[] args) {
		   /*

			List系列集合独有的方法:
				void add(int index,E element)       在此集合中的指定位置插入指定的元素
				E remove(int index)                 删除指定索引处的元素,返回被删除的元素
				E set(int index,E element)          修改指定索引处的元素,返回被修改的元素
				E get(int index)                    返回指定索引处的元素
			*/


			//1.创建一个集合
			List list = new ArrayList<>();

			//2.添加元素
			list.add("aaa");
			list.add("bbb");//1
			list.add("ccc");


			//void add(int index,E element)       在此集合中的指定位置插入指定的元素
			//细节:原来索引上的元素会依次往后移
			//list.add(1,"QQQ");

			//E remove(int index)                 删除指定索引处的元素,返回被删除的元素
			//String remove = list.remove(0);
			//System.out.println(remove);//aaa


			//E set(int index,E element)          修改指定索引处的元素,返回被修改的元素
			//String result = list.set(0, "QQQ");
			//System.out.println(result);

			// E get(int index)                    返回指定索引处的元素
			//String s = list.get(0);
			//System.out.println(s);


			//3.打印集合
			System.out.println(list);
			}
			}

			
			
				
			import java.util.ArrayList;
			import java.util.List;

			public class A02_ListDemo2 {
			public static void main(String[] args) {

			//List系列集合中的两个删除的方法
			//1.直接删除元素
			//2.通过索引进行删除

			//1.创建集合并添加元素
			List list = new ArrayList<>();

			list.add(1);
			list.add(2);
			list.add(3);


			//2.删除元素
			//请问:此时删除的是1这个元素,还是1索引上的元素?
			//为什么?
			//因为在调用方法的时候,如果方法出现了重载现象
			//优先调用,实参跟形参类型一致的那个方法。

			//list.remove(1);


			//手动装箱,手动把基本数据类型的1,变成Integer类型
			Integer i = Integer.valueOf(1);

			list.remove(i);

			System.out.println(list);


			}
			}

			
			
				
			import java.util.ArrayList;
			import java.util.List;
			import java.util.ListIterator;

			public class A03_ListDemo3 {
			public static void main(String[] args) {
			/*
				List系列集合的五种遍历方式:
					1.迭代器
					2.列表迭代器
					3.增强for
					4.Lambda表达式
					5.普通for循环
			 */


			//创建集合并添加元素
			List list = new ArrayList<>();
			list.add("aaa");
			list.add("bbb");
			list.add("ccc");

			//1.迭代器
			/*Iterator it = list.iterator();
			while(it.hasNext()){
				String str = it.next();
				System.out.println(str);
			}*/


			//2.增强for
			//下面的变量s,其实就是一个第三方的变量而已。
			//在循环的过程中,依次表示集合中的每一个元素
		   /* for (String s : list) {
				System.out.println(s);
			}*/

			//3.Lambda表达式
			//forEach方法的底层其实就是一个循环遍历,依次得到集合中的每一个元素
			//并把每一个元素传递给下面的accept方法
			//accept方法的形参s,依次表示集合中的每一个元素
			//list.forEach(s->System.out.println(s) );


			//4.普通for循环
			//size方法跟get方法还有循环结合的方式,利用索引获取到集合中的每一个元素
			/*for (int i = 0; i < list.size(); i++) {
				//i:依次表示集合中的每一个索引
				String s = list.get(i);
				System.out.println(s);
			}*/

			// 5.列表迭代器
			//获取一个列表迭代器的对象,里面的指针默认也是指向0索引的

			//额外添加了一个方法:在遍历的过程中,可以添加元素
			ListIterator it = list.listIterator();
			while(it.hasNext()){
				String str = it.next();
				if("bbb".equals(str)){
					//qqq
					it.add("qqq");
				}
			}
			System.out.println(list);
			}
			}

			
			
				
			import java.util.ArrayList;
			import java.util.Iterator;

			public class A01_ArrayListDemo1 {
			public static void main(String[] args) {
			ArrayList list = new ArrayList<>();
			list.add("aaa");
			list.add("bbb");
			list.add("ccc");

			/*
				iterator(): 生成一个迭代器对象,默认指向集合的0索引处
				hasNext():  判断当前指向的位置是否有元素
				next():     1.获取元素  2.移动指针

			*/

			Iterator it = list.iterator();
			while(it.hasNext()){
				String str = it.next();
				System.out.println(str);
			}
			}
			}
				
			
				
			import java.util.ArrayList;
			import java.util.Iterator;

			public class GenericsDemo1 {
			public static void main(String[] args) {
			//没有泛型的时候,集合如何存储数据
			//结论:
			//如果我们没有给集合指定类型,默认认为所有的数据类型都是Object类型
			//此时可以往集合添加任意的数据类型。
			//带来一个坏处:我们在获取数据的时候,无法使用他的特有行为。

			//此时推出了泛型,可以在添加数据的时候就把类型进行统一。
			//而且我们在获取数据的时候,也省的强转了,非常的方便。

			//1.创建集合的对象
			ArrayList list = new ArrayList<>();

			//2.添加数据
			//list.add(123);
			list.add("aaa");
			//list.add(new Student("zhangsan",123));


			//3.遍历集合获取里面的每一个元素
			Iterator it = list.iterator();
			while(it.hasNext()){
				String str = it.next();
				//多态的弊端是不能访问子类的特有功能
				//obj.length();
				//str.length();
				System.out.println(str);
			}
			}
			}
			
			
				
			public class GenericsDemo2 {
			public static void main(String[] args) {
		   /* MyArrayList list = new MyArrayList<>();

			list.add("aaa");
			list.add("bbb");
			list.add("ccc");


			System.out.println(list);*/



			MyArrayList list2 = new MyArrayList<>();
			list2.add(123);
			list2.add(456);
			list2.add(789);


			int i = list2.get(0);
			System.out.println(i);


			System.out.println(list2);
			}
			}
			
			
				
			import java.util.ArrayList;

			/*
				定义一个工具类:ListUtil
				类中定义一个静态方法addAll,用来添加多个集合的元素。
			*/
			public class GenericsDemo3 {
			public static void main(String[] args) {

			ArrayList list1 = new ArrayList<>();
			ListUtil.addAll(list1, "aaa", "bbb", "ccc", "ddd");
			System.out.println(list1);


			ArrayList list2 = new ArrayList<>();
			ListUtil.addAll(list2,1,2,3,4);
			System.out.println(list2);
			}
			}
			
			
				
			public class GenericsDemo4 {
			public static void main(String[] args) {
			/*
				泛型接口的两种使用方式:
					1.实现类给出具体的类型
					2.实现类延续泛型,创建实现类对象时再确定类型
			*/

			MyArrayList3 list = new MyArrayList3<>();
			}
			}

			
			
				
			import java.util.ArrayList;

			public class GenericsDemo5 {
			public static void main(String[] args) {
			/*
				泛型不具备继承性,但是数据具备继承性
			*/

			//创建集合的对象
			ArrayList list1 = new ArrayList<>();
			ArrayList list2 = new ArrayList<>();
			ArrayList list3 = new ArrayList<>();

			//调用method方法
			//method(list1);
			//method(list2);
			//method(list3);


			list1.add(new Ye());
			list1.add(new Fu());
			list1.add(new Zi());
			}

			/*
			* 此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。
			* */
			public static void method(ArrayList list) {
			}
			}
			
			
				
			import java.util.ArrayList;

			public class ListUtil {
			private ListUtil(){}

			//类中定义一个静态方法addAll,用来添加多个集合的元素。


			/*
			*   参数一:集合
			*   参数二~最后:要添加的元素
			*
			* */
			public static void addAll(ArrayList list, E e1,E e2,E e3,E e4){
				list.add(e1);
				list.add(e2);
				list.add(e3);
				list.add(e4);
			}

			/*    public static void addAll2(ArrayList list, E...e){
				for (E element : e) {
					list.add(element);
				}
			}*/


			public void show(){
				System.out.println("尼古拉斯·纯情·天真·暖男·阿玮");
			}
			}
				
			
				
			import java.util.Arrays;

			/*
			*       当我在编写一个类的时候,如果不确定类型,那么这个类就可以定义为泛型类。
			* */
			public class MyArrayList {

			Object[] obj = new Object[10];
			int size;

			/*
			E : 表示是不确定的类型。该类型在类名后面已经定义过了。
			e:形参的名字,变量名
			* */
			public boolean add(E e){
				obj[size] = e;
				size++;
				return true;
			}


			public E get(int index){
				return (E)obj[index];
			}


			@Override
			public String toString() {
				return Arrays.toString(obj);
			}
			}
				
			
			
			import java.util.Collection;
			import java.util.Iterator;
			import java.util.List;
			import java.util.ListIterator;

			public class MyArrayList2 implements List {
				@Override
				public int size() {
					return 0;
				}

				@Override
				public boolean isEmpty() {
					return false;
				}

				@Override
				public boolean contains(Object o) {
					return false;
				}

				@Override
				public Iterator iterator() {
					return null;
				}

				@Override
				public Object[] toArray() {
					return new Object[0];
				}

				@Override
				public  T[] toArray(T[] a) {
					return null;
				}

				@Override
				public boolean add(String s) {
					return false;
				}

				@Override
				public boolean remove(Object o) {
					return false;
				}

				@Override
				public boolean containsAll(Collection尖括号?> c) {
					return false;
				}

				@Override
				public boolean addAll(Collection尖括号? extends String> c) {
					return false;
				}

				@Override
				public boolean addAll(int index, Collection尖括号? extends String> c) {
					return false;
				}

				@Override
				public boolean removeAll(Collection尖括号?> c) {
					return false;
				}

				@Override
				public boolean retainAll(Collection尖括号?> c) {
					return false;
				}

				@Override
				public void clear() {

				}

				@Override
				public String get(int index) {
					return null;
				}

				@Override
				public String set(int index, String element) {
					return null;
				}

				@Override
				public void add(int index, String element) {

				}

				@Override
				public String remove(int index) {
					return null;
				}

				@Override
				public int indexOf(Object o) {
					return 0;
				}

				@Override
				public int lastIndexOf(Object o) {
					return 0;
				}

				@Override
				public ListIterator listIterator() {
					return null;
				}

				@Override
				public ListIterator listIterator(int index) {
					return null;
				}

				@Override
				public List subList(int fromIndex, int toIndex) {
					return null;
				}
			}
			
			
			
			import java.util.Collection;
			import java.util.Iterator;
			import java.util.List;
			import java.util.ListIterator;

			public class MyArrayList3 implements List {
				@Override
				public int size() {
					return 0;
				}

				@Override
				public boolean isEmpty() {
					return false;
				}

				@Override
				public boolean contains(Object o) {
					return false;
				}

				@Override
				public Iterator iterator() {
					return null;
				}

				@Override
				public Object[] toArray() {
					return new Object[0];
				}

				@Override
				public  T[] toArray(T[] a) {
					return null;
				}

				@Override
				public boolean add(E e) {
					return false;
				}

				@Override
				public boolean remove(Object o) {
					return false;
				}

				@Override
				public boolean containsAll(Collection尖括号?> c) {
					return false;
				}

				@Override
				public boolean addAll(Collection尖括号? extends E> c) {
					return false;
				}

				@Override
				public boolean addAll(int index, Collection尖括号? extends E> c) {
					return false;
				}

				@Override
				public boolean removeAll(Collection尖括号?> c) {
					return false;
				}

				@Override
				public boolean retainAll(Collection尖括号?> c) {
					return false;
				}

				@Override
				public void clear() {

				}

				@Override
				public E get(int index) {
					return null;
				}

				@Override
				public E set(int index, E element) {
					return null;
				}

				@Override
				public void add(int index, E element) {

				}

				@Override
				public E remove(int index) {
					return null;
				}

				@Override
				public int indexOf(Object o) {
					return 0;
				}

				@Override
				public int lastIndexOf(Object o) {
					return 0;
				}

				@Override
				public ListIterator listIterator() {
					return null;
				}

				@Override
				public ListIterator listIterator(int index) {
					return null;
				}

				@Override
				public List subList(int fromIndex, int toIndex) {
					return null;
				}
			}
			
			
			
			public class Student {
			private String name;
			private int age;


			public Student() {
			}

			public Student(String name, int age) {
				this.name = name;
				this.age = age;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			public String toString() {
				return "Student{name = " + name + ", age = " + age + "}";
			}
		}
			
			
			
			import java.util.HashSet;
			import java.util.Set;

			public class A01_SetDemo1 {
			public static void main(String[] args) {
		   /*
			   利用Set系列的集合,添加字符串,并使用多种方式遍历。
				迭代器
				增强for
				Lambda表达式

			*/


			//1.创建一个Set集合的对象
			Set s = new HashSet<>();

			//2,添加元素
			//如果当前元素是第一次添加,那么可以添加成功,返回true
			//如果当前元素是第二次添加,那么添加失败,返回false
			s.add("张三");
			s.add("张三");
			s.add("李四");
			s.add("王五");

			//3.打印集合
			//无序
			//System.out.println(s);//[李四, 张三, 王五]

			//迭代器遍历
			/* Iterator it = s.iterator();
			while (it.hasNext()){
				String str = it.next();
				System.out.println(str);
			}
			*/

			//增强for
			/* for (String str : s) {
				System.out.println(str);
			}*/

			// Lambda表达式
			s.forEach( str->System.out.println(str));
			}
			}
			
			
			
			public class A02_HashSetDemo1 {
			public static void main(String[] args) {
			/*
				哈希值:
					对象的整数表现形式
					1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
					2. 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
					3. 但是在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)

			 */

			//1.创建对象
			Student s1 = new Student("zhangsan",23);
			Student s2 = new Student("zhangsan",23);

			//2.如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
			//  如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
			System.out.println(s1.hashCode());//-1461067292
			System.out.println(s2.hashCode());//-1461067292


			//在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。
			//哈希碰撞
			System.out.println("abc".hashCode());//96354
			System.out.println("acD".hashCode());//96354
			}
			}
			
			
			
			import java.util.HashSet;

			public class A03_HashSetDemo2 {
			public static void main(String[] args) {
			/* 需求:创建一个存储学生对象的集合,存储多个学生对象。
				使用程序实现在控制台遍历该集合。
				要求:学生对象的成员变量值相同,我们就认为是同一个对象

			String   Integer
			*/
			//1.创建三个学生对象
			Student s1 = new Student("zhangsan",23);
			Student s2 = new Student("lisi",24);
			Student s3 = new Student("wangwu",25);
			Student s4 = new Student("zhangsan",23);


			//2.创建集合用来添加学生
			HashSet hs = new HashSet<>();

			//3.添加元素
			System.out.println(hs.add(s1));
			System.out.println(hs.add(s2));
			System.out.println(hs.add(s3));
			System.out.println(hs.add(s4));

			//4.打印集合
			System.out.println(hs);
			}
			}
			
			
			
			import java.util.LinkedHashSet;

			public class A04_LinkedHashSetDemo {
			public static void main(String[] args) {
			//1.创建4个学生对象
			Student s1 = new Student("zhangsan",23);
			Student s2 = new Student("lisi",24);
			Student s3 = new Student("wangwu",25);
			Student s4 = new Student("zhangsan",23);


			//2.创建集合的对象
			LinkedHashSet lhs = new LinkedHashSet<>();


			//3.添加元素
			System.out.println(lhs.add(s3));
			System.out.println(lhs.add(s2));
			System.out.println(lhs.add(s1));
			System.out.println(lhs.add(s4));

			//4.打印集合
			System.out.println(lhs);
			}
			}
			
			
			
			import java.util.Iterator;
			import java.util.TreeSet;

			public class A04_TreeSetDemo1 {
			public static void main(String[] args) {
			/*
			*
			*       需求:利用TreeSet存储整数并进行排序
			*
			* */


			//1.创建TreeSet集合对象
			TreeSet ts = new TreeSet<>();

			//2.添加元素
			ts.add(4);
			ts.add(5);
			ts.add(1);
			ts.add(3);
			ts.add(2);

			//3.打印集合
			//System.out.println(ts);

			//4.遍历集合(三种遍历)
			//迭代器
			Iterator it = ts.iterator();
			while(it.hasNext()){
				int i = it.next();
				System.out.println(i);
			}

			System.out.println("--------------------------");
			//增强for
			for (int t : ts) {
				System.out.println(t);
			}
			System.out.println("--------------------------");
			//lambda
			ts.forEach( i-> System.out.println(i));
			}
			}
			
			
			
			import java.util.TreeSet;

			public class A05_TreeSetDemo2 {
			public static void main(String[] args) {
			/*
				需求:创建TreeSet集合,并添加3个学生对象
				学生对象属性:
					姓名,年龄。
					要求按照学生的年龄进行排序
					同年龄按照姓名字母排列(暂不考虑中文)
					同姓名,同年龄认为是同一个人

				方式一:
					默认的排序规则/自然排序
					Student实现Comparable接口,重写里面的抽象方法,再指定比较规则
			*/


			//1.创建三个学生对象
			Student s1 = new Student("zhangsan",23);
			Student s2 = new Student("lisi",24);
			Student s3 = new Student("wangwu",25);
			Student s4 = new Student("zhaoliu",26);


			//2.创建集合对象
			TreeSet ts = new TreeSet<>();

			//3.添加元素
			ts.add(s3);
			ts.add(s2);
			ts.add(s1);
			ts.add(s4);

			//4.打印集合
			System.out.println(ts);

			//TreeSet 底层是红黑树
			}
			}
			
			
			
			import java.util.TreeSet;

			public class A06_TreeSetDemo3 {
			public static void main(String[] args) {
			/*
				需求:请自行选择比较器排序和自然排序两种方式;
				要求:存入四个字符串, “c”, “ab”, “df”, “qwer”
				按照长度排序,如果一样长则按照首字母排序

				采取第二种排序方式:比较器排序
			*/

			//1.创建集合
			//o1:表示当前要添加的元素
			//o2:表示已经在红黑树存在的元素
			//返回值规则跟之前是一样的
			TreeSet ts = new TreeSet<>((o1, o2)->{
					// 按照长度排序
					int i = o1.length() - o2.length();
					//如果一样长则按照首字母排序
					i = i == 0 ? o1.compareTo(o2) : i;
					return i;
			});

			//2.添加元素
			ts.add("c");
			ts.add("ab");
			ts.add("df");
			ts.add("qwer");

			//3.打印集合
			System.out.println(ts);
			}
			}
			
			
			
			import java.util.TreeSet;

			public class A07_TreeSetDemo4 {
			public static void main(String[] args) {
			/*  需求:创建5个学生对象
			属性:(姓名,年龄,语文成绩,数学成绩,英语成绩),
			按照总分从高到低输出到控制台
			如果总分一样,按照语文成绩排
			如果语文一样,按照数学成绩排
			如果数学成绩一样,按照英语成绩排
			如果英文成绩一样,按照年龄排
			如果年龄一样,按照姓名的字母顺序排
			如果都一样,认为是同一个学生,不存。

			第一种:默认排序/自然排序
			第二种:比较器排序

			默认情况下,用第一种排序方式,如果第一种不能满足当前的需求,采取第二种方式。


			课堂练习:
				要求:在遍历集合的时候,我想看到总分。

			*/


			//1.创建学生对象
			Student2 s1 = new Student2("zhangsan",23,90,99,50);
			Student2 s2 = new Student2("lisi",24,90,98,50);
			Student2 s3 = new Student2("wangwu",25,95,100,30);
			Student2 s4 = new Student2("zhaoliu",26,60,99,70);
			Student2 s5 = new Student2("qianqi",26,70,80,70);


			//2.创建集合
			TreeSet ts = new TreeSet<>();

			//3.添加元素
			ts.add(s1);
			ts.add(s2);
			ts.add(s3);
			ts.add(s4);
			ts.add(s5);

			//4.打印集合
			//System.out.println(ts);
			for (Student2 t : ts) {
				System.out.println(t);
			}
			}
			}
			
			
			
			public class Student implements Comparable{
			private String name;
			private int age;


			public Student() {
			}

			public Student(String name, int age) {
				this.name = name;
				this.age = age;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			public String toString() {
				return "Student{name = " + name + ", age = " + age + "}";
			}

			@Override
			//this:表示当前要添加的元素
			//o:表示已经在红黑树存在的元素

			//返回值:
			//负数:表示当前要添加的元素是小的,存左边
			//正数:表示当前要添加的元素是大的,存右边
			//0 :表示当前要添加的元素已经存在,舍弃
			public int compareTo(Student o) {
				System.out.println("--------------");
				System.out.println("this:" + this);
				System.out.println("o:" + o);
				//指定排序的规则
				//只看年龄,我想要按照年龄的升序进行排列
				return this.getAge() - o.getAge();
			}
			}
			
			
			
			public class Student2 implements Comparable {
			//姓名
			private String name;
			//年龄
			private int age;
			//语文成绩
			private int chinese;
			//数学成绩
			private int math;
			//英语成绩
			private int english;


			public Student2() {
			}

			public Student2(String name, int age, int chinese, int math, int english) {
				this.name = name;
				this.age = age;
				this.chinese = chinese;
				this.math = math;
				this.english = english;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			/**
			 * 获取
			 * @return chinese
			 */
			public int getChinese() {
				return chinese;
			}

			/**
			 * 设置
			 * @param chinese
			 */
			public void setChinese(int chinese) {
				this.chinese = chinese;
			}

			/**
			 * 获取
			 * @return math
			 */
			public int getMath() {
				return math;
			}

			/**
			 * 设置
			 * @param math
			 */
			public void setMath(int math) {
				this.math = math;
			}

			/**
			 * 获取
			 * @return english
			 */
			public int getEnglish() {
				return english;
			}

			/**
			 * 设置
			 * @param english
			 */
			public void setEnglish(int english) {
				this.english = english;
			}

			public String toString() {
				return "Student2{name = " + name + ", age = " + age + ", chinese = " + chinese + ", math = " + math + ", english = " + english + "}";
			}

		   /* 按照总分从高到低输出到控制台
			如果总分一样,按照语文成绩排
			如果语文一样,按照数学成绩排
			如果数学成绩一样,按照英语成绩排
			如果英文成绩一样,按照年龄排
			如果年龄一样,按照姓名的字母顺序排
			如果都一样,认为是同一个学生,不存。*/
			@Override
			public int compareTo(Student2 o) {
				int sum1 = this.getChinese() + this.getMath() + this.getEnglish();
				int sum2 = o.getChinese() + o.getMath() + o.getEnglish();

				//比较两者的总分
				int i = sum1 - sum2;
				//如果总分一样,就按照语文成绩排序
				i = i == 0 ? this.getChinese() - o.getChinese() : i;
				//如果语文成绩一样,就按照数学成绩排序
				i = i == 0 ? this.getMath() - o.getMath() : i;
				//如果数学成绩一样,按照英语成绩排序(可以省略不写)
				i = i == 0 ? this.getEnglish() - o.getEnglish() : i;
				//如果英文成绩一样,按照年龄排序
				i = i == 0 ? this.getAge() - o.getAge() : i;
				//如果年龄一样,按照姓名的字母顺序排序
				i = i == 0 ? this.getName().compareTo(o.getName()) : i;
				return i;
			}
		}
				
			
			
			public abstract class Animal {
			private String name;
			private int age;


			public Animal() {
			}

			public Animal(String name, int age) {
				this.name = name;
				this.age = age;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}


			public abstract void eat();

			public String toString() {
				return "Animal{name = " + name + ", age = " + age + "}";
			}
			}
			
			
			
			public abstract class Cat extends Animal{

			//1.继承抽象类,重写里面所有的抽象方法
			//2.本身Cat也是一个抽象的,让Cat的子类再重写重写方法

			//此时采取第二种处理方案
			//因为猫的两个子类中eat的方法体还是不一样的。
			}
			
			
			
			public abstract class Dog extends Animal{
			}
			
			
			
			public class HuskyDog extends Dog {
			@Override
			public void eat() {
				System.out.println("一只叫做" + getName() + "的," + getAge() + "岁的哈士奇,正在吃骨头,边吃边拆家");
			}
			}
			
			
			
			public class LiHuaCat extends Cat {
			@Override
			public void eat() {
				System.out.println("一只叫做" + getName() + "的," + getAge() + "岁的狸花猫,正在吃鱼");
			}
			}
			
			
			
			public class PersianCat extends Cat {
			@Override
			public void eat() {
				System.out.println("一只叫做" + getName() + "的," + getAge() + "岁的波斯猫,正在吃小饼干");
			}
			}
			
			
			
			public class TeddyDog extends Dog{
			@Override
			public void eat() {
				System.out.println("一只叫做"+getName()+"的,"+getAge()+"岁的泰迪,正在吃骨头,边吃边蹭");
			}
			}
			
			
			
			import java.util.ArrayList;

			public class Test1 {
				public static void main(String[] args) {
					/*
						需求:
							定义一个继承结构:
												动物
									 |                           |
									 猫                          狗
								  |      |                    |      |
							   波斯猫   狸花猫                泰迪   哈士奇


							 属性:名字,年龄
							 行为:吃东西
								   波斯猫方法体打印:一只叫做XXX的,X岁的波斯猫,正在吃小饼干
								   狸花猫方法体打印:一只叫做XXX的,X岁的狸花猫,正在吃鱼
								   泰迪方法体打印:一只叫做XXX的,X岁的泰迪,正在吃骨头,边吃边蹭
								   哈士奇方法体打印:一只叫做XXX的,X岁的哈士奇,正在吃骨头,边吃边拆家

						测试类中定义一个方法用于饲养动物
							public static void keepPet(ArrayList尖括号???> list){
								//遍历集合,调用动物的eat方法
							}
						要求1:该方法能养所有品种的猫,但是不能养狗
						要求2:该方法能养所有品种的狗,但是不能养猫
						要求3:该方法能养所有的动物,但是不能传递其他类型
					 */


					ArrayList list1 = new ArrayList<>();
					ArrayList list2 = new ArrayList<>();
					ArrayList list3 = new ArrayList<>();
					ArrayList list4 = new ArrayList<>();

					keepPet(list1);
					keepPet(list2);
					keepPet(list3);
					keepPet(list4);
				}

				//该方法能养所有的动物,但是不能传递其他类型
				public static void keepPet(ArrayList尖括号? extends Animal> list){
					//遍历集合,调用动物的eat方法
				}



			  /*  //  要求2:该方法能养所有品种的狗,但是不能养猫
				public static void keepPet(ArrayList尖括号? extends Dog> list){
					//遍历集合,调用动物的eat方法
				}*/


				/*//要求1:该方法能养所有品种的猫,但是不能养狗
				public static void keepPet(ArrayList尖括号? extends Cat> list){
					//遍历集合,调用动物的eat方法
				}*/
			}
			
			
单词