您的位置:首页 > 编程语言 > Java开发

五,Java集合类(3)——List接口及其实现类

2016-09-13 11:28 495 查看

1 List集合

List集合代表一个元素有序,可重复的集合,集合中每个元素都有其对应的顺序索引。

package com.practice.collection;

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

public class ListTest {

public static void main(String[] args) {
List books = new ArrayList();
books.add(new String("Node.js从入门到精通"));
books.add(new String("JavaScript从入门到精通"));
books.add(new String("Java从入门到精通"));
System.out.println(books);
books.add(new String("Java Web从入门到精通"));
for(int i = 0; i < books.size(); i ++){
System.out.println(books.get(i));
}
books.remove(1);
System.out.println(books);
System.out.println(books.indexOf(new String("Java Web从入门到精通")));
books.set(1, new String("Oracle 11g从入门到精通"));
System.out.println(books);
System.out.println(books.subList(2, 3));
}
}


以上的红色代码
books.indexOf(new String("Java Web从入门到精通"))
该对象是通过new的方法构造出来的,跟原来在List中的不是同一个一元素,但是结果打印出来的还是个正确的结果。既然是new出来的对象,在堆内存不是不一样的吗?为什么返回的还是在List中的元素的索引。原因是List判断两个对象相等只要通过equals()方法返回true即可。

例如以下的代码:

package com.practice.collection;

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

class Test
{
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return true;
}
}

public class ListTest2 {

public static void main(String[] args) {
List books = new ArrayList();
books.add(new String("Node.js从入门到精通"));
books.add(new String("JavaScript从入门到精通"));
books.add(new String("Java从入门到精通"));
books.add(new String("Java Web从入门到精通"));
System.out.println(books);
books.remove(new Test());
System.out.println(books);
books.remove(new Test());
System.out.println(books);
}
}


由于类Test重写了equals()方法,总是返回true,所以在比较移除的时候,总是移除集合中的第一个元素。

Java 8为List集合增加了sort()和replaceAll()两个默认方法,通过Lanbda函数表达式作为参数传入。

package com.practice.collection;

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

public class ListTest3 {

public static void main(String[] args) {
List books = new ArrayList();
books.add(new String("Node.js从入门到精通"));
books.add(new String("JavaScript从入门到精通"));
books.add(new String("Java从入门到精通"));
books.add(new String("Java Web从入门到精通"));
/*按字符串的长短来输出*/
books.sort((o1,o2)->((String)o1).length()-((String)o2).length());
System.out.println(books);
/*用字符串的长度来代替原来字符串*/
books.replaceAll(ele->((String)ele).length());
System.out.println(books);
}
}


输出结果:

[Java从入门到精通, Node.js从入门到精通, Java Web从入门到精通, JavaScript从入门到精通]
[10, 13, 14, 16]


2 listIterator方法

和iterator方法相比较而言,listIterator可以向前迭代,而iterator只能够向后迭代。而且listIterator提供了add()的方法向List集合中添加元素,iterator只能够删除元素。

package com.practice.collection;

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

public class ListIteratorTest {

public static void main(String[] args) {
String[] books = {"Java从入门到精通","Node.js从入门到精通",
"Java Web从入门到精通","JavaScript从入门到精通"};
List bookList = new ArrayList();
for(int i = 0;i < books.length; i ++){
bookList.add(books[i]);
}
ListIterator listIterator = bookList.listIterator();
while(listIterator.hasNext()){
System.out.println(listIterator.next());
listIterator.add("--------------我是分隔符----------------");

}
System.out.println("==============以下是反向迭代================");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}


3 ArrayList和Vector实现类

ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的,允许再分配的Object[]数组。ArrayList或Vector对象使用initialCapaciy参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组的长度时,他们的initialCapaciy会自动增长。

除此之外,两者的显著特征是ArrayList是线程不安全,Vector是线程安全的。为了使List变成线程安全的,可以使用Collections的工具类,不使用Vector,是因为过时了。

Vector还有个实现类Stack,实现元素能够像栈的操作进行,先进后出。

4 固定长度的List

Arrays.asList()方法,该方法可以把一个数组或指定个数的对象转化成一个List集合,这个List集合不是ArrayList的实现类,也不是Vector的实现类,而是Arrays的内部类ArrayList实例。

Arrays.ArrayList是一个固定长度的List集合,只能够遍历里面的数据元素,不能够增加或者删除元素,如果操作会抛出UnsupportedOperationException异常。

package com.practice.collection;

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

public class FixedSizeList {

public static void main(String[] args) {
List fixedList = Arrays.asList("Java从入门到精通","Node.js从入门到精通",
"Java Web从入门到精通","JavaScript从入门到精通");
System.out.println(fixedList.getClass());
fixedList.forEach(System.out::println);
fixedList.add("非IT书籍");
fixedList.remove("Java从入门到精通");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 集合类 list