泛型案例实操
练习一:用泛型集合存储自定义学生对象,并遍历
//Student.java
package com.generic.demo;
public class Student {
private String name;
private int age;
public Student(String name, int i) {
super();
this.name = name;
this.age = i;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name= " + name + ", age= " + age + "]";
}
}
//GenericTest.java
package com.generic.demo;
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student>();
//创建学生对象
Student stu1 = new Student("张三", 18);
Student stu2 = new Student("李四", 19);
Student stu3 = new Student("王五", 20);
Student stu4 = new Student("赵六", 21);
//添加到集合中
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
//迭代集合
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
***执行结果:***
Student [name= 张三, age= 18]
Student [name= 李四, age= 19]
Student [name= 王五, age= 20]
Student [name= 赵六, age= 21]
练习二:用泛型集合存储自定义学生对象,并去掉重复的学生对象
//Student.java
//同上
//GenericTest2.java
package com.generic.demo;
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest2 {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student>();
//创建学生对象
Student stu1 = new Student("张三", 18);
Student stu2 = new Student("李四", 19);
Student stu3 = new Student("王五", 20);
Student stu4 = new Student("王五", 20);
Student stu5 = new Student("赵六", 21);
//添加到集合中
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
list.add(stu5);
//去重
ArrayList<Student> list2 = new ArrayList<Student>();
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()) {
Student stu = iterator.next();
if(!list2.contains(stu)) {
list2.add(stu);
}
}
//迭代集合list2
Iterator<Student> iterator2 = list.iterator();
while(iterator2.hasNext()) {
System.out.println(iterator2.next());
}
}
}
***执行结果:***
Student [name= 张三, age= 18]
Student [name= 李四, age= 19]
Student [name= 王五, age= 20]
Student [name= 王五, age= 20]
Student [name= 赵六, age= 21]
一、发现问题:
- 对于自定义学生对象,代码并没有达到去重的效果
二、寻找原因:
- 通过查看contains方法的源码
- 源码查看方式参考文章《Java集合框架——迭代器》中查看迭代器源码的方法
- 下图分别是contains方法以及indexOf方法的实现
三、分析问题:
- contains方法底层依赖的是equals方法,而没有重写的equals方法是从Object类继承过来的,比较的时候比较的是两个对象的逻辑内存地址
- 代码中每个stu对象都是通过new运算符创建出来的Student类型对象,每创建一个Student类型对象就会在堆内存中申请一个对象的空间,所以即使stu3和stu4在人为规定上是相同的,但是其内存地址是不同的,故在使用contains下的equals方法比较时无法检测出重复元素
四、解决问题:
- 手动重写(其实是eclipse自动生成)学生类的equals方法
- 重写方法:
- 在代码区空白处右键选择Source → Generate hashCode() and equals()
- 由于此处不需要重写hashCode()方法,故直接删除hashCode保留equals即可
五、完整代码:
//Student.java
package com.generic.demo;
public class Student {
private String name;
private int age;
public Student(String name, int i) {
super();
this.name = name;
this.age = i;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name= " + name + ", age= " + age + "]";
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) 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;
}
}
//GenericTest2.java
package com.generic.demo;
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest2 {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student>();
//创建学生对象
Student stu1 = new Student("张三", 18);
Student stu2 = new Student("李四", 19);
Student stu3 = new Student("王五", 20);
Student stu4 = new Student("王五", 20);
Student stu5 = new Student("赵六", 21);
//添加到集合中
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
list.add(stu5);
//去重
ArrayList<Student> list2 = new ArrayList<Student>();
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()) {
Student stu = iterator.next();
if(!list2.contains(stu)) {
list2.add(stu);
}
}
//迭代集合list2
Iterator<Student> iterator2 = list.iterator();
while(iterator2.hasNext()) {
System.out.println(iterator2.next());
}
}
}
***执行结果:***
Student [name= 张三, age= 18]
Student [name= 李四, age= 19]
Student [name= 王五, age= 20]
Student [name= 赵六, age= 21]