11.5List
List承诺可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。
有两种类型的List:
ArrayList:擅长随机访问元素,但,在List中间删除和添加元素时较慢。
LinkedList:在List中间进行删除和插入的操作上性能较好,提供了优化的顺序访问。LinkedList在随机访问方面较慢,但是它的特性集教ArrayList更大。
typeinfo.pets:这个类库包含了Pet类的继承层次结构,以及用于随机生成Pet对象的一些工具类。有两个特点:1有一个Pet类,以及Pet类的各种子类。2.静态的Pets.arrayList()返回一个填充了随机选取的Pet对象的ArrayList
package cn.wangs.c11.$11_5;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import typeinfo.pets.Cymric;
import typeinfo.pets.Hamster;
import typeinfo.pets.Mouse;
import typeinfo.pets.Pet;
import typeinfo.pets.Pets;
public class ListFeatures {
public static void main(String[] args) {
Random random = new Random(47);
List<Pet> pets = Pets.arrayList(7);
System.out.println("1:" + pets);
Hamster h = new Hamster();
pets.add(h);
System.out.println("2:" + pets);
System.out.println("3:" + pets.contains(h));
pets.remove(h);
Pet pet = pets.get(2);
System.out.println("4:" + pet + " " + pets.indexOf(pet));
Pet cymric = new Cymric();
System.out.println("5:" + pets.indexOf(cymric));
System.out.println(pets.remove(cymric));
// System.out.println("7:"+pets.remove(p));p cannot be resolved to a
// variable
System.out.println("8:" + pets);
pets.add(3, new Mouse());
System.out.println("9:" + pets);
List<Pet> sub = pets.subList(1, 4);
System.out.println("10:" + sub);
Collections.sort(sub);
System.out.println("sorted subList:" + sub);
System.out.println("11:" + pets.containsAll(sub));
Collections.shuffle(sub, random);
System.out.println("shuffle sub:" + sub);
System.out.println("12:" + pets.containsAll(sub));
List<Pet> copy = new ArrayList<Pet>(pets);
System.out.println(copy);
sub = Arrays.asList(pets.get(1), pets.get(4));
System.out.println("sub:" + sub);
copy.retainAll(sub);// 只保留指定的集合
System.out.println("13:" + copy);
copy = new ArrayList<Pet>(pets);
System.out.println("copy:" + copy);
copy.remove(2);
System.out.println("14:" + copy);
copy.removeAll(sub);
System.out.println("15:" + copy);
copy.set(1, new Mouse());
System.out.println("16:" + copy);
copy.addAll(2, sub);
System.out.println("17:" + copy);
copy.set(2, new Mouse());
copy.addAll(2, sub);
System.out.println("17:" + copy);
System.out.println("18:" + pets.isEmpty());
pets.clear();
System.out.println("19:" + pets);
System.out.println("20:" + pets.isEmpty());
pets.addAll(Pets.arrayList(4));
System.out.println("21:" + pets);
Object[] o = pets.toArray();
System.out.println("22:" + o[3]);
Pet[] pa = pets.toArray(new Pet[0]);
System.out.println("23:"+pa[3].id());
}
}
1:[Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug]
2:[Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug, Hamster]
3:true
4:Cymric 2
5:-1
false
8:[Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug]
9:[Rat, Manx, Cymric, Mouse, Mutt, Pug, Cymric, Pug]
10:[Manx, Cymric, Mouse]
sorted subList:[Cymric, Manx, Mouse]
11:true
shuffle sub:[Manx, Cymric, Mouse]
12:true
[Rat, Manx, Cymric, Mouse, Mutt, Pug, Cymric, Pug]
sub:[Manx, Mutt]
13:[Manx, Mutt]
copy:[Rat, Manx, Cymric, Mouse, Mutt, Pug, Cymric, Pug]
14:[Rat, Manx, Mouse, Mutt, Pug, Cymric, Pug]
15:[Rat, Mouse, Pug, Cymric, Pug]
16:[Rat, Mouse, Pug, Cymric, Pug]
17:[Rat, Mouse, Manx, Mutt, Pug, Cymric, Pug]
17:[Rat, Mouse, Manx, Mutt, Mouse, Mutt, Pug, Cymric, Pug]
18:false
19:[]
20:true
21:[Manx, Cymric, Rat, EgyptianMau]
22:EgyptianMau
23:15
List价值在于:可修改的序列,添加元素,不知道下标,默认追加到末尾。
contains()确定某个对象是否在列表中。
remove()移除一个对象;indexOf()查该对象在list中所处的位置。这三个方法都会用到equals()函数(它是Object镀锡的一部分)。
LinkedList的插入删除操作是廉价的。ArrayList的随机访问是廉价的,但其插入和删除时昂贵的。
subList():截取集合的一段元素,返回新的子集。
无论Collection.sort()还是Collection.shuffle()都属于被截取的那个集合的子集。
retainAll():用来取两个集合的“交集”部分。返回一个新的集合。
removeAll():也是基于equals()的。
clear():清空集合元素
isEmpty():判断集合是否为空
toArray():可以将集合转为数组
练习5:修改ListFeatures.java 让它使用Integer,而不是Pet,并解释在结果上有何不同
package cn.wangs.c11.$11_5;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Ex5 {
public static List listofRandInteger(int length, int n) {
Random rand = new Random();
List li = new ArrayList();
for (int i = 0; i < length; i++)
li.add(rand.nextInt(n));
return li;
}
public static void main(String[] args) {
Random rand = new Random();
List<Integer> li = listofRandInteger(7, 10);
System.out.println("1: " + li);
Integer h = new Integer(rand.nextInt(10));
li.add(h);
System.out.println("2: " + li);
System.out.println("3: " + li.contains(h));
// removes the first instance equivalent to Integer h:
li.remove(h);
System.out.println("3.5 " + li);
Integer p = li.get(2);
System.out.println("4: " + p + " " + li.indexOf(p));
Integer cy = new Integer(rand.nextInt(10));
System.out.println("5: " + cy + " " + li.indexOf(cy));
System.out.println("6: " + li.remove(cy));
System.out.println("7: " + li.remove(p));
System.out.println("8: " + li);
li.add(3, new Integer(rand.nextInt(10)));
System.out.println("9: " + li);
List<Integer> sub = li.subList(1, 4);
System.out.println("sublist: " + sub);
System.out.println("10: " + li.containsAll(sub));
Collections.sort(sub);
System.out.println("sorted sublist: " + sub);
System.out.println("11: " + li.containsAll(sub));
System.out.println("11.25: " + li);
Collections.shuffle(sub, rand);
System.out.println("11.5: " + li);
System.out.println("shuffled sublist: " + sub);
System.out.println("12: " + li.containsAll(sub));
List<Integer> copy = new ArrayList<Integer>(li);
System.out.println("12.5 " + li);
sub = Arrays.asList(li.get(1), li.get(4));
System.out.println("sub: " + sub);
copy.retainAll(sub);
System.out.println("13: " + copy);
copy = new ArrayList<Integer>(li);
copy.remove(2);
System.out.println("14: " + copy);
copy.removeAll(sub);
System.out.println("15: " + copy);
if (copy.size() > 1)
copy.set(1, 8);
System.out.println("16: " + copy);
if (copy.size() > 2)
copy.addAll(2, sub);
System.out.println("17: " + copy);
System.out.println("18: " + li.isEmpty());
li.clear();
System.out.println("19: " + li);
System.out.println("20: " + li.isEmpty());
li.addAll(listofRandInteger(4, 10));
System.out.println("21: " + li);
Object[] o = li.toArray();
System.out.println("22: " + o[3]);
Integer[] ia = li.toArray(new Integer[0]);
System.out.println("23: " + ia[3]);
}
}
练习6,7
package cn.wangs.c11.$11_5;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class Ex6 {
public static void main(String[] args) {
Random random = new Random(47);
List strs = new ArrayList(Arrays.asList(“aa”, “bb”, “cc”));
System.out.println(“1:” + strs);
System.out.println("2:" + strs.get(1));
strs.add(2, "dd");
System.out.println("3:" + strs);
List<String> sub = strs.subList(1, 2);
System.out.println("4:" + sub);
System.out.println(strs.containsAll(sub));
sub.contains("bb");
// strs.removeAll(sub);
strs.retainAll(sub);
System.out.println(strs);
}
}
1:[aa, bb, cc]
2:bb
3:[aa, bb, dd, cc]
4:[bb]
true
[bb]