Java集合框架体系中有collection 和Map两个接口,collection主要有三个子接口(List,Queue,Set),List Set比较常用,其中List(序列)中的元素是有序的可以重复的,Set(集)无序且不能重复。List有一个很重要的实现类ArrayList,Set一个很重要的实现类HashSet 。Map一个很重要的实现类是HashMap.
collection中存储的是一个个独立的对象,Map内部提供的是一种映射关系entry<key,value>,value可重复,key不可。
一.关于List接口中的方法的增删改查
1.增加新元素:用add(Eadd(int index, E element),addAll(Collection<? extends E> c),addAll(int index,Collection<? extends E> c)
例如:
public class ListTest {
/*
* 用于存放备选课程的list
*/
public List coursesToSelect;
public ListTest(){
this.coursesToSelect = new ArrayList(); //实现类
}
/*
* 用于往courseToSelect中添加备选课程
*/
public void testAdd(){
//list里添加元素,用add(element),add(index,element),addAll(element),addAll(index,element);
//创建一个课程对象调用ADD方法,添加到备选课程List中去
//取出LIST的元素用get
Course cr1 = new Course("1","数据结构");
coursesToSelect.add(cr1);
//对象存入集合都变成Object类型取出时需要类型转换
Course temp = (Course)coursesToSelect.get(0);
System.out.println("添加了课程:"+temp.id+":"+temp.name);
Course cr2 = new Course("2","C语言");
coursesToSelect.add(1,cr2);
Course temp2 = (Course)coursesToSelect.get(1);
System.out.println("添加了课程:"+temp2.id+":"+temp2.name);
coursesToSelect.add(cr1);
//对象存入集合都变成Object类型取出时需要类型转换
Course temp0 = (Course)coursesToSelect.get(2);
System.out.println("添加了课程:"+temp0.id+":"+temp0.name);
/*
Course cr3 = new Course("3","test");
coursesToSelect.add(0,cr3);
Course temp3 = (Course)coursesToSelect.get(0);
System.out.println("添加了课程:"+temp3.id+":"+temp3.name);*/
Course[] course = {new Course("3","离散数学"),new Course("4","汇编语言")};
coursesToSelect.addAll(Arrays.asList(course));
Course temp3 = (Course)coursesToSelect.get(3);
Course temp4 = (Course)coursesToSelect.get(4);
System.out.println("添加两门课程:"+ temp3.id+":"+temp3.name+";"+
temp4.id+":"+temp4.name);
Course[] course2 = {new Course("5","高等数学"),new Course("6","大学英语")};
coursesToSelect.addAll(4, Arrays.asList(course2));
Course temp5 = (Course)coursesToSelect.get(4);
Course temp6 = (Course)coursesToSelect.get(5);
System.out.println("添加两门课程:"+ temp5.id+":"+temp5.name+";"+
temp6.id+":"+temp6.name);
}
2.查看集合中的元素:有三种:get,迭代器,foreach
public void testGet(){
int size = coursesToSelect.size();
System.out.println("有如下课程待选(普通循环):");
for(int i = 0 ; i < size ; i++){
Course cr = (Course)coursesToSelect.get(i);
System.out.println("课程"+cr.id+":"+cr.name);
}
}
/*
* 通过迭代器来遍历List iterator,迭代器不能存储,只是用来遍历,
*/
public void testIterator(){
Iterator it = coursesToSelect.iterator();
System.out.println("有如下课程待选(通过迭代器访问):");
while(it.hasNext()){
Course cr =(Course) it.next();
System.out.println("课程"+cr.id+":"+cr.name);
}
}
/*
* 通过for each方法访问集合元素
*/
public void testForEach(){
System.out.println("有如下课程待选(通过for each访问):");
for(Object obj:coursesToSelect){
Course cr = (Course) obj;
System.out.println("课程"+cr.id+":"+cr.name);
}
}
3.删除List中的元素,remove,removeAll
/*
* 删除List中的元素,remove removeAll
*/
public void testRemove(){
Course cr = (Course)coursesToSelect.get(2);
System.out.println("即将删除2,3位置上的课程");
Course[] courses = {(Course)coursesToSelect.get(2),(Course)coursesToSelect.get(3)};
coursesToSelect.removeAll(Arrays.asList(courses));
// coursesToSelect.remove(2); //coursesToSelect.remove(cr);两种删除方法
System.out.println("成功删除课程!");
testForEach();
}
/*
* 修改list中的元素,set(index,element);
*/
public void testModify(){
coursesToSelect.set(2, new Course("7","毛概"));
}
二.Set接口中的增删改查
1.增加,add与List基本相同, 注意addAll
当 在Set中重复添加元素时,并不能添加进去
Course[] course = {new Course("3","离散数学"),new Course("4","汇编语言")};
coursesToSelect.addAll(Arrays.asList(course));
Course temp3 = (Course)coursesToSelect.get(2);
Course temp4 = (Course)coursesToSelect.get(3);
/*System.out.println("添加两门课程:"+ temp3.id+":"+temp3.name+";"+
temp4.id+":"+temp4.name);*/
Course[] course2 = {new Course("5","高等数学"),new Course("6","大学英语")};
coursesToSelect.addAll(4, Arrays.asList(course2));
Course temp5 = (Course)coursesToSelect.get(4);
Course temp6 = (Course)coursesToSelect.get(5);
/*System.out.println("添加两门课程:"+ temp5.id+":"+temp5.name+";"+
temp6.id+":"+temp6.name); */
2.查询集中的元素
public void testForEach(){
System.out.println("有如下课程待选(通过for each访问):");
for(Object obj:coursesToSelect){
Course cr = (Course) obj;
System.out.println("课程"+cr.id+":"+cr.name);
}
}
三、关于泛型
集合中的元素可以是任意类型的对象(对象的引用),如果把某个对象放入集合,则会忽略它的类型,而把它当做Object处理。泛型则规定了某个集合只可以存放特定类型的对象,在编译器会对类型进行检查List<可以用的类型>,而不是执行之后才看到报错情况,另外,在foreach循环遍历时,若没有规定泛型,则如上,规定泛型以后可以这么写:
public void testForEach(){
for(Course cr :courses){
System.out.println(cr.id+":"+cr.name);
}
}
反省集合既可以存 入泛型类型的对象实例,又可以存入泛型子类型的对象实例。
1.房型集合中的限定类型不能使用基本数据类型
2可以通过使用包装类限定允许存入的基本数据类型
public void testBasicType(){
List<Integer>list = new ArrayList<Integer>();
list.add(1);
System.out.println("基本类型的包装类作为泛型:"+list.get(0));
}
四、关于Map接口&HashMap中的方法的增删改查
1.添加新元素,put(key,value)
public MapTest(){
this.students = new HashMap<String,Student>();
}
/*
* 测试添加:输入学生ID,判断是否被占用
* 若未被占用则输入姓名,创建新学生对象,并添加到students中
*/
public void testPut(){
Scanner console = new Scanner(System.in);
int i = 0;
while(i<3){
System.out.println("请输入学生ID");
String ID = console.next();
Student st = students.get(ID);
if(st == null)
{
System.out.println("请输入学生姓名");
String name = console.next();
Student newStudent = new Student(ID,name);
students.put(ID, newStudent);
System.out.println("成功添加学生:"+students.get(ID).name);
i++;
}else{
System.out.println("该学生ID已被占用");continue;
}
}
}
2.查询方法一:
keySet方法返回的是value值/*
* 测试Map的keySet方法
*/
public void testKeySet(){
//通过keySet方法,返回Map中所有键的Set集合
Set<String> keySet = students.keySet();
//取得students的容量
System.out.println("总共有 "+students.size()+"个学生");
//遍历keySet方法,取得每一个件,在调用get方法取得每个键对应的value
for(String stuId:keySet){
Student st = students.get(stuId);
if(st!=null){
System.out.println("学生:"+st.name);
}
}
}方法二:entrySet返回的是所有的键值对
/*
* 通过entrySet方法遍历Map
*/
public void testEntrySet(){
//通过entrySet方法,返回Map中的所有键值对
Set<Entry<String,Student>>entrySet = students.entrySet();
for(Entry<String,Student> entry:entrySet){
System.out.println("取得键"+entry.getKey());//取得KEY值
System.out.println("对应的值为"+entry.getValue().name);//取得value值
}
}
/*
* 测试删除Map中已有的映射
*/
public void testRemove(){
Scanner sc = new Scanner(System.in);
while(true){
//提示输入待删除学生的ID
System.out.println("输入待删除学生的ID");
String ID = sc.next();
Student st = students.get(ID);
if(st==null){
System.out.println("输入的ID不存在");
continue;
}else{
students.remove(ID);
System.out.println("成功删除学生"+st.name);
break;
}
}
}
4.修改
/*
* 利用put方法修改Map中的已有的映射
*/
public void testModify(){
System.out.println("请输入要修改的学生ID");
Scanner sc = new Scanner(System.in);
while(true){
String stuId = sc.next();
//查找是否有相应的ID对应的学生对象
Student student = students.get(stuId);
if(student == null){
System.out.println("ID不存在");
continue;
}
System.out.println("对应的学生名"+student.name);
System.out.println("请输入新的学生姓名:");
String name = sc.next();
Student newStudent = new Student(stuId,name);
students.put(stuId, newStudent);
System.out.println("修改成功");
break;
}
}