Java笔记十一.集合类(二)

集合类(二)
一、数组类与容器类
   数组和其它容器的区别主要有三方面:效率,类型保存基本类型的能力.
1.数组:是一种效率很高的存储和随机访问对象引用序列的方式.数组是一 个简单的线性序列,因此访问速度很快,但也损失了其它一些特性.创建一个数组对象后,大小就固定了,如果空间不够,通常是再创建一个数组,然后把旧数组中的所有引用移到新数组中.数组可可以保存基本类型,容器不行. 
2.容器类不以具体的类型来处理对象,而是将所有的对象都以Object类型来处理,所以我们可以只创建一个容器,任意的Java对象都可以放进去.容器类可以使用包装类(Integer,Double等)以便把基本类型放入其中. List Set Map 都可以自动调整容量,数组不能。
 Collection<--List<--Vector
  Collection<--List<--ArrayList
  Collection<--List<--LinkedList
  Collection<--Set<--HashSet
  Collection<--Set<--HashSet<--LinkedHashSet
  Collection<--Set<--SortedSet<--TreeSet
  Map<-HashMap
  Map<-TreeMap
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)
二、List<E>   接口------以Array为基础

    List接口对Collection进行了简单的扩充,它的具体实现类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快,而LinkedList的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择。前面说的Iterator只能对容器进行向前遍历, ListIterator则继承了Iterator的思想,并提供了对List进行双向遍历的方法 
  Collection<--List<--Vector
  Collection<--List<--ArrayList
  Collection<--List<--LinkedList 
1.Vector<E> : 基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在可能的情况下,我们要多运用Array。另外很重要的一点就是Vector“sychronized”的,这个也是Vector和ArrayList的唯一的区别
2.ArrayList<E>:同Vector一样是一个基于Array上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。 
3.LinkedList<E>:LinkedList不同于前面两种List,它不是基于Array的,所以不受Array性能的限制。它每一个节点(Node)都包含两方面的内容:1.节点本身的数据(data);2.下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。 
   ArrayList和LinkedList都实现了List接口,ArrayList底层由数组支持LinkedList由双向链表支持,因此,如果经常在表中插入或删除元素LinkedList比较适合,如果经常查询ArrayList比较适合.
List总结: 
(1) 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]; 
(2)所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]; 
(3) 所有的List中可以有null元素,例如[ tom,null,1 ]; 
(4) 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。

三、Set<E>接口-----以HashMap为基础

        Set的实现有TreeSet,HashSet,LinkedHashSet,HashSet查询速度最快,LinkedHashSet保持元素插入次序,TreeSet基于TreeMap,生成一个总是处于排序状态的Set.
 Collection<--Set<--HashSet
  Collection<--Set<--HashSet<--LinkedHashSet
  Collection<--Set<--SortedSet<--TreeSet
    Set接口也是Collection的一种扩展,而与List不同的时,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。它的常用具体实现有HashSet和TreeSet类。HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了前面说过的哈希码的算法。TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口(一个类排序)有时多个类具有相同的排序算法,那就不需要在每分别重复定义相同的排序算法,只要实现Comparator接口(多个类排序)即可。集合框架中还有两个很实用的公用类:Collections和Arrays。Collections提供了对一个Collection容器进行诸如排序、复制、查找和填充等一些非常有用的方法,Arrays则是对一个数组进行类似的操作。 
1.HashSet<E>虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别HashSet的存储方式是把HashMap中的Key作为Set的对应存储项
看看HashSet的add(Object obj)方法的实现就可以一目了然了。
  public boolean add(Object obj)
  {
      return map.put(obj, PRESENT) == null;
  },这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。 
(1)概述:HashSet类继承于Set接口,基于哈希表实现的。需要注意的是,当多线程操作该HashSet集合时是不同步的,可以通过如下方法解决:
Set s = Collections.synchronizedSet(new HashSet(...));
java.lang.Object
         |->java.util.AbstractCollection<E>
                      |->java.util.AbstractSet<E>
                                    |->java.util.HashSet<E>(E - the type of elements maintained by this set)
