数组与集合

  1. JAVA中集合和数组的区别

    一、数组声明了它容纳的元素的类型,而集合不声明。
    二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。
    三、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。
    四、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。
    
  2. Collection和Collections的区别

    1、Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。
    2、Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
    
  3. ArrayList和LinkedList 和Vector的区别

    1. 线程安全
       * Vector : 线程安全
       * ArrayList, LinkedList : 线程不安全
    2. 实现方式
       * LinkedList : 链表
       * ArrayList,Vector : 数组
    3. 扩容
       * ArrayList和Vector使用数组实现, 当数组长度不够,内部会创建一个更大的数组
       * LinkedList 不存在这方面的问题
    4. 速度
       * ArrayList 查改块, 增删慢 
       * LinkedList 查改慢, 增删快
       * Vector增删慢,查找慢
    
  4. list/set/map的区别

    1、list和set是实现了collection接口的。
    2、list可以允许重复的对象。可以插入多个null元素。是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。Set不允许重复对象,无序容器,你无法保证每个元素的存储顺序。
    3、Map不是collection的子接口或者实现类。Map是一个接口。Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
    
  5. HashSet和TreeSet和LinkedHashSet区别

    1.HashSet
    无序
    非线程安全
    集合元素中可以存放一个null
    2.TreeSet
    默认自然顺序的有序集合
    非线程安全
    3.LinkedHashSet
    保存元素添加顺序的有序集合
    非线程安全
    
  6. HashMap和HashTable的比较

    继承类不同:
    A.HashMap继承AbstractMap
    B.Hashtable继承Dictionary
    
    执行效率不同:
    A.HashMap是非线程安全的,是Hashtable的轻量级实现,效率较高
    B.Hashtable是线程安全的,效率较低
    
    put方法对key和value的要求不同
    A.HashMap允许Entry的key或value为null
    B.Hashtable不允许Entry的key或value为null,否则出现NullPointerException
    
    有无contains方法
    A.HashMap没有contains方法
    B.Hashtable有contains方法
    
  7. HashMap和ConcurrentHashMap区别

    ConcurrentHashMap是线程安全的,HashMap不是线程安全的;
    HashMap允许key和value为空,ConcurrentHashMap不允许;
    HashMap在用iterator遍历的同时,不允许修改HashMap;ConcurrentHashMap允许该行为,并且更新对后续的遍历是可见的;
    
  8. HashMap 底层实现原理

    jdk1.8后,HashMap的底层是通过数组+链表+红黑树来实现的
    1.获取到传过来的key,调用hash算法获取到hash值
    2.获取到hash值之后调用indexFor方法,通过获取到的hash值以及数组的长度算出数组的下标
    3.把传过来的key和value存到该数组下标当中。
    4.如该数组下标下以及有值了,则使用链表,jdk7是把新增元素添加到头部节点 jdk8则添加到尾部节点。
    5.当链表的长度大于或等于8的时候则会把链表变成红黑树,以提高查询效率,因为链表结构的查询效率是非常低的,他不像数组,能通过索引快速找到想要的值,链表只能挨个遍历,当hash冲突非常严重的时候,链表过长的情况下,就会严重影响查询性能,使用红黑树可以迅速遍历,得到下标的状态,判断下一步操作是否存储数据
    
  9. HashMap和LinkedHashMap的区别?

    1.HashMap
    它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。遍历时,取得数据的顺序是完全随机的;
    最多只允许一条记录的键为Null;允许多条记录的值为Null;
    不支持线程的同步(非线程安全),即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致;
    2.LinkedHashMap
    LinkedHashMap就是链表+散列表的结构,保存了记录的插入顺序,其底层采用了Linked双向链表来保存节点的访问顺序,所以保证了有序性。在遍历的时候会比HashMap慢,不过有种情况例外:当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢。因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
    
  10. ArrayList/LinkedList /HashMap初始大小,add后是多少?(jdk1.8)

    ArrayList:
    初始化大小是0 第一次添加后变成10( 扩容点规则是,新增的时候发现容量不够用了,就去扩容 扩容大小规则是,扩容后的大小= 原始大小+原始大小/2 + 1)
    
    HashMap:
    1,初始化大小是16,如果事先知道数据量的大小,建议修改默认初始化大小。 减少扩容次数,提高性能 ,这是我一直会强调的点
    2,最大的装载因子默认是0.75,当HashMap中元素个数达到容量的0.75时,就会扩容。 容量是原先的两倍 
    
    linkedList
    linkedList 是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值