【java基础】02.Collection类集

1.集合:集合中存放的依然是对象的引用而不是对象本身。

  • 1).集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。
  • 2). 集合当中放置的都是Object类型,因此取出来的也是Object类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。 

2.List 可以存放重复内容

List集合特有的迭代器:ListIterator是Iterator的子接口

 

    --ArrayList:底层数据结构是数组结构,查询较快,增删较慢,线程不同步

    --LinkedList:底层数据结构是链表结构,增删较快,查询较慢     

    --Vector:底层数据结构是数组结构,线程同步

2.1.arraylist:与Vector相似,Vector是同步

我们可以将其看作是能够自动增长容量的数组

    利用ArrayList的toArray()返回一个数组。arrays.asList()返回一个列表。迭代器(Iterator)给我们提供了一种通用的方式来访问集合中的元素。

  • 1).ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组
  • 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.关于ArrayList与LinkedList的比较分析

  • 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又构造好了向前与向后的引用previous、next,最后将生成的这个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( )方法来得到每一个元素

3.2.sortedSet(有序):

 

3.3.TreeSet

可以对Set集合中的元素进行排序。

底层数据结构是二叉树

保证元素的唯一性的依据是:compareTo方法返回0

TreeSet排序的第一种方式:让元素自身具备比较性。

元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序,或默认排序规则。‘

TreeSet排序的第二种方式:

当元素自身不具备比较性,或者是所具有的比较性不是所需要的,此时需让集合自身具备比较性。在集合初始化时,就有了比较方式。

4.Map(映射):

  • HashTable:底层是哈希表的数据结构,不可存入null的键和值,该集合是同步的。同步处理,性能低,线程安全
  • HashMap:底层是哈希表的数据结构,可存入null的键和值,该集合是不同步的。异步处理,性能高,非线程安全
  • TreeMap:底层是二叉树数据结构,线程不同步,可以给键进行排序。TreeMap的键和值都不能为空。
  • LinkedHashMap:保存了记录的插入顺序,Iteraor在遍历时比HashMap慢 

    1)映射循环使用两个基本操作:get()和put()。使用put()方法可以将一个指定了关键字和值的值加入映射。为了得到值,可以通过将关键字作为参数来调用get()方法。调用返回该值。

    2)为了获得映射的类集“视图”,可以使用entrySet()方法,它返回一个包含了映射中元素的集合(Set)。通过Map.Entry的对象可以操作键值。

    3)为了得到关键字的类集“视图”,可以使用keySet()方法。为了得到值的类集“视图”,可以使用values()方法。

4.1.HashTable

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

4.3.TreeMap(升序排列):与TreeSet类似,Set底层就是采用Map实现

11.比较函数:TreeSet和TreeMap都按排序顺序存储元素,比较函数确定采用何种排序方式排序。如果需要用不同的方法对元素进行排序,可以在构造集合或映射时,指定一个Comparator对象。

12.HashMap与HashSet:

  • 1).HashSet底层是使用HashMap实现的。当使用add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象(该对象我们用不上)
  • 2).HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组当中;
  • 3).当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。
  • 4).如果该位置没有对象存在,就将此对象直接放进数组当中;如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一个对象),如果此链上有对象的话,再去使用equals方法进行比较,如果对此链上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。  

可以使用集合的思想和方法来操作数组中的元素。但须注意,将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的。如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素;若数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

 

参考博客:

map

http://blog.csdn.net/zq602316498/article/details/39351363 
http://blog.csdn.net/zq602316498/article/details/39483629 
http://www.cnblogs.com/baizhanshi/p/5810495.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值