概述
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接口
public 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有序可重复
public 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倍
public 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方法
import 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】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复