关于List接口

迭代器 Iterator 是什么?

Iterator 接口提供遍历任何 Collection 的接口,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。

Iterator 怎么使用?

  • Iterator():要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
  • next():获得序列中的下一个元素 。
  • hasNext():检查序列中是否还有元素。
  • remove():将迭代器新近返回的元素删除。

Iterator 有什么特点?

  • Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationEception的异常。
  • Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素,删除的是上一次Iterator.next()方法返回的对象。
  • Iterator必须依附于一个集合类对象而存在,Iterator本身不具有装载数据对象的功能。
  • next()方法,该方法通过游标指向的形式返回Iterator下一个元素。

Enumeration和Iterator的区别?

  • Enumeration的速度是Iterator的两倍,也使用更少的内存。
  • Enumeration是非常基础的,也满足了基础的需要。但是,与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。
  • 迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到。

如何边遍历边移除 Collection 中的元素?

Iterator<Integer> it = list.iterator();
while(it.hasNext()){
   *// do something*
   it.remove();
}

错误移除代码:

for(Integer i : list){
   list.remove(i)
}

使用 foreach(for(Integer i : list)) 语句时,会自动生成一个iterator 来遍历该 list,但同时该 list 正在被 Iterator.remove() 修改,而Java 一般不允许一个线程在遍历 Collection 时另一个线程修改它。

Iterator 和 ListIterator的区别?

  • Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
  • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
  • ListIterator 实现 Iterator 接口,然后添加了一些额外的功能,比如添加一个元素(add())、替换一个元素(set())、获取前面或后面元素的索引位置(previousIndex()和nextindex())。

遍历一个 List 有哪些不同的方式?实现原理是什么?Java 中 List 遍历的最佳实践是什么?

  • for 循环遍历。
    计数器原理:在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止。
  • 迭代器遍历。
    Iterator:Iterator 是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,统一遍历集合的接口。Java 在 Collections 中支持了 Iterator 模式。
  • foreach 循环遍历。
    内部采用 Iterator 的方式实现,使用时不需要显式声明 Iterator 或计数器:优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过程中操作数据集合,例如删除、替换。

ArrayList 和 LinkedList的 区别?

  • ArrayList是基于动态数组的数据结构实现,LinkedList是基于链表结构。
  • 对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
  • 对于非首尾新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
  • LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
  • ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全。

ArrayList 和 Vector 的区别?

  • Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
  • ArrayList 在性能方面要优于 Vector。
  • ArrayList 和 Vector 都可以动态的调整容量, Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。

ArrayList 、 LinkedList和Vector 的应用场景

  • ArrayList :适合顺序添加、随机访问的场景。(不同步)
  • LinkedList:随即访问少,插入、删除多的场景。(不同步)
  • Vector:适合随即访问多,插入、删除少的场景。(同步)

多线程场景下如何使用 ArrayList?

ArrayList是非线程安全的,在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况;并且一个线程在遍历List,另一个线程修改List,会报ConcurrentModificationException(并发修改异常)错误。

  • 用老的Vector集合
  • 使用Collections.synchronizedList
List<String> list = Collections.synchronizedList(new ArrayList<String>());
list.add("1");
list.add("2");
list.add("3");

synchronized (list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext()) {
        //foo(i.next());
        System.out.println(i.next());
    }
}

为什么add()不需要synchronized,而遍历的时候需要加synchronized?
因为add()等方法的时候是加了synchronized关键字的,但是listIterator(),iterator()却没有加,所以在使用的时候需要加上synchronized。

List 和 Set 的区别?

  • List , Set 都是继承自Collection 接口
  • List 特点:一个有序容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
  • Set 特点:一个无序容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。
  • List 支持for循环,也可以用迭代器,set只能用迭代。
  • Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
  • List:List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变

ArrayList默认大小是多少,是如何扩容的?

Jdk1.7之前ArrayList默认大小是10,JDK1.7之后是0,JDK差异,每次约按1.5倍扩容。

如何实现数组和 List 之间的转换?

  • 数组转 List:使用 Arrays. asList(array) 进行转换。
  • List 转数组:使用 List 自带的 toArray() 方法。

Arrays.asList方法后的List可以扩容吗?

Arrays.asList使用的是final数组,并且不支持add方法,不支持扩容。

关于Stack

Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值