一、List(集合的一种)
|--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引,
|-- ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步
|-- LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)
|-- Vector:底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(无论查询还是增删都很慢,被ArrayList替代了)
List:特有的方法,凡是可以操作角标的方法都是该体系特有的方法
增
代码如下:
boolean add(int index, E element)
boolean addAll(index,Collection)
代码如下:
public static void List_add(){
ArrayList a1 = new ArrayList();
a1.add("java");
a1.add("php");//List集合中的元素可以重复
a1.add(".net");
System.out.println("原集合:"+a1);
a1.add(1, "Flash");
a1.add(0, "ps");
System.out.println(a1);
ArrayList a2 = new ArrayList();
a2.add("javascript");
a2.add("3dMax");
a2.add("IBM");
a1.addAll(0, a2);
System.out.println(a1);
}
删除指定位置的元素
代码如下:
boolean remove(int index)
代码如下:
public static void List_remove(){
ArrayList a1 = new ArrayList();
a1.add("javascript");
a1.add("php");
a1.add("flash");
System.out.println("原集合:"+a1);
a1.remove(0);
System.out.println(a1);
}
修改指定角标的元素 set(int index, E element) 返回的是修改的那个元素
代码如下:
public static void List_set() {
ArrayList a1 = new ArrayList();
a1.add("javascript");
a1.add("php");
a1.add(".net");
System.out.println("原集合:"+a1);
a1.set(1, "falsh");
System.out.println(a1);
}
查
代码如下:
get(int index) 返回列表中指定位置的元素
subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分元素。
复制代码
public static void List_get() {
ArrayList a1 = new ArrayList();
a1.add("java");
a1.add("php");
a1.add("flash");
System.out.println(a1.get(0));//获取指定角标的元素,有了该方法就可以遍历该集合中的所有元素
System.out.println(a1.subList(1, 3));//获取集合中某一部分的元素,包含头不包含尾
}
二、List 和ArrayList
(一)、两者的区别
List是一个接口,而ArrayList是一个类。
(二)、两者的联系
ArrayList继承并实现了List。
所以List不能被构造,但可以向上面那样为List创建一个引用,而ArrayList就可以被构造。
(三)、两者的实例说明
List list; //正确 list=null;
List list=new List(); // 是错误的用法
List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
三、迭代器
Java要求各种集合都提供一个iteratot()方法,该方法返回一个Iterator用于遍历集合中的元素。至于返回的Iterator是哪一种实现类我们并不关心,这就是典型的“迭代器模式”。
迭代器一般和泛型数组ArrayList,泛型链表LinkList配合使用,达到顺序遍历的效果。
先来看看下面两段代码:解释写在代码注释里了
例2
1. private
2. {
3. /**
4. * ArrayList<PhotoItem>用来存放图片信息
5. */
6. private ArrayList<PhotoItem> mPhotolist = null;
7.
8. /**
9. * new一个ArrayList<String>,用来存放文件的地址path
10. */
11. new
12.
13. /**
14. * 给mPhotolist加上迭代器,对它进行顺序遍历操作,这里是关键!it只是一个迭代器对象
15. */
16. Iterator<PhotoItem> it = mPhotolist.iterator();
17. while
18. {
19. /**
20. * 把遍历得到的PhotoItem类型对象赋值给PhotoItem类型对象temp
21. */
22. PhotoItem temp = it.next();
23. if
24. {
25. String path = getRealPath(temp.ImageID);
26. if (path != null)
27. {
28. list.add(path);
29. }
30. }
31. }
32. return
33. }
34. @Override
35. protected void
36. {
37. new
38.
39. Iterator<Mp3Info> iterator = mp3Infos.iterator();
40. while
41. //for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();)
42. {
43. Mp3Info mp3Info = iterator.next();
44. HashMap<String, String> map = new
45. map.put("mp3_name", mp3Info.getMp3Name());
46. "mp3_size", mp3Info.getMp3Size());
47. list.add(map);
48. }
49. }
50. 第二段代码其实和第一段代码所实现的功能是一样的,大家可以参考一下,作个比较!
例1
1. public class IteratorTest {
2. public static void main(String[] args) {
3. new HashSet();
4. "计算机网络");
5. "数字信号处理");
6. "java语言程序设计");
7. //生成迭代器
8. Iterator it = books.iterator();
9. int i=0;
10. //hasNext是取值取的是当前值.他的运算过程是判断下个是否有值如果有继续.
11. while(it.hasNext()){
12. //next()返回的数据是Object型,需要强制转化 (取出下一个值)
13. String info = (String)it.next();
14. //输出遍历的每一个元素
15. "第"+i+"个元素:"+info);
16. if(info.equals("数字信号处理")){
17. System.out.println(i);
18. //把《数字信号处理》从集合books中移除
19. }
20. i++;
21. }
22. //输出移除后的结果
23. System.out.println(books);
24. }
25.
26. }
输出结果为:
第0个元素:java语言程序设计
第1个元素:数字信号处理
1
第2个元素:计算机网络
[java语言程序设计, 计算机网络
List集合特有的迭代器:ListIterator(是Iterator的子接口)
注意:
在迭代时,是不可以通过集合对象的方法操作集合中的元素
因为会发生ConcurrentModificationException异常(并发异常)
所以,在迭代器时,只能用迭代器的方法造作元素
因为Iterator方法是有限的所以只能对元素进行判断,取出,删除的操作
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator
该接口只能通过List集合的listIterator方法获取
代码如下:
public class ListIteratorDemo {
public static void main(String[] args) {
ArrayList a1 = new ArrayList();
a1.add("java01");
a1.add("java02");
a1.add("java03");
a1.add("java04");
System.out.println("原集合是:"+a1);
/*在迭代过程中准备添加或者删除元素
Iterator it = al.iterator();
while (it.hasNext()){
Object obj = it.next();
if (obj.equals("java02"))
//al.add("java008");//会出现并发异常,因为迭代器正在操作集合,不能再用集合的方法操作集合了
it.remove();//将java02的引用从集合中删除了
System.out.println("obj:"+obj);
}
*/
//只有List的listIterator有增,删,改,查这些功能,因为只有List有索引
ListIterator li = a1.listIterator();
while (li.hasNext()){
if(li.next().equals("java02"))
//li.add("java009");
li.set("java006");
}
}
}
附 LinkedList特有方法:
addFirst();在头部添加元素 addLast();在尾部添加元素
getFirst(); getLast(); 获取元素但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst(); removeLast(); 获取元素但是删除元素。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法
offerFirst(); offerLast();
peekFirst(); peekLast(); 获取元素,但是元素不被删除。如果集合中没有元素,会返回null
pollFirst(); pollLast(); 获取元素,但是元素被删除。如果集合中没有元素,会返回null
复制代码 代码如下:
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList link = new LinkedList();
link.add("java01");
link.add("java02");
link.add("java03");
link.add("java04");
while(!link.isEmpty()){
System.out.println((link.removeLast()));
}
}
}
实际应用例子:
List接口是Collection接口的子接口,List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,所以被称为是序列。
List可以精确的控制每个元素的插入位置,或删除某个位置元素,它的实现类ArrayList底层是由数组实现的。
List中有增删改查的方法,我们可以通过例子演示:
我们通过对学生选课,来演示List中对课程增删改查的方法
1 /**
2 * 课程类
3 * @author lenovo
4 *
5 */
6 public class KeCheng {
7
8 public String id;
9
10 public String name;
11
12 public KeCheng(String id,String name){
13 this.id = id;
14 this.name = name;
15 }
16
17 }
创建一个学生类
1 import java.util.HashSet;
2 import java.util.Set;
3
4 /**
5 * 学生类
6 * @author lenovo
7 *
8 */
9 public class Student {
10
11 public String id;
12
13 public String name;
14
15 public Set kecheng;
16
17 public Student(String id,String name){
18 this.id = id;
19 this.name = name;
20 this.kecheng = new HashSet();
21 }
22
23 }
创建一个备选课程的类
1 /**
2 * 备选课程类
3 * @author lenovo
4 *
5 */
6 public class ListTest {
7
8 //用于存放备选课程的List
9 public List beixuan;
10
11 public ListTest(){
12 this.beixuan = new ArrayList();
13 }
14 }
可以使用List中add方法添加课程
1 /*
2 * 用来往beixuan里添加备选课程的方法
3 */
4 public void kcAdd(){
5
6 //创建一个课程的对象,调用add方法,添加到备选课程的List中
7 KeCheng kc = new KeCheng("1","数据结构");
8 beixuan.add(kc);
9
10 KeCheng kc2 = new KeCheng("2","C语言");
11 beixuan.add(0, kc2);
12
13 KeCheng[] kcArr = {new KeCheng("3","大学语文"),new KeCheng("4","线性代数")};
14 beixuan.addAll(Arrays.asList(kcArr));
15
16 KeCheng[] kcArr2 = {new KeCheng("5","艺术设计"),new KeCheng("6","计算机基础")};
17 beixuan.addAll(2, Arrays.asList(kcArr2));
18
19 }
20
使用get方法取出指定位置上的内容,并用for循环遍历出课程的内容
1 /*
2 * 使用for循环遍历课程的方法
3 */
4 public void getKC(){
5 int size = beixuan.size();
6 System.out.println("使用for遍历课程:");
7 for (int i = 0; i < size; i++) {
8 KeCheng kc = (KeCheng) beixuan.get(i);
9 System.out.println("课程:"+kc.id+":"+kc.name+";");
10 }
11 }
遍历List的内容,除了使用for循环外,还可以使用迭代器、foreach等方法
1 /*
2 * 使用Iterator迭代器遍历课程
3 */
4 public void testIterator(){
5 Iterator it = beixuan.iterator();
6 System.out.println("使用Iterator遍历课程:");
7 while(it.hasNext()){
8 KeCheng kc = (KeCheng) it.next();
9 System.out.println("课程:"+kc.id+":"+kc.name+";");
10 }
11
12 }
13
14 /*
15 * 使用for each遍历课程
16 */
17 public void testForeach(){
18 System.out.println("使用for each遍历课程:");
19 for(Object obj : beixuan){
20 KeCheng kc = (KeCheng)obj;
21 System.out.println("课程:"+kc.id+":"+kc.name+";");
22 }
23 }
24
修改List中的元素,可以使用set方法
1 /*
2 * 使用set方法添加课程
3 */
4 public void testModify(){
5 beixuan.set(0, new KeCheng("7","毛概"));
6 }
删除List中的元素有两种方法,一是使用remove方法
1 /*
2 * 使用remove方法删除课程
3 */
4 public void testRemove(){
5 KeCheng kc = (KeCheng) beixuan.get(0);
6 System.out.println("我是课程:"+kc.id+":"+kc.name+";即将被删除");
7 boolean b = beixuan.remove(kc);
8 if(b){
9 System.out.println("成功删除课程");
10 testForeach();
11 }
12 }
还可以使用removeAll方法删除一个课程类型的数组
1 /*
2 * 使用removeAll方法删除课程
3 */
4 public void testRemoveAll(){
5 System.out.println("即将删除4和5位置上的课程");
6 KeCheng[] kc = {(KeCheng) beixuan.get(4),(KeCheng) beixuan.get(5)};
7 beixuan.removeAll(Arrays.asList(kc));
8 System.out.println("课程删除成功");
9 testForeach();
10 }