【java基础】02.Collection类集

来源:互联网 发布:game ec 源码 编辑:程序博客网 时间:2024/06/04 00:08
1.集合集合中存放的依然是对象的引用而不是对象本身。
    1)集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。
        2) 集合当中放置的都是Object类型,因此取出来的也是Object类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。 

2.List
List集合特有的迭代器:ListIterator是Iterator的子接口
 
    --ArrayList:底层数据结构是数组结构,查询较快,增删较慢,线程不同步
    --LinkedList:底层数据结构是链表结构,增删较快,查询较慢     
    --Vector:底层数据结构是数组结构,线程同步

2.1.arraylist与Vector相似,Vector是同步
我们可以将其看作是能够自动增长容量的数组
    利用ArrayListtoArray()返回一个数组。arrays.asList()返回一个列表。迭代器(Iterator)给我们提供了一种通用的方式来访问集合中的元素。
    1)ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10Object类型数组
    2) 如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。
    3) 对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。
判断元素存在或删除等操作时,依赖于元素的equals方法
2.2.Linkedlist
注意:LinkedList中的方法remove和poll的区别,若LinkedList为空,则removeXXX()方法抛出异常,而pollXXX()方法返回空。
      addXXX()——》offerXXX()
      getXXX()——》peekXXX()
      removeXXX()——》pollXXX()
2.2.关于ArrayListLinkedList的比较分析
    a) ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。
    b)当执行插入或者删除操作时,采用LinkedList比较好。
    c)当执行搜索操作时,采用ArrayList比较好。
   d)当向ArrayList添加一个对象时,实际上就是将该对象放置到了ArrayList底层所维护的数组当中;当向LinkedList中添加一个对象时,实际上LinkedList内部会生成一个Entry对象,该Entry对象的结构为:
 
Entry {
    Entry previous;
    Object element;
    Entry next;
}

其中的Object类型的元素element就是我们向LinkedList中所添加的元素,然后Entry又构造好了向前与向后的引用previousnext,最后将生成的这个Entry对象加入到了链表当中。换句话说,LinkedList中所维护的是一个个的Entry对象。  

3.Set  无序,不可以重复元素
 HashSet:底层数据结构是哈希表
 TreeSet:底层数据结构是二叉树,可以对Set集合中的元素进行排序。
    

3.1.HashSet(无序):
HashSet:数据结构是哈希表,线程是非同步的;
保证元素唯一性的原理:判断元素的hashCode值是否相同,若相同,继续判断元素的equals方法,是否为true。   
保证了元素的唯一性:当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。
1).如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。即判断元素存在或删除等操作时,依赖于元素的hashCode和equals方法。
2).迭代器的使用:先用HashSet对象的iterator()方法生成一个迭代器对象,通过建立一个迭代器对象调用hasNext( )方法的循环,只要hasNext( )返回true,就进行循环迭代, 在循环内部,通过迭代器对象调 用next( )方法来得到每一个元素
 
HashSet:数据结构是哈希表,线程是非同步的;
保证元素唯一性的原理:判断元素的hashCode值是否相同,若相同,继续判断元素的equals方法,是否为true。
3.2.sortedSet(有序):
   treeSet在存储了大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。
    底层采用了二叉树结构,存储数据时以左,取数据时是以
    保证了元素的唯一性:是通过compareTo方法返回0
 
3.3.TreeSet
可以对Set集合中的元素进行排序。
底层数据结构是二叉树
保证元素的唯一性的依据是:compareTo方法返回0
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序,或默认排序规则。‘
TreeSet排序的第二种方式:
当元素自身不具备比较性,或者是所具有的比较性不是所需要的,此时需让集合自身具备比较性。在集合初始化时,就有了比较方式。

4.Map(映射):
    HashTable:底层是哈希表的数据结构,不可存入null的键和值,该集合是同步的。
               HashMap:底层是哈希表的数据结构,可存入null的键和值,该集合是不同步的。
     TreeMap:底层是二叉树数据结构,线程不同步,可以给键进行排序。

1)
    2)映射循环使用两个基本操作:get()put()。使用put()方法可以将一个指定了关键字和值的值加入映射。为了得到值,可以通过将关键字作为参数来调用get()方法。调用返回该值。
    3)为了获得映射的类集“视图”,可以使用entrySet()方法,它返回一个包含了映射中元素的集合(Set)。通过Map.Entry的对象可以操作键值。
    4)为了得到关键字的类集“视图”,可以使用keySet()方法。为了得到值的类集“视图”,可以使用values()方法。

4.1HashTable
  4.2.HashMap(无序):程序开始创建一个散列映射,然后将名字的映射增加到表中。接下来,映射的内容通过使用由调用函数entrySet()而获得的集合“视图”而显示出来。关键字和值通过调用由Map.Entry定义的getKey()getValue()方法而显示。

4.3.TreeMap(升序排列):与TreeSet类似,Set底层就是采用Map实现
11.比较函数:TreeSetTreeMap都按排序顺序存储元素,比较函数确定采用何种排序方式排序。如果需要用不同的方法对元素进行排序,可以在构造集合或映射时,指定一个Comparator对象。
12.HashMap与HashSet:
    1).HashSet底层是使用HashMap实现的。当使用add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象(该对象我们用不上)
 2).HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中;
  3).当向HashMapput一对键值时,它会根据keyhashCode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。
  4).如果该位置没有对象存在,就将此对象直接放进数组当中;如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一个对象),如果此链上有对象的话,再去使用equals方法进行比较,如果对此链上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。  
 
可以使用集合的思想和方法来操作数组中的元素。但须注意,将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的。如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素;若数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
 
Properties(属性):
 


注:此文档为学习圣思园风中叶教程结合自身学习所记录。