Iterator的使用:在java代码中包含三种循环的方式
do...while
while
for
还有一种增强for循环的方式,可以简化循环的编写
所有的集合类都默认实现了Iterable的接口,实现此接口意味着具备了增强for循环的能力,也就是for-each
增强for循环本质上使用的也是iterator的功能
方法:
iterator()
foreach()
在iterator的方法中,要求返回一个Iterator的接口子类实例对象
此接口中包含了
hasNext()
next()
在使用iterator进行迭代的过程中如果删除其中的某个元素会报错,并发操作异常,因此
如果遍历的同时需要修改元素,建议使用listIterator(),
ListIterator迭代器提供了向前和向后两种遍历的方式
始终是通过cursor和lastRet的指针来获取元素值及向下的遍历索引值
当使用向前遍历的时候必须要保证指针在迭代器的结果,否则无法获取结果值
所有的集合类均未提供相应的遍历方法,而是把遍历交给迭代器完成。迭代器为集合而生,专门实现集合遍历
Iterator是迭代器设计模式的具体实现
Iterator方法:
boolean hasNext():判断是否存在另一个可访问的元素
Object next():返回要访问的下一个元素
void remove():删除上次访问返回的对象
可以使用Iterator遍历的本质是什么?
实现Iterable接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42public class IteratorDemo { public static void main(String[] args) { List list = new ArrayList(); list.add(1); list.add("123"); list.add(true); list.add(100L); list.add(10.0d); //遍历集合 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("*******************"); //使用迭代器 // Iterator iterator = list.iterator(); ListIterator listIterator = list.listIterator(); while(listIterator.hasNext()){ // if(list.contains("123")){ 并发操作异常 // list.remove("123"); // } // Object o = listIterator.next(); // if("123".equals(o)){ // listIterator.remove(); // } System.out.println(listIterator.next()); } // System.out.println(list); // System.out.println("*******************"); // //增强for循环 // for(Object i :list){ // System.out.println(i); // } System.out.println("*********************************"); while(listIterator.hasPrevious()){ System.out.println(listIterator.previous()); } } }
linkedList拥有更加丰富的方法实现,需要用的时候查询api即可,不需要记忆
synchronized线程安全
ArrayList默认值是10;
Hashtable默认值是1<<4,是16;
LinkedList有序可重复
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28public class LinkedListDemo { public static void main(String[] args) { LinkedList linkedList = new LinkedList(); linkedList.add(1); linkedList.add("abc"); linkedList.add(true); linkedList.add(100L); linkedList.add(100L); System.out.println(linkedList); //输出第一位 System.out.println(linkedList.getFirst()); //输出最后一位 System.out.println(linkedList.getLast()); System.out.println(linkedList); linkedList.addFirst("ok"); System.out.println(linkedList); // System.out.println(linkedList.peek()); // System.out.println(linkedList); // System.out.println(linkedList.poll()); // System.out.println(linkedList); // System.out.println(linkedList.pop()); // System.out.println(linkedList); linkedList.push("no"); System.out.println(linkedList); } }
Vector 默认初始值10
synchronized线程安全
1.Vector也是List接口的一个子类实现
2.Vector跟ArrayList一样,底层都是使用数组进行实现的
3.面试经常问区别:
1.ArrayList是非线程安全,Vector是线程安全的,低效率
2.ArrayList每次扩容1.5倍,Vector每次扩容2倍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class VectorDemo { public static void main(String[] args) { Vector vector = new Vector(); vector.add(1); vector.add("abc"); vector.add(true); vector.add(100.0d); vector.add("abc"); System.out.println(vector); System.out.println(vector.size()); System.out.println(vector.capacity()); System.out.println(vector.firstElement());//第一位数 System.out.println(vector.lastElement());//第二位数 } }
1、set中存放的是无序,唯一的数据
2、set不可以通过下标获取对应位置的元素的值,因为无序的特点
3、使用Treeset底层的实现是Treemap,利用红黑树来进行实现
4、设置元素的时候,如果是自定义对象,会查找对象中的equals和hashcode的方法,如果没有,比较的是地址
5、树中的元素是要默认进行排序操作的,如果是基本数据类型,自动比较,如果是引用类型的话,需要自定义比较器
比较器分类:
内部比较器
定义在元素的类中,通过实现Comparable接口来进行实现
外部比较器
定义在当前类中,通过实现Comparator接口来实现,但是要将该比较器传递到集合中
注意:外部比较器可以定义成一个工具类,此时所有需要比较的规则如果一致的话,可以复用,而
内部比较器只有在存储当前对象的时候才可以使用
如果两者同时存在,使用外部比较器
当使用比较器的时候,不会调用equals方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67import java.util.Set; import java.util.TreeSet; public class SetDemo2 implements Comparable { public static void main(String[] args) { // Set set = new HashSet(); // set.add(1); // set.add("abc"); // set.add(true); // set.add(100L); // set.add("abc"); // System.out.println(set); //遍历集合 // for (int i = 0; i < set.size(); i++) { // System.out.println(set.get); // } //迭代器遍历 // Iterator iterator = set.iterator(); // while(iterator.hasNext()){ // Object obj = iterator.next(); // System.out.println(obj); // } //增强for循环 // for(Object o : set){ // System.out.println(o); // } // System.out.println("*******************************"); // for(Iterator iterator1 = set.iterator();iterator1.hasNext();){ // System.out.println(iterator1.next()); // } // Set set = new TreeSet(); // set.add(1); // set.add(123); // set.add(5); // set.add(20); // set.add("abc"); // set.add("casd"); // set.add("dasd"); // set.add("bfh"); // System.out.println(set); Set set = new TreeSet(new SetDemo()); set.add(new Person("zhangfei",19)); set.add(new Person("guanyu",20)); set.add(new Person("zhaoyun",18)); set.add(new Person("mashaladi",30)); System.out.println(set); } @Override public int compareTo(Object o1, Object o2) { Person p1 = (Person)o1; Person p2 = (Person)o2; if(p1.getAge() > p2.getAge()){ return -1; }else if(p1.getAge() < p2.getAge()){ return 1; }else{ return 0; } } }
最后
以上就是文静小懒虫最近收集整理的关于【Iterator】的全部内容,更多相关【Iterator】内容请搜索靠谱客的其他文章。
发表评论 取消回复