面试汇总——JavaSE——集合(一)

根据牛客网的面试经验的题进行的汇总,里面的内容是看别人的博客或者其东西进行汇总的,将这些的知识总结一下,方便自己查看和复习用
牛客网

集合(一)

List
请说明List、Map、Set三个接口存取元素时,各有什么特点?
  • List

    • public interface List<E> extends Collection<E> 
      
    • 是一个有序的容器

    • 可以有重复的值,也可以存在null

    • 添加的顺序就是输出的顺序

    • List<Integer> list = new ArrayList<Integer>();
              list.add(3);
              list.add(1);
              list.add(8);
              list.add(0);
              Iterator<Integer> iterator = list.iterator();
              while (iterator.hasNext()){
                  System.out.println(iterator.next());
              }
      
    • 应用场景:当知道索引,且想要元素按(插入)序输出时,我们可以使用List,ArrayList可以快速实现查找,LinkedList对于删除和增加效果更好些

      • ArrayList
        • 实现了基于动态数组的数据结构,在内存里是连着放的
        • 更有利于查找
        • 线程不安全
        • 扩容为原来1.5倍
      • LinkedList
        • 基于链表的数据结构
        • 有利于删除和增加
      • Vector
        • Vector是多线程安全的
        • 设置了增长因子,ArrayList没有设置
        • 在集合中使用数据量比较大的数据
        • 扩容为原来2倍
  • Map

    • public interface Map<K, V> 
      
    • k-v对,k值不能重复,v值可以重复

    • map的每个entry持有两个对象,一个是key,一个是value

    • 应用场景:当使用到键值对时,可以使用map,TreeMap还可以实现排序,因为其实现了Comparable()和CompareTo()

      • HashMap
        • 实现hash算法
      • LinkedHashMap
      • TreeMap
        • 线程不安全
      • HashTable
        • 线程安全,不允许有null值
  • Set

    • public interface Set<E> extends Collection<E> 
      
    • 无序且不重复

    • 只允许有一个null值

    • 应用场景:当你希望自己添加的元素不要出现重复时,可以使用set,并且TreeSet实现了SortedSet因此还可以实现排序,因为其实现了Comparable()和CompareTo(),LinkedHashSet也按照插入的顺序进行存储

      • HashSet
        • 是无序的,只允许一个null值
      • LinkedHashSet
      • TreeSet
        • 二叉树(红黑树的树据结构)
        • 实现了compare()和compraeto(),更适合实现排序
        • 不允许有null值
ArrayList
阐述ArrayList、Vector、LinkedList的存储性能和特性
  • ArrayList

    • 是基于线性存储的,其内存中是连续的
    • 其查找效率高
    • 线程不安全
  • Vector

    • 线程安全,也因此效率不高
    • 适合大量数据的存储
  • LinkedList

    • 线性链表,更加适合插入和删除
请说明ArrayList和LinkedList的区别?
  • ArrayList
    • 其内存是连续的,所以更加适合通过索引来进行查找
  • LinkedList
    • 其内部是链式存储,内存利用率更高,适合删除和插入
    • 更占内存,因为为每一个节点存储两个引用,一个指向前一个元素,一个指向后一个元素
collection接口
请判断List、Set、Map是否继承自Collection接口?

Map不是继承自Collection接口

集合
请讲讲你所知道的常用集合类以及主要方法?
  • List

    • ArrayList
      • add(),remove(),replace(),get(),indexOf(),size(),set(),clone(),toArray(),iterator(),sort()…
    • LinkedList
      • add(),remove(),replace(),get(),indexOf(),size(),set(),push(),pop(),clone(),toArray()…
  • Set

    • HashSet

      • clone(),remove(),add(),iterator(),clear()…
    • LinkedHashSet

      • public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, Serializable
        
    • TreeSet

      • clone(),iterator(),comparator(),size(),add()…
请说明Collection 和 Collections的区别。
  • Collection是接口,List,Set实现其接口
  • Collections是工具类,里面封装了许多方法
请你说明HashMap和Hashtable的区别?
  • HashMap
    • 线程不安全,效率高
    • key,value可以为null
  • HashTable
    • 线程安全,效率不高
    • 不能有null
请说说快速失败(fail-fast)和安全失败(fail-safe)的区别?

安全失败和快速失败都是对于迭代器而言的,在每次调用hasNext()/next()的时候即变遍历集合中的元素,会进行对modCount的判断,如果在迭代的过程中集合中的元素发生了修改(add(),delete()…),会导致modCount的值发生变化,即导致modCount!=expectedmodCount此时就会抛出ConcurrentModificationException异常;但是对modCount的判断是基于 modCount!=expectedmodCount,但如果此时expectedmodCount也发生变化,导致modCount==expectedmodCount,那么此时就不会抛出异常,所以不能依赖于异常来看是否执行了并非操作

  • 快速失败
    • java.util都是快速失败
    • 原理:是对原集合进行遍历,当有线程对数据进行操作时,会使集合中的数据改变,就会抛出异常
  • 安全失败
    • java.util.concurrent都是安全失败
    • 原理:是先将原数据进行拷贝,对拷贝的数据进行遍历,当有线程对数据进行操作时,即是集合中的原数据发送了改变,但不会影响迭代器的遍历,所以不会有异常
    • 适合于在多线程并非使用,并非修改
请你说说Iterator和ListIterator的区别?
  • ListIterator

    • public interface ListIterator<E> extends Iterator<E> 
      

    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gcskU59r-1616905667122)(面试.assets/image-20210328113314666.png)]

    • ListIterator是对List进行操作的

    • 是双向遍历,并且可以对元素进行修改

    • public class Ite2 {
          public static void main(String[] args) {
              List<Integer> list = new ArrayList<>();
              list.add(90);
              list.add(23);
              list.add(65);
              list.add(12);
              System.out.println(list);
              ListIterator<Integer> iterator = list.listIterator();
              while (iterator.hasNext()){//向后判断
                  if (iterator.next().equals(23)){
                      System.out.println("nextIndex->" + iterator.nextIndex());//下一个索引
                      iterator.add(100);//添加
                  }
              }
              System.out.println("next->" + list);
              while (iterator.hasPrevious()) {//向前判断
                  if (iterator.previous().equals(100)){
                      System.out.println("previousIndex->" + iterator.previousIndex());//前一个索引
                      iterator.set(1);//赋值
                  }
              }
              System.out.println("previous->" + list);
          }
      }
      
  • Iterator

    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9Q74GGN-1616905667124)(面试.assets/image-20210328113335844.png)]

    • 如果想对集合的元素安全的进行修改只能调用remove(),如果调用集合中的修改方法则会抛出异常

    • Iterator可以对List和Set都操作

    • 只能单向遍历

    • public class Ite1 {
          public static void main(String[] args) {
              Set<Integer> sets = new HashSet<>();
              sets.add(34);
              sets.add(16);
              sets.add(90);
              sets.add(54);
              Iterator<Integer> iterator = sets.iterator();
              System.out.println(sets);
              while (iterator.hasNext()){
                  if (iterator.next().equals(16)) {
                      iterator.remove();//删除
      //                sets.remove(16);//删除  java.util.ConcurrentModificationException
                  }
              }
              System.out.println(sets);
          }
      }
      
请简单说明一下什么是迭代器?

Iterator就是用来遍历集合(Collection)中元素的方法,你不需要直到元素是什么类型,只需要调用iterator(),即可完成对元素的遍历

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值