老師,為什么遍歷Set集合里的元素,一直都是有序的輸出呢?
package com.imooc.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import javax.swing.text.Style;
public class SetTest {
public List<Course> coursesToSelect;
private Scanner console;
public Student stu;
public SetTest(){
this.coursesToSelect=new ArrayList<Course>(); ? //初始化
this.console=new Scanner(System.in);
}
/**
* 用于往coursesToSelect中添加備選課程
*/
public void testAdd(){
//創(chuàng)建一個(gè)課程對(duì)象,并通過調(diào)用add方法,添加到備選課程List中
Course cr1=new Course("1","數(shù)據(jù)結(jié)構(gòu)");
coursesToSelect.add(cr1);
Course temp=(Course)coursesToSelect.get(0);
//System.out.println("添加了課程:"+temp.getId()+":"+temp.getName());
Course cr2=new Course("2","C語言");
coursesToSelect.add(0, cr2);
Course temp2=(Course)coursesToSelect.get(0);
//System.out.println("添加了課程:"+temp2.getId()+":"+temp2.getName());
//證明數(shù)據(jù)可重復(fù)
// coursesToSelect.add(cr1);
// Course temp0=(Course)coursesToSelect.get(2);
// System.out.println("添加了課程:"+temp0.getId()+":"+temp0.getName());
Course[] course={new Course("3","離散數(shù)學(xué)"),new Course("4","匯編語言")};
coursesToSelect.addAll(Arrays.asList(course));
Course temp3=(Course)coursesToSelect.get(2);
Course temp4=(Course)coursesToSelect.get(3);
//System.out.println("添加了兩門課程:"+temp3.getId()+":"+temp3.getName()+";"+temp4.getId()+":"+temp4.getName());
Course[] course2={new Course("5","高等數(shù)學(xué)"),new Course("6","大學(xué)英語")};
coursesToSelect.addAll(2, Arrays.asList(course2));
Course temp5=(Course)coursesToSelect.get(2);
Course temp6=(Course)coursesToSelect.get(3);
//System.out.println("添加了兩門課程:"+temp5.getId()+":"+temp5.getName()+";"+temp6.getId()+":"+temp6.getName()+"\n");
}
/**
* 通過for each方法訪問集合元素
* @param args
*/
public void testForEach(){
System.out.println("\n"+"有如下課程待選(通過for each訪問):");
for(Object obj : coursesToSelect){
Course cr=(Course)obj;
System.out.println("課程:"+cr.getId()+":"+cr.getName());
}
}
/**
* 測(cè)試List的contains方法
*/
public void testListContains(){
//獲取備選課程序列的第0個(gè)元素
Course course=coursesToSelect.get(0);
//打印輸出coursesToSelect是否包含該course對(duì)象
System.out.println("取得課程:"+course.getName());
System.out.println("備選課程中是否包含該課程:"+course.getName()+","+coursesToSelect.contains(course));//運(yùn)行測(cè)試
//創(chuàng)建一個(gè)新課程對(duì)象,ID和名稱與course完全相同 ? ?
//(但它們是兩個(gè)完全不同的對(duì)象,course2并不包含在序列中,所以結(jié)果為false)
//若要為true,則只需重寫equals()方法即可
Course course2=new Course(course.getId(),course.getName());
System.out.println("新創(chuàng)建的課程:"+course2.getName());
System.out.println("備選課程中是否包含該課程:"+course2.getName()+","+coursesToSelect.contains(course2));//運(yùn)行測(cè)試
//現(xiàn)在要求從鍵盤接收一個(gè)課程名稱
System.out.println("輸入一個(gè)課程名稱:");
String name=console.next();
Course course3=new Course();
course3.setName(name);
System.out.println("備選課程中是否包含該課程:"+course3.getName()+","+coursesToSelect.contains(course3));//運(yùn)行測(cè)試
if(coursesToSelect.contains(course3)){
System.out.println("課程為:"+course3.getName()+" 的索引位置為:"+coursesToSelect.indexOf(course3));
}
}
//創(chuàng)建學(xué)生對(duì)象并選課
public void createStudentAndSelectCourse(){
//創(chuàng)建一個(gè)學(xué)生對(duì)象
stu = new Student("1", "小明");
System.out.println("歡迎學(xué)生:"+stu.getName()+"來選課!");
//循環(huán)接收3次輸入的數(shù)據(jù),存到學(xué)生信息的courses中去
for(int i=0;i<3;i++){
System.out.println("請(qǐng)輸入要選擇的課程ID:");
//從鍵盤接收用戶輸入的課程ID
String courseId=console.next();
for(Course cr : coursesToSelect){
if(cr.getId().equals(courseId)){
stu.courses.add(cr);
//Set中添加某個(gè)對(duì)象,無論加多少次,
//最終只會(huì)保留一個(gè)該對(duì)象(的引用),
//并且保留的是第一次添加的那個(gè)
//stu.courses.add(cr);
}
}
}
}
/**
* 測(cè)試Set的contains方法
*/
public void testSetContains(){
System.out.println("請(qǐng)輸入該學(xué)生已選的課程名稱:");
String name=console.next();
Course course=new Course();
course.setName(name);
System.out.println("備選課程中是否包含該課程:"+course.getName()+","+stu.courses.contains(course));//運(yùn)行測(cè)試
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SetTest st=new SetTest();
st.testAdd();
st.testListContains();
st.testForEach();
// st.createStudentAndSelectCourse();
// st.testSetContains();
// st.testForEachForSet(stu);
}
/**
* 打印輸出學(xué)生所選課程,證明無序
*/
public void testForEachForSet(Student stu){
System.out.println("共選擇了:"+stu.courses.size()+"門課程");
for(Course cr : stu.courses){
System.out.println("選擇了課程"+cr.getId()+":"+cr.getName());
}
}
}
2018-07-27
可能你的set集合里迭代出來的序列與List集合迭代的序列是一樣的。你可以輸出一下set集合里對(duì)象的每個(gè)hashcode值來驗(yàn)證一下。具體百度set集合存儲(chǔ)原理和map集合存儲(chǔ)原理。
2018-07-16
你的student類額