(2)构造方法
HashSet()
Constructs a new, empty set; the backing HashMap instance has default initial capacity (16) and load factor (0.75).
HashSet(Collection<? extends E> c)
Constructs a new set containing the elements in the specified collection.
HashSet(int initialCapacity)
Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75).
HashSet(int initialCapacity, float loadFactor)
Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and the specified load factor.
(3)常用方法
boolean add(E e):向HashSet集合中添加一个指定的元素对象,这个元素在被添加之前是不存在的
void clear():删除HashSet集合中所有元素对象
boolean contains(Object o):判定HashSet集合中是否包含指定的元素对象
boolean isEmpty():判定HashSet集合是否为空
Iterator<E> iterator():将HashSet集合中的所有元素保存到Iterator对象中,以便Iterator遍历
boolean remove(Object o):移除集合中指定的对象元素
int size():获取HashSet集合中元素对象的个数
  • Methods inherited from class java.util.AbstractSet

    equals, hashCoderemoveAll
  • Methods inherited from class java.util.AbstractCollection

    addAllcontainsAllretainAlltoArray, toArray, toString
  • Methods inherited from class java.lang.Object

    finalizegetClass, notifynotifyAllwaitwaitwait
  • Methods inherited from interface java.util.Set

    addAll, containsAll, equals, hashCode, removeAll, retainAll, toArray, toArray
  • Methods inherited from interface java.util.Collection

    parallelStream, removeIf, stream
  • Methods inherited from interface java.lang.Iterable

    forEach
参考:http://docs.oracle.com/javase/8/docs/api/index.html
2.LinkedHashSet<E>:HashSet的一个子类一个链表
3.TreeSet<E>:SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的,是通过SortedMap来实现的。 
Set总结:
(1)Set实现的基础是Map(HashMap); 
(2) Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象;

四、Collection和Map-----区别在于每个位置保存的元素个数(前者只有一个对象,后者是两个对象组成的映射)

   Collection和Map是Java容器中的两种基本类型区别在于每个位置保存的元素个数
1.Collection
每个位置只能保存一个元素,包括List和Set.其中List以进入的顺序保存一组元素; 而Set中的元素不能重复.ArrayList是一种List,HashSet是一种Set,将元素添加入任意Collection都可以使用add() 方法。Map保存的是健值对.使用put()为Map添加元素,它需要一个健和一个值作参数.

2.Map

是一种把键对象值对象进行关联的容器,而一个值对象又可以是一个Map(类似多维数组),依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。Map有两种比较常用的实现:HashMap和TreeMapHashMap也用到了哈希码的算法,以便快速查找一个键TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。键和值的关联很简单,用pub(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。

(1)HashMap<K,V>类
a.概述:继承于Map接口,其中K-键对象,V-值对象。除了多线程无法同步,其操作与功能与Hashtable类几乎一致。为了实现防止多线程之间不同步的访问Map中的元素,可以使用如下方法解决线程不同步问题:Map m = Collections.synchronizedMap(new HashMap(...));
  • java.lang.Object
    • java.util.AbstractMap<K,V>
      • java.util.HashMap<K,V>
b.构造函数
HashMap():构造一个HashMap集合对象,其初始容量为16、默认加载因子为0.75
HashMap(int initialCapacity):构造一个HashMap集合对象,其初始容量为initialCapacity、默认加载因子为0.75
HashMap(int initialCapacity, float loadFactor):构造一个HashMap集合对象,其初始容量为...、默认加载因子为...
HashMap(Map<? extends K,? extends V> m):构造一个HashMap集合对象,该对象的内容与对象m相同
c.常用方法(K - the type of keys maintained by this map    V - the type of mapped values)
boolean containsKey(Object key) :判断Map集合中是否有指定的键对象
boolean containsValue(Object value) :判定Map集合中是否将一个或多个键映射到指定的值
V get(Object key) 获取指定键对象映射的值对象,如果Map集合中不存在该键对象的映射则返回null
boolean isEmpty() :判断Map集合是否为空集合
V put(K key, V value) :将指定的值对象关联到指定的键对象,并存储到Map集合中
V remove(Object key) :删除Map集合中指定的键对象
V replace(K key, V value) :替代指定键对象所对应的条目
public int size():获取Map集合中映射的个数
  • Methods inherited from class java.util.AbstractMap

    equals, hashCode, toString
  • Methods inherited from class java.lang.Object

    finalize, getClass, notify, notifyAll, wait, wait, wait
  • Methods inherited from interface java.util.Map

    equals, hashCode
参考:http://docs.oracle.com/javase/8/docs/api/index.html

你可能感兴趣的:(java)