• 容器


    1.Java容器有哪些?

      Collection

    List

    • ArrayList
    • LinkedList
    • Vector
    • Stack

    Set

    • HashSet
    • LinkedHashSet
    • TreeSet

      Map

    • HashMap
    • LinkedHashMap
    • TreeMap
    • ConcurrentHashMap
    • Hashtable

    2.Collection和Collections是有什么区别?

      Collection:是一个集合接口,它提供了对集合对象进行进步操作的通用接口方法,所有集合都是它子类,比如List、Set等。

      Collentions:是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法:Collentions.sort(list)。

    3.List、Set、Map之间的区别是什么?

      List:元素是有序的,允许重复。

      Set:元素是无序的,不允许重复。

      Map:元素是无序的,key(是唯一的)不允许重复value允许重复。

    4.HashMap和Hashtable有什么区别?

    储存:HashMap允许key和value为null,Hashtable不允许。

    线程安全:Hashtable是线程安全的,HashMap是非线程安全的。

      Hashtable是保留类不建议使用,推荐在单线程的情况下使用HashMap替代,多线程的情况下使用ConcurrentHashMap替代。

    5.如何决定使用HashMap还是TreeMap?

      对于在Map中插入、删除、定位一个元素这些操作,HashMap是最好的选择,因为HashMap的插入会比TreeMap快,但要对key集合进行有序的遍历,那么TreeMap则是更好的选择。

    6.说一下HashMap实现原理

      HashMap是基于Hash算法实现的,通过put(key, value)方式存储,get(key)获取,当传入key时HashMap会根据key.hashCode()计算出hash值,根据hash值讲value保存在bucket里。当计算出hash值相同时(hash冲突),HashMap的做法是用链表和红黑树存储相同hash值的value。当冲突个数比较少时,使用链表否则使用红黑树。

    7.说一下HashSet的实现原理

      HashSet是基于HashMap实现的,HashSet底层使用HashMap保存所有元素,因此HashSet的实现比较简单,相关HashSet操作基本都是直接调用底层HashMap的相关方法来完成,HashSet不允许值重复。

    8.ArrayList和LinkedList的区别是什么?

    数据结构实现:ArrayList是动态数组的数据结构实现,LinkedList是双向链表的数据结构实现。

    随机访问效率:ArrayList比LinkedList在随机访问的时候效率要高,因为LinkedList是线性的存储方法,所以需要移动指针从前往后依次查找。

    新增和删除效率:在非首尾的新增和删除操作,LinkedList比ArrayList效率要高,因为ArrayList的增删操作会影响数组内的其他数据下标。

      需要频繁读取集合中的元素时,推荐使用ArrayList,而在新增和删除操作较多时,更推荐使用LinkedList。

    9.如何实现数组和ArrayList的转换?

      数组转List:使用Arrays.asList(array)进行转换。

      List转数组:使用List自带的toArray()方法。

    10.ArrayList和Vector的区别是什么?

      线程安全:ArrayList是非线程安全的,Vector使用了Synchronized来实现线程同步,是线程安全的。

      性能:ArrayList在性能方面要优于Vector。

      扩容:Vector每次扩容都会增加一倍,而ArrayList只会增加50%。

    11.Array和ArrayList有什么区别?

    Array可以存储基本数据类型和对象,ArrayList只能存储对象。

    Array是指定固定大小的,而ArrayList大小可以自动扩展。

    Array内置方法没有ArrayList多,比如addAll、removeAll。

    12.在Queue中poll()和remove()有什么区别?   

    相同点:都是返回第一个元素,并在队列中删除。

    不同点:如果没有元素poll方法会返回一个null,remove方法会直接抛出NoSuchElementException(无此元素)异常。

    13.哪些集合类是线程安全的?

      Vector、Hashtable、Stack和JDK1.5之后提供的ConcurrentHashMap都是线程安全的。

    14.迭代器Iterator是什么?

      Iterator接口提供了遍历任何Collection的接口,可以从Collection中使用迭代器方法获取Iterator实例,迭代器允许调用者在迭代过程中删除元素。

    15.Iterator怎么使用?有什么特点?

      Iterator的使用示例如下

    List<String> list = new ArrayList<>();
    Iterator<String> it = list.iterator();
    while(it.hasNext){
      String obj = it.next();
      System.out.pringln(obj);      
    }
    View Code

      Iterator的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException(并发修改)异常。

    16.Iterator和ListIterator有什么区别?

    Iterator可以遍历List、Set集合,而ListIterator只能遍历List集合。

    Iterator只能单向遍历,ListIterator可以双向遍历(向前/向后)。

    ListIterator从Iterator接口继承,然后添加了一些额外的功能,例如添加一个元素、替换一个元素等。

    17.怎么确保一个集合不能被修改?

      可以使用Collections.unmodifiableCollection(Collection c)(Collections的不可修改的集合)方法创建一个只读集合,这样改变集合的任何操作都会抛出java.lang.UnsupportedOperationException(不支持的操作)异常。

      示例如下

    List<String> list = new ArrayList<>();
    list.add("x");
    Collection<String> clist = Collections.unmodifiableCollection(list);
    clist.add("y");
    System.out.println(list.size());
    View Code
  • 相关阅读:
    linux系统中如何查看日志 (转)
    php 获取随机字符串(原创)
    php Aes 128位算法
    linux 在线实验
    number随时间随机递增每天 不同 php(原创)
    php 判断字符串包含中文(转)
    同步,异步 阻塞,非阻塞, 异步+回调机制 线程队列 事件Event 丶协程
    线程的理论知识 开启线程的两种方式(Thread) 线程和进程之间的对比 线程的其他方法 守护进程 互斥锁 死锁现象,递归锁 信号量
    获取进程以及父进程的pid 验证进程之间的数据隔离 join方法 进程对象的其他属性 僵尸进程与孤儿进程(存在Linux系统中) 守护进程
    进程基础知识 操作系统 操作系统的发展史(多道技术) 进程介绍 python并发编程之:多进程
  • 原文地址:https://www.cnblogs.com/bl123/p/14979434.html
Copyright © 2020-2023  润新知