容器类总结

 

 

 

 

 

 

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()方法时,是应该返回相同的值的!

 

 

posted @ 2020-06-25 10:39  smartcat994  阅读(275)  评论(0编辑  收藏  举报