Java语言的容器类中,最像数组的就是List了。这里说的List,是指在java.util包中,List接口及其派生类。List接口有三个派生类最常见,分别是ArrayList、LinkedList和Vector,其中用得最多的是ArrayList。在Java语言的设定中,List是以“有序”容器的面目出现的,所谓的有序,不是说内部成员有排序,恰好相反,List默认是不排序的。所谓的有序,是指其中的成员元素的顺序是可以通过代码指定的。
让我们还是以容器的常用功能的角度来看看List吧。
一、创建List容器
List list = new ArrayList();
List<Integer> list = new ArrayList<Integer>();
前者是传统语法,后者是泛型容器的语法。所谓泛型容器,即指定了容器内成员元素的数据类型的容器。
前者创建了List接口的对象,实际上是ArrayList类的实例。
后者创建了List接口的对象,该对象的所有内部成员元素都是Integer类型的。(与之相比较的是前者的所有成员元素都是Object类型的。)
让我们还是以容器的常用功能的角度来看看List吧。
一、创建List容器
List list = new ArrayList();
List<Integer> list = new ArrayList<Integer>();
前者是传统语法,后者是泛型容器的语法。所谓泛型容器,即指定了容器内成员元素的数据类型的容器。
前者创建了List接口的对象,实际上是ArrayList类的实例。
后者创建了List接口的对象,该对象的所有内部成员元素都是Integer类型的。(与之相比较的是前者的所有成员元素都是Object类型的。)
二、判断是否为空
list.isEmpty();
这是判断容器是否为空,返回值是boolean类型,如果是true就表示容器是空的(没有成员元素),否则表示不为空(即已有至少一个成员元素)。
三、计算容器大小
int size = list.size();
这是返回容器的大小,即容器内成员元素的个数,返回值是整数类型。
四、添加元素
boolean success = list.add(obj);
list.add(2, obj);
这是向List容器中添加元素,有以下几点值得注意:
1、添加的元素类型:如果是泛型容器,这个参数obj必须是指定的类型(或其子类,这个类型在创建容器时指定);如果不是,那么这个obj只要是Object类(或其子类)就行。
2、前者返回值是boolean类型,表示此次添加操作是否成功,后者没有返回值。
3、前者把新元素添加到List末尾,后者把新元素添加到指定的位置(下标,从0算起),该位置及其之后的元素都向后移动。
五、取其中的元素
list.get(2);
输入参数是下标,即第几个元素,从0算起。至于返回值,要看List容器是否泛型,如果是泛型容器,那就返回指定类型的对象,否则返回的是Object类型的对象。
六、删除元素
list.remove(2);
boolean success = list.remove(obj);
前者从List容器中删掉指定下标位置的成员元素,返回值类似五。
后者从List容器中删掉obj对象,操作成功返回true。什么情况会不成功呢?容器中没有obj这个对象。
七、查找
list.contains(obj);
list.indexOf(obj);
前者只看容器中是否存在obj这个对象,有的话返回true,否则返回false。
后者查找容器中是否存在obj这个对象,有的话返回其下标(整数),否则返回-1。
八、遍历
最好的写法是用forEach语法:
for (Integer a : list){ // 注:Integer是指创建泛型容器时指定的数据类型
}
注意:
1、最好是泛型容器,这种语法还能省掉数据类型转换的麻烦。否则Integer就要换成Object,还是要做数据类型转换。
2、List容器内的顺序是固定的,所以for循环时,可以看到a是按照list容器的顺序依次遍历的。
3、这种遍历有一个缺点,就是没有下标,所以需要下标这个值的时候,还是用传统循环遍历好了,遍历语法是:
for (int i=0; i<list.size(); i++) {
Integer a = list.get(i);
……
七、查找
list.contains(obj);
list.indexOf(obj);
前者只看容器中是否存在obj这个对象,有的话返回true,否则返回false。
后者查找容器中是否存在obj这个对象,有的话返回其下标(整数),否则返回-1。
八、遍历
最好的写法是用forEach语法:
for (Integer a : list){ // 注:Integer是指创建泛型容器时指定的数据类型
}
注意:
1、最好是泛型容器,这种语法还能省掉数据类型转换的麻烦。否则Integer就要换成Object,还是要做数据类型转换。
2、List容器内的顺序是固定的,所以for循环时,可以看到a是按照list容器的顺序依次遍历的。
3、这种遍历有一个缺点,就是没有下标,所以需要下标这个值的时候,还是用传统循环遍历好了,遍历语法是:
for (int i=0; i<list.size(); i++) {
Integer a = list.get(i);
……
}
这样a仍然是遍历时每个成员元素的引用,但是多了一个i是对应的下标。
这样a仍然是遍历时每个成员元素的引用,但是多了一个i是对应的下标。