zoukankan      html  css  js  c++  java
  • 容器类总结

     

     

     

    Java容器可分为两大类:
    Collection:
    • List:
      • ArrayList
      • LinkedList
      • Vector
    • Set:
      • HashSet
        • LinkedHashSet
      • TreeSet
    Map:
    • HashMap
    • TreeMap
    • ConcurrentHashMap 

    ArrayList和Vector的区别
    相同点:
    • 两个都是实现了List接口的类,都是有序的集合,而且都允许为Null和重复,可以根据索引位置来去取出元素
    不同点:
    • Vector已经过时了,Vector是安全的,在源码底层是使用synchronized关键字来进行保证线程安全的。
    • 扩容时候Vector是1倍而ArrayList是0.5倍
    • Vector为什么被废弃:除了已经陈述的关于使用Vector的答案之外,Vector还有一些围绕枚举和元素检索的方法,这些方法与List接口不同,开发人员(特别是那些在1.2之前学习Java的人)可以倾向于使用它们,如果他们在码。尽管Enumerations速度更快,但它们不会检查集合是否在迭代期间被修改,这可能会导致问题,并且考虑到可能会选择Vector进行同步 - 通过多个线程的伴随访问,这使得它成为一个特别有害的问题。这些方法的使用也将大量代码耦合到Vector,因此用不同的List实现替换它并不容易。

    HashMap和Hashtable的区别
    相同点:
    • 都是实现了Map接口
    不同点:
    • HashMap不是安全的,Hashtable是安全的,在源码底层是使用synchronized关键字来进行保证线程安全的。
    • HashMap允许为Null,HashTable不允许为Null,因为hashtable,concurrenthashmap它们是用于多线程的,并发的 ,如果map.get(key)得到了null,不能判断到底是映射的value是null,还是因为没有找到对应的key而为空,而用于单线程状态的hashmap却可以用containKey(key) 去判断到底是否包含了这个null。
    • Hashtable有contains方法,HashMap把Hashtable的contains方法去掉了,改成了containsValue和containsKey。
    • 为什么Hashtable被废弃:因为继承的字典类是一个不包含非抽象方法的抽象类,被弃用了。

    List和Map的区别
    不同点:
    • 存储结构不同
      • List是存储单列的集合
      • Map存储的是key-value键值对的集合
    • 元素是否可重复
      • List允许元素重复
      • Map不允许key重复
    • 是否有序
      • List集合是有序的(存储有序)
      • Map集合是无序的(存储无序)

    Set中的元素不允许重复,是通过什么方法来保证的

    通过查看源码其实可以发现
       // 1. 如果key 相等  
        if (p.hash == hash &&
            ((k = p.key) == key || (key != null && key.equals(k))))
            e = p;
        // 2. 修改对应的value
           if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
           }
    在源码中如果Key是相同,它就修改了一个无用了。Set集合如果添加的元素相同时,是根本没有插入的(仅修改了一个无用的value值)!从源码(HashMap)中也看出来,==和equals()方法都有使用到

    Collection和Collections有什么区别
    • Collection是集合的上级接口,继承它的有Set和List接口
    • Collections是集合的工具类,提供了一系列的静态方法对集合的搜索、查找、同步等操作

    说出ArrayList,LinkedList的存储性能和特性

    ArrayList的底层是数组,LinkedList的底层是双向链表。

    • ArrayList它支持以角标位置进行索引出对应的元素(随机访问),而LinkedList则需要遍历整个链表来获取对应的元素。因此一般来说ArrayList的访问速度是要比LinkedList要快的
    • ArrayList由于是数组,对于删除和修改而言消耗是比较大(复制和移动数组实现),LinkedList是双向链表删除和修改只需要修改对应的指针即可,消耗是很小的。因此一般来说LinkedList的增删速度是要比ArrayList要快的

    ListIterator有什么特点
    • ListIterator继承了Iterator接口,它用于遍历List集合的元素
    • ListIterator可以实现双向遍历,添加元素,设置元素


    Java中HashMap的key值要是为类对象则该类需要满足什么条件?

    需要同时重写该类的hashCode()方法和它的equals()方法

    • 从源码可以得知,在插入元素的时候是先算出该对象的hashCode。如果hashcode相等话的。那么表明该对象是存储在同一个位置上的。
    • 如果调用equals()方法,两个key相同,则替换元素
    • 如果调用equals()方法,两个key不相同,则说明该hashCode仅仅是碰巧相同,此时是散列冲突,将新增的元素放在桶子上

    一般来说,我们会认为:只要两个对象的成员变量的值是相等的,那么我们就认为这两个对象是相等的!因为,Object底层比较的是两个对象的地址,而对我们开发来说这样的意义并不大~这也就为什么我们要重写equals()方法

    重写了equals()方法,就要重写hashCode()的方法。因为equals()认定了这两个对象相同,而同一个对象调用hashCode()方法时,是应该返回相同的值的!

     
  • 相关阅读:
    在返回值拒绝——reference
    传参时,使用引用替换变量
    C++设计与声明——让接口容易被正确使用
    三角函数的天下
    渲染流水线
    设置Shader关键字高亮(网上转)
    平衡二叉树,AVL树之代码篇
    2017-2018-1 20155205 嵌入式C语言——时钟
    GDB基础学习
    20155205 《信息安全系统设计基础》课程总结
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/13191274.html
Copyright © 2011-2022 走看看