《疯狂Java讲义(第4版)》-----第8章【Java集合】(List)
List
最常用的实现类应该是ArrayList,是基于数组实现的List类,封装了动态可再分配的Object[]数组。
import java.util.ArrayList;
public class Hello{
public static void main(String[] args){
ArrayList books = new ArrayList();
books.add(new String("计算机网络"));
books.add(new String("计算机组成原理"));
books.add(new String("操作系统"));
System.out.println(books);
books.add(1, "疯狂Java讲义");
for(int i = 0; i < books.size(); i++){
System.out.println(books.get(i));
}
books.remove(2);
System.out.println(books);
System.out.println(books.indexOf(new String("操作系统")));
books.set(0, "疯狂Java讲义");
System.out.println(books);
System.out.println(books.subList(0,2));
}
}
List判断两个元素对象是否相等是根据equals来比较的
import java.util.ArrayList;
class A{
public boolean equals(Object obj){
return true;
}
}
public class Hello{
public static void main(String[] args){
ArrayList books = new ArrayList();
books.add(new String("计算机网络"));
books.add(new String("计算机组成原理"));
books.add(new String("操作系统"));
System.out.println(books);
books.remove(new A());//这将删除当前books第一个元素
System.out.println(books);
books.remove(new A());//这将删除当前books第一个元素
System.out.println(books);
}
}
给List的元素排序
import java.util.ArrayList;
import java.util.Comparator;
//为什么官方文档给出的Comparator有两个抽象方法,并且这里没有实现另一个抽象方法,也没出错???
class MyComparator implements Comparator{
public int compare(Object obj1, Object obj2){
String s1 = (String)obj1;
String s2 = (String)obj2;
return s1.length() - s2.length();
}
}
public class Hello{
public static void main(String[] args){
ArrayList books = new ArrayList();
books.add(new String("计算机网络"));
books.add(new String("计算机组成原理"));
books.add(new String("操作系统"));
/*排序方法一-----匿名内部类
books.sort(new Comparator(){
public int compare(Object obj1, Object obj2){
String s1 = (String)obj1;
String s2 = (String)obj2;
return s1.length() - s2.length();
}
});
*/
//排序方法二-----Lambda表达式
//books.sort((obj1, obj2)->((String)obj1).length() - ((String)obj2).length());
//排序方法三-----首先写一个实现Comparator的类MyComparator
books.sort(new MyComparator());
System.out.println(books);
}
}
实现replaceAll方法,认识UnaryOperator函数式接口
下面会通过代码去实现这个下面的方法(用每个字符串的长度代替字符串本身):
import java.util.ArrayList;
import java.util.function.UnaryOperator;
//UnaryOperator是函数式接口,唯一方法:identity(),官方文档里来看,没有抽象方法啊!!
//去父接口Function找,唯一抽象方法apply,实现这个方法就OK了
//下面是用每个字符串的长度代替这个字符串
class MyUnaryOperator implements UnaryOperator{
public Integer apply(Object obj){
String s = (String)obj;
return s.length();
}
}
public class Hello{
public static void main(String[] args){
ArrayList books = new ArrayList();
books.add(new String("计算机网络"));
books.add(new String("计算机组成原理"));
books.add(new String("操作系统"));
//replaceAll-----方式一:本质的方法,写一个UnaryOperator的实现类
//books.replaceAll(new MyUnaryOperator());
//replaceAll-----方式二:Lambda表达式
//books.replaceAll(obj->((String)obj).length());
//replaceAll-----方式三:匿名内部类
books.replaceAll(new UnaryOperator(){
public Integer apply(Object obj){
String s = (String)obj;
return s.length();
}
});
System.out.println(books);//[5, 7, 4]
}
}
listIterator方法
Set只提供了iterator方法,List还额外提供了listIterator方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,专门操作List。ListIterator接口在Iterator接口的基础上增加了hasPrevious
previous,add方法。ListIterator接口的官方文档如下:
import java.util.ArrayList;
import java.util.ListIterator;
public class Hello{
public static void main(String[] args){
ArrayList books = new ArrayList();
books.add(new String("计算机网络"));
books.add(new String("计算机组成原理"));
books.add(new String("操作系统"));
ListIterator lit = books.listIterator();
while(lit.hasNext()){
System.out.println(lit.next());
//迭代遍历过程中,修改元素
if(lit.nextIndex() == 1){
lit.set("Java疯狂讲义");
lit.add("我是第一个");
}
if(lit.nextIndex() == 4){
lit.remove();
}
}
System.out.println("-------------------------");
while(lit.hasPrevious()){
System.out.println(lit.previous());
}
}
}
Arrays.ArrayList
Arrays工具类里提供了asList(Object… a)方法,可以把一个数组或指定个数的对象转换成一个List集合,这个List集合是Arrays.ArrayList(一个固定长度的List集合)。只能遍历这个集合,不可增加、删除元素。
import java.util.List;
import java.util.Arrays;
public class Hello{
public static void main(String[] args){
List books = Arrays.asList("第一本书", "第二本书", "第三本书");
System.out.println(books.getClass());
//List继承Collection,Collection继承Iterator,Iterator里有forEach方法,
//forEach方法的参数是Consumer,Consumer是一个函数式接口,唯一抽象方法:void accept(T t)
books.forEach(obj->System.out.println(obj));
System.out.println("---------------------------");
//Lambda表达式支持方法引用和构造器引用,这里演示的方法引用,非常简洁!!!
books.forEach(System.out :: println);
}
}
上面的一句代码:books.forEach(System.out :: println);
非常简洁,这是Lambda对方法引用的支持。