课中:
理论课:
- 泛型的本质就是”数据类型的参数化”我们可以把"泛型”理解为数据类型的一个占位符形式参数,即告诉编译器, 在调用泛型时必须传入实际类型。
- 泛型相当于标签。
java.lang.Object
java.utilAbstractCollection<E>
java.util.AbstractList<E>
java.util.ArrayList<E>
ArrayList aa = new ArrayList();//aa就是一个容器
aa. add(new Dog());//将一个狗对象存到容器中
aa.add(12);//12会自动装箱成一个Integer对象
class MyArrayList<E> {
0bject[] obj = new 0bject[10];
public void set(E o, int index) {
obj [index] = 0 ;
}
public object get(int index) {
return (E)obj [index] ;//强制向下转型
}
}
- 容器里面有List和set继承,List有ArrayList继承。
实验课:
这节课老师讲了Ch8Demo1,然后接下来的时间由我们自己做,老师讲解完第一题后,我发现后面有几题也很简单了。
package ch8;
import java.util.HashSet;
import java.util.Set;
/*
* 2.编写程序Ch8Demo1类
编写一个人的类,有属性:姓名,年龄。
构造方法:设定姓名,年龄
普通方法:显示此人的信息(姓名,年龄)
姓名及年龄相同的人是同一个人
年龄大的人比年龄小的人大
编写一个狗的类,内容和人类相同
编写一个测试的main方法,定义一个容器类(set),放入三个人,两条狗,实现增加及移除输出容器类的信息。
*/
public class Ch8Demo1 {
public static void main(String[] args) {
Set s1 = new HashSet();//创建一个容器
s1.add(new person("zhangsan",11));
s1.add(new person("lisi",12));
s1.add(new person("wangwu",13));
s1.add(new dog("huahua",3));
s1.add(new dog("xixi",5));
System.out.println(s1);
s1.remove(new person("wangwu",13));
System.out.println(s1);
}
}
class person implements Comparable<person>{//用Comparable来比较是否是同一个人
private String name;
private int age;
public person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name=" + name + ", age=" + age ;
}
@Override
public int hashCode() {//增加这个方法在写容器Set输出时不会乱序。
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {//用equals方法来比较是否是同一个人
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
person other = (person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(person arg0) {
if(this.age>arg0.age) {
return 1;
}else if(this.age>arg0.age) {
return 0;
}else {
return -1;
}
}
}
class dog implements Comparable<dog>{//和person类完全一样,只是将名字修改了一下
private String name;
private int age;
public dog(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name=" + name + ", age=" + age ;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
dog other = (dog) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public int compareTo(dog arg0) {
if(this.age>arg0.age) {
return 1;
}else if(this.age>arg0.age) {
return 0;
}else {
return -1;
}
}
}
如果Set里面有两个类,那么结果是乱序,如果只有一个类且有Hashcode这个方法,结果是有序的,如果是List,不用Hashcode方法结果也是有序的。
老师讲解第1题后,2、3、4、5题都是比较简单的了。
预习:
- Stack
- Set
- Map
- Queue:PriorityQueue
- Collection 和Iterator
- Foreach和迭代器:适配器方法惯用法
- 完整的容器分类法
总结:
这周我们初步学习了容器,了解了泛型及容器的一些概念,还有简单的应用,在这同时,我们也学习了怎么更方便的去比较两个相同的人,用了Comparable这个方法。在这周的两节课中,老师都给我们强调了数据结构的重要性,我们这章和数据结构关联比较大,所以我们要更加好好学习数据结构了。