Studentstud=(Student)students、get(i);
if(stud、getAge()==age)
studs、add(stud);
}
returnstuds;
}
3、使用Map管理对象集合
1)新建一个包MapExample
2)在这个包中新建三个类:
Student类,StudentMap类,StudentMapTest类。
参考代码Student、java,StudentMap、java,StudentMapTest、java
3)完善上面三个类,相关要求参考源代码程序的注释,即根据要求修改源代码程序,给出具体的实现代码(不使用泛型类)。
voiddeleteStudentByName(Stringname){//根据学生姓名删除学生对象
Collectionvalues=students、values();
Iteratorit=values、iterator();
while(it、hasNext()){
if(it、next()、getName()、equals(name))
it、remove();
}
}
voiddeleteStudentByAge(intage){//根据学生年龄删除学生对象
Collectionvalues=students、values();
Iteratorit=values、iterator();
while(it、hasNext()){
if(it、next()、getAge()==age)
it、remove();
}
}
Student[]findByName(Stringname){
inta=0;
Collectionvalues=students、values();
Iteratorit=values、iterator();
while(it、hasNext()){
if(it、next()、getName()、equals(name))
a++;
}
intb=0;
Student[]s=newStudent[a];
Collectionvalues1=students、values();
Iteratorit1=values1、iterator();
while(it1、hasNext()){
Studentss=it1、next();
if(ss、getName()、equals(name))
{s[b]=ss;
b++;
}
}
returns;
}
Student[]findByAge(intage){
inta=0;
Collectionvalues=students、values();
Iteratorit=values、iterator();
while(it、hasNext()){
if(it、next()、getAge()==age)
a++;
}
intb=0;
Student[]s=newStudent[a];
Collectionvalues1=students、values();
Iteratorit1=values1、iterator();
while(it1、hasNext()){
Studentss=it1、next();
if(ss、getAge()==age)
{s[b]=ss;
b++;
}
}
returns;
}
4)新创建MapExample2包,重新设计设计上述程序(新程序都属于这个包),这时需要使用泛型类,即出现的Map、TreeMap或HashMap都使用泛型。
privateMapstudents=newHashMap();
voidaddStudent(Studentstudent){//添加一个学生对象
students、put(newInteger(student、getId()),student);
}
StudentfindById(Stringid){
returnstudents、get(newInteger(id));
}
4、使用Set管理对象集合
1)新建一个包SetExample
2)在这个包中新建三个类:
Student类,StudentSet类,StudentSetTest类。
参考代码:
这三个类的参考代码见Student、java,StudentSet、java,StudentSetTest、java
3)完善上面三个类,相关要求参考源代码程序的注释,即根据要求修改源代码程序,给出具体的实现代码(不使用泛型类)。
voiddeleteStudentById(Stringid){//根据学号删除学生对象
for(inti=0;iStudentstud=(Student)students、toArray()[i];
if(stud、getId()、equalsIgnoreCase(id))
students、remove(stud);
}
}
voiddeleteStudentByName(Stringname){//根据姓名删除学生对象
for(inti=0;iStudentstud=(Student)students、toArray()[i];
if(stud、getName()、equalsIgnoreCase(name))
students、remove(stud);
}
}
voiddeleteStudentByAge(intage){//根据年龄删除学生对象
for(inti=0;iStudentstud=(Student)students、toArray()[i];
if(stud、getAge()==age)
students、remove(stud);
}
}
Student[]findByName(Stringname){
inta=0;
for(inti=0;iStudentstud=(Student)students、toArray()[i];
if(stud、getName()、equalsIgnoreCase(name))
a++;
}
Student[]st=newStudent[a];
intb=0;
for(inti=0;iStudentstud=(Student)students、toArray()[i];
if(stud、getName()、equalsIgnoreCase(name))
{
st[b]=stud;
b++;}
}
returnst;
}
Student[]findByAge(intage){
inta=0;
for(inti=0;iStudentstud=(Student)students、toArray()[i];
if(stud、getAge()==age)
a++;
}
Student[]st=newStudent[a];
intb=0;
for(inti=0;iStudentstud=(Student)students、toArray()[i];
if(stud、getAge()==age)
{st[b]=stud;
b++;}
}
returnst;
}
4)新创建SetExample2包,重新设计设计上述程序(新程序都属于这个包),这时需要使用泛型类,即出现的Set、TreeSet或HashSet都使用泛型。
注意:
Student类实现Comparable接口的作用。
voiddeleteStudentById(Stringid){//根据学号删除学生对象
Iteratorit=students、iterator();
while(it、hasNext()){
if(it、next()、getId()、equalsIgnoreCase(id))
it、remove();
}
}
voiddeleteStudentByName(Stringname){//根据姓名删除学生对象
Iteratorit=students、iterator();
while(it、hasNext()){
if(it、next()、getName()、equalsIgnoreCase(name))
it、remove();
}
}
voiddeleteStudentByAge(intage){//根据年龄删除学生对象
Iteratorit=students、iterator();
while(it、hasNext()){
if(it、next()、getAge()==age)
it、remove();
}
publicclassStudentimplementsComparable//实现Comparable接口对于TreeSet排序有用
{
publicintcompareTo(Objectarg0){
Studentstud=(Student)arg0;
returnthis、getId()、compareTo(stud、getId());
}
实现就是自定义排序功能
5、设计一个自定义的集合类
四、实验结果与分析
1、请说明采用接口变量操作集合对象的方式,并阐述这么做的主要优点。
提示:
在“使用List管理对象集合”的实验中,LinkedList、ArrayList两个类都可以管理一批对象,但就是程序中使用List接口变量引用LinkedList、ArrayList对象,即使用如下方式:
privateListstudents=newArrayList();
而不就是直接使用LinkedList、ArrayList类型变量,比如:
privateArrayListstudents=newArrayList();
这样做有什么用意,有什么好处?
这就是一种很好的设计模式、一个接口有多种实现,这种写法就是java面向对象的一种思想,依赖倒置原则,即依赖于抽象不依赖于实现(具体)。
给调用者提供的应该就是接口或者抽象类,而实现者可以实现或者继承接口或者抽象类来满足调用者,这样调用者不必知道实现者怎样操作,实现者也可以根据具体情况去实现,这样去除了耦合。
这就就是java设计模式的基础思想之一。
从Java语法上,这种方式就是使用接口引用指向具体实现,这样大大提高了代码使用的灵活性。
2、请说明LinkedList、ArrayList有何不同,各自适用于哪些场合?
LinkedList:
采用链表来管理集合的元素。
优点就是可以方便地进行元素的增加,删除。
即元素个数变化的代价较小,但就是查询性能比数组差。
ArrayList:
使用可变长度的数组来管理集合的元素。
优点就是查询性能比链表好,缺点就是长度不可变化,删除元素代价大。
LinkedList适用于元素增加删除频繁的场合。
ArrayList适用于查询元素较频繁的场合
3、请说明HashSet,TreeSet有何不同,各自适用于哪些场合?
1、TreeSet中的数据就是自动排好序的,不允许放入null值
2、HashSet中的数据就是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束
3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,就是以hashcode码作为标识的,而具有相同内容的String对象,hashcode就是一样,所以放入的内容不能重复。
但就是同一个类的对象可以放入不同的实例
4、请说明HashMap、TreeMap有何不同,各自适用于哪些场合?
HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果您需要得到一个有序的结果您就应该使用TreeMap(HashMap中元素的排列顺序就是不固定的)。
5、Iterator与For循环都可以用于遍历集合中的元素,请问有何不同之处。
Iterator:
通用,对于所有集合,使用Iterator性能都一样,客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,就是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
客户端从不直接与集合类打交道,它总就是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
For循环:
虽然与Iterator性能差不多,但就是在查找链表如LinkedList的时候遍历集合的开销会差别很大!
就以LinkedList来说,用get(i)方法来取元素的主要代码,我们可以瞧到,LinkedList内的get(i)方法,用了循环方式来返回元素,性能肯定会差、
6.简单地分析比较不同集合类在选用上的主要原则。
List接口可以存储重复的数据。
并且可以基于位置(下标)操作集合。
当增删改频繁的时候用LinkedList。
当查询频繁时用ArrayList
Map接口类似数学中的映射。
对象的管理就是一组键-值得映射关系。
主要就是适用于数量较多的对象管理。