集合相当于一个购物车,具有相同属性的存放在一起。Java中的集合类是一个工具类就像容器,储存任意数量的具有共同属性的对象。
集合在类内部进行有序的组织,加快了增删查的速度。
Java主要的集合框架:
对于Collection 来说,它里面存放的对象都是单个存在的,就像是单身宿舍,然然而杜宇Map来说,它里面的对象都是成对出现的都会已键值对的方式存在。
一. List接口及其实现类
List 是元素有序并且可以重复的一个集合,被称为序列,对于增加和删除,List 可以控制这两个操作的位置。
1.ArrayList
ArrayList 是List的一个实现类,底层是由数组实现的.因为ArrayList 是继承List 所以它其中的元素也是可以重复的。
(1)添加:
我在这里创建了一个课程类和一个待选课程类
public class ListTest {
/**
* 用于存放备选课程 Courses
* @param args
*/
public List Courses;
public ListTest(){
this.Courses=new ArrayList();//因为List 是一个接口,所以在new 的时候需要选择一个实现类
}
/**
* 用于添加课程
*/
public void AddCrouse(){
Course c1=new Course("数据结构","0");
Courses.add(c1);//第一种添加方法,将创建的类添加到list 中,并且对象在存入集合中的时候都会转换为Object类
Course c2=new Course("C语言","1");
Courses.add(c2);//在指定的位置添加元素。
//创建 一个课程数组,使用addAll方法将此数组作为Collection 的一个实例传入Arraylist,
//在这里使用Array.asList将数组转换为一个List。
Course crs[]={new Course("高等数学", "4"),new Course("离散数学", "5")};
Courses.addAll(Arrays.asList(crs));
for( Object obj:Courses)
{
//打印输出,运用ArrayList的get()方法,注意进行类型转换,因为取出来的是object类型
/*
Course cr1=(Course)Courses.get(0);
System.out.println("id "+cr1.id+","+"name "+cr1.name);
*/
//打印输出,运用foreach 循环,注意进行类型转换,因为取出来的是object类型
Course cr1=(Course)obj;
System.out.println("id "+cr1.id+","+"name "+cr1.name);
}
}
public static void main(String[] args) {
ListTest test =new ListTest();
test.AddCrouse();
}
}
需要注意的是,对于ArrayList 使用指定位置进行添加操作的时候,每一次都仅仅只是添加都是向下加一个元素的位置,比如现在我添加了两个元素,那么对于此时的长度为2,下一次我可以添加的位置应该是2,如果是3,那么就会报出数组越界的错误。
(2)List 的遍历
第一种:循环遍历,获取List d的长度通过for循环遍历。使用List 的get 方法获取到元素。
第二种:利用迭代器 Iterator 遍历List
简单描述一下Iterator,在网上搜了一些迭代器的描述以及基本常用的方法:(以下描述来自http://www.cnblogs.com/amboyna/archive/2007/09/25/904804.html)
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
//利用迭代器输出:(java.util)
Iterator itr= Courses.iterator();
System.out.println("通过迭代器遍历List:");
while(itr.hasNext()){
Course cr3=(Course)itr.next();
System.out.println("id: "+cr3.id+"name: "+cr3.name);
}
第三种:foreach方法,其实foreach方法是 迭代器的一种简便写法。
<span style="color:#ff6666;">
</span><span style="color:#666666;"> for( Object obj:Courses)
{
//打印输出,运用foreach 循环,注意进行类型转换,因为取出来的是object类型
Course cr1=(Course)obj;
System.out.println("id "+cr1.id+","+"name "+cr1.name); </span><span style="color:#ff6666;">
</span><span style="color:#666666;"> }</span>
(3)修改
修改采用List 的set 方法,下面是Java API 里的描述:
(4)删除
删除方法和添加十分的相似,主要运用的方法是remove()和removeAll();用法和add 和addAll()类似。
上面的所有方法都是在取出元素的时候采用强制类型转换的方式来获取对象,这样显的繁琐,在这里我们可以利用反省,在创建List 的时候规定他的类型,不是此类型及其子类型的数据将存不进去而且在取出来的时候也不用再去进行类型转换。
public List<Course> Cro=new ArrayList<Course>();
在使用泛型的时候注意:如果使用基本数据类型的时候,必须使用他的包装类,比如使用int 应该使用Integer。