集合中的简单知识

集合有一方面(其他方面我也不清楚,应该有其他方面吧0.0)是为了方便来使用的,在集合的底层也是使用数组或者链表来使用的,

就拿底层是数组的ArrayList来说,虽说集合是可增长的,但是在其内部也是先使用一个数组来存储,

如果添加的数据超过了这个数组的长度,集合也是建立一个新的数组来存储的,旧的舍弃。你可以用数组来代替

ArrayList去存储对象,但是java已经封装好了一个函数来写这个过程自己就不必再写了。

当然如果你认为ArrayList不方便可以自己写一个方法来实现这些功能。

集合分为单列集合和双列集合

单列集合的根接口是Collection

  Collection 下的接口分为list和set(你可以百度找找list和set集合中数据存储的特点)用迭代器Iterator来迭代(遍历)

    list接口下有ArrayList和LinkedList和vector,现在vector基本已经被ArrayList替代了,

      ArrayList集合因为底层用的是数组,所以查询快,修改快,增删慢,线程不安全,效率高;

        (数组查询可以用索引,利用索引修改,但是增删了数据其后面的数据都要往后/往前移动)

      LinkedList集合因为底层用的是链表,所以增删快,查询慢,修改慢,线程不安全,效率高;

        (链表查询是从第一个查到要查找的那一个,修改也要从第一个查找到要改的那一个,增加和删除只要找到并改动前一个和后一个的地址值就可以增删了)

      Vector底层也是用的数组,但是因为是线程安全的,所以效率较低。

    set接口下有HashSet和TreeSet,

      HashSet中只能存不同的对象,当然如果是你自己定义的对象的话,对象需要重写hashCode()和equals()方法,

      毕竟HashSet也不能靠着名字存不同且无序的对象;使用HashSet的时候是先比较hashCode()看值是否相同,相同的话调用equals()比较是否是相同的对象

      TreeSet中需要填进去的对象实现comparable接口并重写compareTo()方法(自然排序),当方法返回0时,集合中只有一个元素,

      当返回值为正数时怎么存就怎么取,返回值是负数时和存的顺序相反,在自己写类中利用compareTo的返回值来保证排序及唯一。

      (也能利用比较器来进行比较,即在TreeSet中传入comparator子类对象,用一个类实现comparator接口并传入TreeSeet中)

双列集合的根接口Map,即键值对存储内容

  Map的键是唯一的,而在Collection中的子体系set(元素)是惟一的。Set底层依赖的是Map,即单列集合依赖双列集合(主要是数据从有到无可以,从无到有不可能)

  Map中是没有Iterator迭代器的,但是在Map中又一个KeySet()方法,里面存储了key,可以通过key获得value即通过键和对应的值来获取。

  还有另一种比较推荐的获取键值对的方法:在Map实现类中有内部类Entry,即 Set<Map.Entry<K,V>,Map.Entry<k,v>是个接口的内部接口并且将建和值封装成了Entry对象,

  并存储在Set集合中(说着麻烦,多用几次就理解了)理解了后可以用增强for来做,比较简洁明了。(这里都是用的HashMap来说明的)

HashMap和Hashtable的区别 :HashMap是线程不安全的,效率高;

              Hashtable是线程安全的,效率低;

              HashMap可以存储null键和null值Hashtable不能;