• 28.java中的集合框架的相关面试题[20220730]


    Collection接口与Map接口的区别?

    Collection接口是处理单列数据值的最大接口;
    Map接口是处理键值对数据值的最大接口。

    List接口与Set接口的区别?

    List接口处理有序的单列数据值的接口,可以有重复元素,重复的元素按照顺序区分;
    Set接口处理无序的单列数据值的接口,不能有重复元素,重复的元素被视为一个。

    ArrayList类与LinkedList类的区别?

    ArrayList 和 LinkedList 都是List接口的子类,间接实现Collection接口
    Collection接口处理单列数据的接口,自然ArrayList 和 LinkedList都是处理单列数据的类
    ArrayList类
        1.动态数组的存储结构
        2.添加/删除数据慢,查询数据快
        3.没有提供对第一个和最后一个元素的操作方法
        4.有10个单位的初始容量
        5.扩容机制是原来的1.5倍
    LinkedList类
        1.双向链表的存储结构
        2.添加/删除快,查询数据慢
        3.提供对第一个和最后一个元素的操作方法
        4.没有初始容量
        5.没有扩容机制

    ArrayList和Vector的区别是什么?

    ArrayList 和Vector 都属于集合
    Vector 是实现了线程同步,是线程安全
    ArrayList 没有实现线程同步,是非线程安全
    ArrayList 的执行性能优于Vector
    Vector集合中数据的自动扩展是原来的1倍
    ArrayList集合中数据的自动扩展是原来的1.5倍
    如果不需要线程安全的实现,建议使用ArrayList代替Vector。
    ArrayList取代了Vector。

    ArrayList类与数组的区别?

            ArrayList类是动态数组的存储结构,随着元素的增加存储空间会自动扩展,扩容机制是原来的1.5倍
            数组不是动态数组的存储结构,不会随着元素的增加自动扩展存储空间,它的存储空间是固定,一旦超过就会报错。

    LinkedHashSet与HashSet区别?

    HashSet是Set接口最常用的实现类,底层数据结构是哈希表,HashSet不保证元素的顺序但保证元素必须唯一。
    LinkedHashSet也是Set接口的实现类,底层数据结构是链表和哈希表,哈希表用来保证元素唯一,链表用来保证元素的插入顺序,即FIFO(First Input First Output 先进先出)。

    HashMap类与Hashtable类与TreeMap类与ConcurrentHashMap类区别?

    HashMap类与Hashtable类与TreeMap类与ConcurrentHashMap类都是Map接口的子类,自然是都可以处理键值对数据。
    HashMap类
        1.HashMap 继承自AbstractMap
        2.数据保存是无序的
        3.重复的键被算作是一个数据。
        4.允许有null键,null值
        5.初始容量16
        6.扩容为原来的2倍
        7.根据key【键】的得到hashcode值,然后根据这个hashcode值计算元素在集合中的位置。
        8.非线程安全

    Hashtable类
        1.Hashtable继承自Dictionary
        2.数据保存是无序的
        3.重复的键被算作是一个数据。
        4.不允许有null键,null值
        5.初始容量11
        6.扩容为原来的2n+1
        7.Hashtable的对象得到hashcode值,通过除数留余的计算方法来算出元素在集合中的位置
        8.线程安全

    TreeMap类
        1.继承自AbstractMap
        2.数据保存是有序按照字母顺序排列
        3.重复的键被算作是一个数据。
        4.允许有null键,不允许null值,键最好是String类型
        5.没有初始容量
        6.没有扩容机制
        7.红黑树基于NavigableMap实现
        8.非线程安全

    ConcurrentHashMap类
        1.继承自AbstractMap
        2.数据保存是无序的
        3.重复的键被算作是一个数据。
        4.不允许有null键,null值
        5.初始容量16
        6.jdk8中,采用多线程扩容。整个扩容过程,通过CAS设置sizeCtl,transferIndex等变量协      调多个线程进行并发扩容。多线程无锁扩容的关键就是通过CAS设置sizeCtl与transferIndex变量,协调多个线程对table数组中的node进行迁移。
        7.如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap代替Hashtable 。 
        8.线程安全

    HashMap的实现原理?

    HasMap是数据+链表+红黑树(JDK1.8    增加了红黑树部分)实现的即哈希表和红黑树。首先有一个数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组中的同一位置了,这时候就添加到同意hash值元素的后面,他们在数组的同一位置,但是形成了链表,同一链表上的hash值是相同的,所以说数组存放的是链表,而链表的长度大于8时,链表就转换为红黑树,这样大大提高查找效率。

    Collection和Collections有什么区别?

    Collection是接口,提供了对集合中元素的一些操作方法
    【add() , get(int  index)  remove(Object)】,
    这些方法所操作的数据都是单列数据  
    常用接口  
    List----有序的单列数据接口 【根据index操作的一些方法】
    Set----无序的单例数据接口 【不包括根据index操作的方法】,因为无序所以重复的元素算作一个
    Collection接口java中处理单列数据的顶级接口
    Map接口java中处理键值对数据的顶级接口

    Collections---是个工具类,这个工具类中主要提供了一组对集合进行的方法
    排序,比较,线程安全......
    sort(List)  copy(List1,List2).....
    提供的方法都是静态方法,访问的时候无需创建对象,类名就可以完调用。
    Collections是java集合框架的帮助类。
    类似这种帮助类的存在还有 Arrays类,数组的帮助类。

    如何决定使用HashMap还是TreeMap?

    HashMap实现过Map接口,TreeMap也实现过Map接口,都可以操作键值对数据。
    一般我们如果只是需要对键值对数据进行,添加,查找等基本操作最好使用HashMap,因为它的执行速度相对比较快。
    如果我们需要有序遍历集合中的键值对数据,最好使用TreeMap,因为TreeMap中添加的数据是有序的,根据二叉树结构来存储键值对数据。

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

    数组转换list集合需要使用Arrays类中的asList(数组)

    1. String names[]={"zhangsan","lisi","wangwu"};
    2. List<String> stringList=Arrays.asList(names);

    List转换成数组通过toArray的方法转换,toArray的方法返回值是Object数组

    1. List<String> strlist=new ArrayList<String>();
    2. strlist.add("javase");
    3. strlist.add("javaee");
    4. strlist.add("javame");
    5. Object arr[]=strlist.toArray();
    6. String names[]=new String[arr.length];
    7. int index=0;
    8. for(Object obj:arr){
    9. names[index]=(String)obj;
    10. index++;
    11. }
    12. System.out.println("len=="+names.length);

    迭代器 Iterator 是什么?Iterator 怎么使用?有什么特点?

     Iterator --- 遍历Collecrion接口集合的操作接口。【Collecrion接口的子接口/子类可以使用Iterator来遍历集合】
    Iterator遍历单列数据集合的操作接口

    1. List<String> stringlist=new ArrayList<String>();
    2. stringlist.add("zhangsan");
    3. stringlist.add("lisi");
    4. stringlist.add("wangwu");
    5. //使用迭代器遍历集合
    6. Iterator<String> iterator=stringlist.iterator();
    7. //hasNext()--判断是否有下一个元素
    8. while(iterator.hasNext()){
    9. //next()---取得下一个元素
    10. String res=iterator.next();
    11. System.out.println(res);
    12. }

    Map接口和它的集合类没有迭代器 Iterator
    迭代器 Iterator的特点是更加安全,因为它可以保证在当前遍历的集合元素被更改的时候抛出异常ConcurrentModificationException【当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。】

  • 相关阅读:
    python连接orcal数据库以及解决1047报错方法(已解决)
    class MultiScaleRoIAlign(nn.Module):
    埃氏筛法与线性筛法
    SSD【目标检测篇】
    windows bat批处理文件,实现某个软件的重启
    Worthington解离酶:中性蛋白酶(分散酶)详情解析
    java计算机毕业设计Web前端开发技术儿童教育网站MyBatis+系统+LW文档+源码+调试部署
    Android单编模块报FAILED: ninja: unknown target ‘MODULES-IN-vendor错误解决
    如何实现制造业信息化转型?
    c语言实现面向对象编程(const * ,* const)
  • 原文地址:https://blog.csdn.net/guizhaiteng/article/details/126070230