原CSDN博客已弃用,文章会逐渐迁移过来。

转帖请注明本文出自weimeig的博客(http://mp.blog.csdn.net/postedit/79533661),请尊重他人的辛勤劳动成果,谢谢

应朋友们反馈的JAVA基础薄弱的问题,决定出一套完整的JAVA基础教程,帮助大家复习,巩固JAVA基础,今天要讲的是JAVA中的集合框架。

/** 
 * 学生类 
 * @author Administrator 
 * 
 */  
public class Student {  
    private String id;  
    private String name;  
    private Set course;  
    private Student(String id,String name){  
        this.id = id;  
        this.name = name;  
        this.course = new HashSet();      
    }  
    public String getId() {  
        return id;  
    }  
    public void setId(String id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public Set getCourse() {  
        return course;  
    }  
    public void setCourse(Set course) {  
        this.course = course;  
    }  
}  

/** 
 * 课程类 
 * @author Administrator 
 * 
 */  
public class Course {  
    private String id;  
    private String name;  
    Course(String id,String name){  
        this.id=id;  
        this.name=name;  
    }  
    public String getId() {  
        return id;  
    }  
    public void setId(String id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
}  

单个元素的插入

import java.util.ArrayList;  
import java.util.List;  

/** 
 * 备选课程类 
 * @author Administrator 
 * 
 */  
public class ListTest {  
    /** 
     * 用于存放备选课程的List 
     */  
    public List coursesToSelect;  
    public ListTest(){  
        this.coursesToSelect = new ArrayList();   
    }  

    /** 
     * 用于往coursesToSelect中添加备选课程 
     */  
    public void testAdd(){  
        Course cr1 = new Course("1","数据结构");//new一个Course类的数据类型  
        coursesToSelect.add(cr1);//所为一条数据插入List中  
        Course temp = (Course)coursesToSelect.get(0);//获取LIst中的第一条数据,课程存入集合都变成Object类型,取出时需要类型转换  
        System.out.println("添加了课程:" + temp.getId() + temp.getName());  
    }  
    public static void main(String [] args)  
    {  
        ListTest lt = new ListTest();  
        lt.testAdd();  
    }  
}  

多个元素的同时插入
数组的集合插入,由单个元素的add方法,变成addAll方法

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  

/** 
 * 备选课程类 
 * @author Administrator 
 * 
 */  
public class ListTest {  
    /** 
     * 用于存放备选课程的List 
     */  
    public List coursesToSelect;  
    public ListTest(){  
        this.coursesToSelect = new ArrayList();   
    }  

    /** 
     * 用于往coursesToSelect中添加备选课程 
     */  
    public void testAdd(){  
        Course cr1 = new Course("1","数据结构");//new一个Course类的数据类型  
        coursesToSelect.add(cr1);//所为一条数据插入List中  
        Course temp = (Course)coursesToSelect.get(0);//获取LIst中的第一条数据  
        System.out.println("添加了课程:" + temp.getId() + ":" + temp.getName());  

        Course cr2 = new Course("2","C语言");  
        coursesToSelect.add(0, cr2); //两个参数的add方法,选择插入元素的位置  
        Course temp2 = (Course) coursesToSelect.get(0);//将元素插入到第一条  
        System.out.println("添加了课程:" + temp2.getId() + ":" + temp2.getName());//观察打印的第一条的值  

//      以下方法会抛出数组下标越界异常  
//      Course cr3 = new Course("3","test");  
//      coursesToSelect.add(4, cr3); //插入位置大于容量,数组下标越界  

        /** 
         * 多个元素的同时插入 
         */  
        Course[] course = {new Course("3","离散数学"), new Course("4","汇编语言")};  
        coursesToSelect.addAll(Arrays.asList(course));  //添加数组用addAll  
        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","高等数学"),new Course("6","大学英语")};  
        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());  

    }  
    public static void main(String [] args)  
    {  
        ListTest lt = new ListTest();  
        lt.testAdd();  
    }  
}  

查询元素的三种写法

    /** 
 * 取得List中的元素的方法 
 * @param args 
 */  
public void testGet(){  
    int size = coursesToSelect.size();//创建一个Size变量用来接收Lisr的长度  
    System.out.println("有如下课程可选:");  
    for(int i=0;i<coursesToSelect.size();i++){  
        Course cr = (Course) coursesToSelect.get(i);  
        System.out.println("课程:" + cr.getId() + ":" +  cr.getName());  
    }  
}  
/** 
 * 通过迭代器来遍历List 
 * @param args 
 */  
public void testIterator(){  
    //通过集合的方法,取得迭代器的实例。  
    Iterator it = coursesToSelect.iterator();  
    System.out.println("有如下课程可选(通过迭代器访问):");  
    while (it.hasNext()) {//it.hasNext如果含有元素就返回真值  
        Course cr = (Course)it.next();  
        System.out.println("课程:" + cr.getId() + ":" + cr.getName());  
    }  
}  
/** 
 * 通过for each方法访问集合元素 
 * 迭代器的简便写法 
 * @param args 
 */  
public void testForEach(){  
    System.out.println("有如下课程可选(通过for each访问):");  
    for(Object obj:coursesToSelect){//去遍历coursesToSelect集合中的每一个元素,把它取出来作为Object的一个变量  
        //(当一个元素存入到集合中的时候,他的类型是被忽略了的,集合只是拿他当Object用),当取出来的时候也是一个Object,因此  
        Course cr =(Course)obj;//当他取出来后,需要做强转  
        System.out.println("课程:" + cr.getId() + ":" + cr.getName());  
    }  
}  

main函数中调用

ListTest lt = new ListTest();  
lt.testGet();  
lt.testIterator();  
lt.testForEach();  

修改元素

/** 
 * 修改List中的元素 
 * @param args 
 */  
public void testModify(){  
    coursesToSelect.set(4, new Course("7","毛概"));//设置4位置的元素为:7,毛概  
}  

删除元素

        /** 
     * 删除List中的元素 
     * @param args 
     */  
    public void testRemove(){  
//      Course cr = (Course) coursesToSelect.get(4);  
//      System.out.println("我是课程:" + cr.getId() + ":" +cr.getName() + "我即将被删除");  
//      coursesToSelect.remove(cr);  
        System.out.println("即将删除4位置上的课程!");  
        coursesToSelect.remove(4);  
        System.out.println("成功删除课程!");  
        testForEach();//调用前面写的遍历方法遍历数据  
        /** 
         * 同时删除多行时 
         */  
//      System.out.println("即将删除4位置和5位置上的课程!");  
//      Course[] courses = {(Course) coursesToSelect.get(4),(Course) coursesToSelect.get(5)};//新建一个课程的数组将4位置和5位置的元素  
//      //加入到数组中  
//      coursesToSelect.removeAll(Arrays.asList(courses));///调用removeAll方法,通过asList工具类,把courses数组转化为集合作为参数传递进去  
//      testForEach();//调用前面写的遍历方法遍历数据  
    }  

main函数中调用

ListTest lt = new ListTest();  
lt.testRemove();  

小节ListTest类完整代码

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.Iterator;  
import java.util.List;  

/** 
 * 备选课程类 
 * @author Administrator 
 * 
 */  
public class ListTest {  
    /** 
     * 用于存放备选课程的List 
     */  
    public List coursesToSelect;  
    public ListTest(){  
        this.coursesToSelect = new ArrayList();   
    }  

    /** 
     * 用于往coursesToSelect中添加备选课程 
     */  
    public void testAdd(){  
        Course cr1 = new Course("1","数据结构");//new一个Course类的数据类型  
        coursesToSelect.add(cr1);//所为一条数据插入List中  
        Course temp = (Course)coursesToSelect.get(0);//获取LIst中的第一条数据  
        System.out.println("添加了课程:" + temp.getId() + ":" + temp.getName());  

        Course cr2 = new Course("2","C语言");  
        coursesToSelect.add(0, cr2); //两个参数的add方法,选择插入元素的位置  
        Course temp2 = (Course) coursesToSelect.get(0);//将元素插入到第一条,对象存入集合都变成Object类型,取出时需要类型转换  
        System.out.println("添加了课程:" + temp2.getId() + ":" + temp2.getName());//观察打印的第一条的值  

        coursesToSelect.add(cr1);//所为一条数据插入List中  
        Course temp0 = (Course)coursesToSelect.get(2);//获取LIst中的第一条数据  
        System.out.println("添加了课程:" + temp0.getId() + ":" + temp0.getName());  

//      以下方法会抛出数组下标越界异常  
//      Course cr3 = new Course("3","test");  
//      coursesToSelect.add(4, cr3); //插入位置大于容量,数组下标越界  

        Course[] course = {new Course("3","离散数学"), new Course("4","汇编语言")};  
        coursesToSelect.addAll(Arrays.asList(course));  //添加数组用addAll  
        Course temp3 = (Course) coursesToSelect.get(3);  
        Course temp4 = (Course) coursesToSelect.get(4);  

        System.out.println("添加了两门课程:" + temp3.getId() + ":" + temp3.getName() +  
                ";" + temp4.getId() + ":" + temp4.getName());  

        //按位置插入  

        Course[] course2 = {new Course("5","高等数学"),new Course("6","大学英语")};  
        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());  

    }  
    /** 
     * 取得List中的元素的方法 
     * @param args 
     */  
    public void testGet(){  
        int size = coursesToSelect.size();//创建一个Size变量用来接收Lisr的长度  
        System.out.println("有如下课程可选:");  
        for(int i=0;i<coursesToSelect.size();i++){  
            Course cr = (Course) coursesToSelect.get(i);  
            System.out.println("课程:" + cr.getId() + ":" +  cr.getName());  
        }  
    }  
    /** 
     * 通过迭代器来遍历List 
     * @param args 
     */  
    public void testIterator(){  
        //通过集合的方法,取得迭代器的实例。  
        Iterator it = coursesToSelect.iterator();  
        System.out.println("有如下课程可选(通过迭代器访问):");  
        while (it.hasNext()) {//it.hasNext如果含有元素就返回真值  
            Course cr = (Course)it.next();  
            System.out.println("课程:" + cr.getId() + ":" + cr.getName());  
        }  
    }  
    /** 
     * 通过for each方法访问集合元素 
     * 迭代器的简便写法 
     * @param args 
     */  
    public void testForEach(){  
        System.out.println("有如下课程可选(通过for each访问):");  
        for(Object obj:coursesToSelect){//去遍历coursesToSelect集合中的每一个元素,把它取出来作为Object的一个变量  
            //(当一个元素存入到集合中的时候,他的类型是被忽略了的,集合只是拿他当Object用),当取出来的时候也是一个Object,因此  
            Course cr =(Course)obj;//当他取出来后,需要做强转  
            System.out.println("课程:" + cr.getId() + ":" + cr.getName());  
        }  
    }  
    /** 
     * 修改List中的元素 
     * @param args 
     */  
    public void testModify(){  
        coursesToSelect.set(4, new Course("7","毛概"));//设置4位置的元素为:7,毛概  
    }  
    /** 
     * 删除List中的元素 
     * @param args 
     */  
    public void testRemove(){  
//      Course cr = (Course) coursesToSelect.get(4);  
//      System.out.println("我是课程:" + cr.getId() + ":" +cr.getName() + "我即将被删除");  
//      coursesToSelect.remove(cr);  
        System.out.println("即将删除4位置上的课程!");  
        coursesToSelect.remove(4);  
        System.out.println("成功删除课程!");  
        testForEach();//调用前面写的遍历方法遍历数据  
        /** 
         * 同时删除多行时 
         */  
//      System.out.println("即将删除4位置和5位置上的课程!");  
//      Course[] courses = {(Course) coursesToSelect.get(4),(Course) coursesToSelect.get(5)};//新建一个课程的数组将4位置和5位置的元素  
//      //加入到数组中  
//      coursesToSelect.removeAll(Arrays.asList(courses));///调用removeAll方法,通过asList工具类,把courses数组转化为集合作为参数传递进去  
//      testForEach();//调用前面写的遍历方法遍历数据  
    }  
    public static void main(String [] args)  
    {  
        ListTest lt = new ListTest();  
        lt.testAdd();  
        lt.testGet();  
        lt.testIterator();  
        lt.testForEach();  
        lt.testModify();  
        lt.testForEach();  
        lt.testRemove();  
    }  
}  

那么,能否向集合中添加一些奇怪的元素呢?

    /** 
 * 往集合中添加一些奇怪的东西 
 * @param args 
 */  
public void testType(){  
    System.out.println("能否往List中添加一些奇怪的东西呢?");  
    coursesToSelect.add("我不是课程,我只是一个无辜的字符串!!");  
}  

调用

public static void main(String [] args)  
{  
    ListTest lt = new ListTest();  
    lt.testAdd();  
    lt.testType();  
    lt.testForEach();  
}  

很明显,抛出了异常。

那么,有没有一种方法可以控制数据的类型呢?

答案肯定是有的,那就是JAVA中的,泛型

下章泛型学习:http://blog.csdn.net/weimeig/article/details/79535182

伪代码助记

class TestList{  
    private List<Course> course;  
    //构造函数初始化  
    public TestList(){  
        this.course = new ArrayList<Course>();  
    }  
    //增加  
    public void add(){  
        course.add(new Course("1","课程"));  
    }  
    //删除  
    public void remove(){  
        course.remove(1);  
    }  
    //修改  
    public void set(){  
        course.set("1",new Course("1","课程"));  
    }  
    //查询  
    public void ForEach(){  
//      for(Object obj:course){  
//          Course cr = (Course)obj;  
//      }  
        for(Course cr:course){}  
    }  

    public static void main(String[] args){}  
}