• JAVA面试——容器


     

    1、Java的容器有哪些?

    Java容器分为Collection和Map两大类,其下又有很多子类,如下所示:

      ●Collection

        。List

        。ArrayList

        。LinkedList

        。Vector

          ■Stack

        。Set

        。HashSet

          ■LinkedHashSet

        。TreeSet

       ●Map

         。HashMap

        。LinkedHashMap

        。TreeMap

        。ConcurrentHashMap

        。Hashtable

     

     

     

    2、Collection和Collections有什么区别?

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

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

     

     

     

    3、 Collection 和 Collections 有什么区别?

      List、Set、Map的区别主要体现在两个方面:元素是否有序'是否允许元素重复。 三者之间的区别,如下表:

     

     

    4、 HashMap 和 Hashtable 有什么区别?

      •存储:HashMap运行 key 和 value 为 null, 而 Hashtable不允许。

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

      •推荐使用:在Hashtable的类注释可以看到,Hashtable是保留类不建议使用,推荐在单线程环境下使用 HashMap替代,如果需要多线程使用则用ConcurrentHashMap 替代。

     

     

     

    5、如何决定使用HashMap还是Tree Map?

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

     

     

     

    6、说一下HashMap的实现原理?

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

     

     

     

    7、说一下HashSet的实现原理?

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

     

     

     

    8、 Array List 和 Linked List 的区别是什么?

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

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

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

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

     

     

     

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

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

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

     

     

     

    10、 AirayList和Vector的区别是什么?

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

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

      •扩容:ArrayList和Vector都会根据实际的需要动态的调整容量,只不过在Vector扩容每次会增加1倍,而Array List只会增加50%。

     

     

    11、 Array 和 ArrayList 有何区别?

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

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

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

     

     

     

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

      •相同点:都是返回第4元素,并在队列中删除返回的对象。

      •不同点:如果没有元素 P〇ll()会返回null, 而 remove()会直接抛出NoSuchElementException 异常。

    代码示例:

    Queue queue = new LinkedList();
    queue. offer("string"); // add
    System, out. println(queue. poll());
    System, out. println(queue, remove());
    System, out. println(queue. size());

     

     

     

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

      Vector、Hashtable、Stack都是线程安全的,而像HashMap则是非线程安全的,不过在JDK 1.5之后随着Java. util, concurrent并发包的出现,它们也有了自己对应的线程安全类,比如HashMap对应的线程安全类就是ConcurrentHashMap。

     

     

    14、迭代器Iterator是什么?

      Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获雌代器实例。迭代器取代了 Java集合框架中的Enumeration,迭代器允许调用者在迭代过程中移除元素。

     

     

     

    15、 Iteratr怎么使用?有什么特点?

    Iterator使用代码如下:

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

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

     

     

     

    16、Iterator和 Listlterator有什么区别?

      • Iterator可以遍历Set和List集合,而Listlterator只能遍历List。

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

      • Listlterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一^元素、获取前面或后面元素的索引位置。

     

     

     

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

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

    示例代码如下:

    List<String> list = new ArrayListo ();
    list.add("x");
    Collection<String> clist = Collections.unmodifiableCollection(list);
    clist.add("y"); //运行时此行报错
    System.out.println(list.size());

     

  • 相关阅读:
    js最全的十种跨域解决方案
    最常用的~正则表达式相关js函数知识简洁分享【新手推荐】
    HTTP请求 响应状态码
    堆和栈的区别【以java为例潜入分析】
    练习110 编写一个将输入复制到输出的程序,并将其中的制表符替换成\t,把回退符替换成\b,把反斜杠替换成\\,这样可以将制表符和回退符以可见的方式显示出来
    练习111 你准备如何测试单词计数程序? 如果程序中存在某种错误,那么什么样的输入最可能发现这类错误?
    练习114 编写一个程序, 打印输入中各个字符出现频度的直方图。
    The C programming language Test
    进驻首日..感谢师父的教导
    练习112:编写一个程序,以每行一个单词的形式打印其输入。
  • 原文地址:https://www.cnblogs.com/xiaomingwang/p/11685527.html
Copyright © 2020-2023  润新知