Java集合

Java集合概述

集合,也叫容器。它的功能,相当于容器。

Java的集合(容器),用来“装对象的”。

容器,应该有哪些方法可供使用?

  • 把东西“丢”进去
  • 把指定的东西“读取”出来,该东西依然在容器里
  • 把指定的东西从容器里删除
  • 把容器清空。
  • “挨个”把每个东西数一次。(遍历)
  • 把A容器中的东西全部倒入B容器中。
  • 拿A容器包含的东西,减去B容器中包含的东西。
  • 拿A容器包含的东西,与B容器中包含的东西,求交集。

Set集合

遍历Set集合,有两种方式
①用迭代器
②用foreach循环

HashSet的存储机制

底层用一个数组存元素----而且这个数组的长度永远是2的N次方。
HashSet的构造器:HashSet(int initialCapacity , float loadFactor)

– initialCapacity控制底层数组的长度(默认值为16)
A.如果传入的数组不是2的N次方,HashSet会自动将它扩展到2的N次方。

–loadFactor(默认值0.75)
B.当HashSet感觉到底层数组快满的时候,再次创建一个长度为原有数组长度2倍的数组。原有的数组就变为了垃圾,并且要把原来数组的元素复制到新数组内【专业说法:rehash(重hash)】

  • 当loadFactor为0.75时,75%的位置已经占用,HashSet会分配新的数组。
  • 当loadFactor为0.1时,10%的位置已经占用,HashSet会分配新的数组。
  • 当loadFactor为1时,100%的位置已经占用,HashSet会分配新的数组。
    【注意:】loadFactor越小,越耗内存;loadFactor越大,性能越低。
    ----loadFactor越大,代表当数组很满时,才去“重hash”,数组越满,就越容易出现“链表”。

HashSet存储机制中存入的机制:
①当有添加元素时,HashSet会调用该对象的hashcode()方法,得到一个int值。
②根据hashcode()返回的int值,计算出它在【底层数组】的存储位置(数组中的索引)。
③如果要加入的位置没有元素,直接放入即可
④如果要加入的位置已经有了元素,就会形成“链表”。

HashSet存储机制中取元素的机制:
①当要取一个元素时,HashSet会调用该对象的hashcode()方法,得到一个int值。
②根据hashcode()返回的int值,计算出它在【底层数组】的存储位置(数组中的索引)。
③如果该位置恰好是要找的元素,直接取出即可。
④如果该位置有“链表”,HashSet要“挨个”搜索链表里的元素。

最理想的情况下,HashSet的性能几乎可以和数组媲美,存、取的性能非常高。

【结论】
HashSet怎么才会认为两个对象是相等的?
①两个对象的hashCode()返回值相等。
②两个对象通过equals比较也返回true。
----这就要求我们自定义类的hashCode()与equals()方法时一致的。
要求程序重写equals()所用的关键属性,与计算hashCode()所用的关键属性要相同。

LinkedHashSet

它与HashSet的储存机制相似,但LinkedHashSet额外的维护一个链表,这个链表可以保证LinkedHashSet能记住元素的添加顺序。

TreeSet

特征:保证Set里的元素是“大小排序”。

TreeSet---- 它是标准的“红黑树”。

TreeSet的存入、检索机制:
底层用一颗“红黑树“存放所有数据。
元素存入、检索的性能也比较好。

在HashSet没有出现大量“链表”的情况下,HashSet性能比TreeSet的性能好。

A.TreeSet不会发生“空桶”。
B.TreeSet可以保证集合元素是按“大小”排序的。

使用TreeSet有一个要求:
要求集合元素必须可以比较大小。

Java的比较大小有两种方法
A. 自然排序。所有集合元素实现Comparable接口
集合元素实现了接口后,集合元素自身就是可排序的

B. 定制排序。要求创建TreeSet对象的时候,提供一个Comparator对象,Comparator对象可负责对元素进行比较大小。
集合元素无需实现Comparable接口,因此集合元素本身是无法排序的。

TreeSet如何判断两个对象是相等的?

  • 只要两个对象通过compareTo比较返回0,TreeSet就认为它们是相等的。

List集合

它提供了大量的“根据索引”来存、取元素的方法。

由于List可以“根据索引”来存、取元素的方法,所以它多了一个遍历元素的方法。

ArrayList与Vector

ArrayList与Vector的存储机制
它们底层完全基于数组----它对元素的存储,完全是基于数组的,因此性能特别快。

**ArrayList:**由于可以根据底层数组的索引存、取元素,所以性能快。
当插入元素、删除元素时,后面的元素要“整体搬家”。

ArrayList与Vector的区别

  • JDK1.2后,用ArrayList代替了Vector
  • ArrayList是线程不安全的,Vector是线程安全的。
  • ArrayList的性能比Vector好。
  • 即使在多线程环境下,可以使用Collections把ArrayList转换成线程安全的。

LinkedList

既是线性表,又是队列,还是栈。
LinkedList底层是基于链表实现的。通常性能比不上ArrayList

ArrayList:由于可以根据底层数组的索引存、取元素,所以性能快。
当插入元素、删除元素时,后面的元素要“整体搬家”。
LinkedList:由于采用了链表来存、取元素,所以性能较慢。
当插入元素、删除元素时,后面的元素无需“整体搬家”,所以性能快。

Deque集合

----它是功能被限制了的线性表
既是队列,又是栈

ArrayDeque----基于数组实现

LinkedList----基于链表实现

各种线性表的性能分析

  • ArrayList、LinkedList:基于数组的线性表和基于链表的线性表
  • Deque:代表了双端队列(既可以作为队列使用,也可以作为栈使用)

关于使用List集合时应有的考虑

  • 如果要遍历List集合元素,对于ArrayList、Vector集合,应该使用随机访问方法(get)来遍历集合元素,这样性能更好;对于LinkedList集合,则应该用迭代器(Iterator)来遍历集合元素。
  • 如果要经常执行插入、删除操作来改变包含大量数据的List集合的大小,优先考虑使用LinkedList集合。
  • 如果有多个线程需要同时访问List集合中的元素,应该考虑使用Collections将集合包装成线程安全的集合。

操作集合的工具类:Collections

Arrays - - - 操作数组
Objects - - - 操作对象
Collections- - - 操作集合

Map集合

Map里存的东西是:key-value对。
Map不允许key重复!

在这种数据中,每项数据都是key-value 对 组成。

假如把value当成是key的“附属物”,Map存储key-value对时,只要考虑key的存储即可,key存储之后,value跟着key即可。
再进一步,如果只管Map里的key,并把所有的key收集起来----就变成了Set。

Map与Set是一一对应的。
HashSet底层是靠HashMap实现,HashMap用“hash”算法控制“一个萝卜一个坑”。
TreeSet底层是靠TreeMap实现,TreeMap就是真正的红黑树。

对于Map而言,由于value只是附属物,因此Map对value几乎没有要求。

Map对key有要求。

=====HashMap

HashMap
----它会根据key的hashCode()方法的返回值来计算key的存、取位置。

HashMap怎样才算两个key相等?
①通过equals比较返回true
②两个key的hashCode()返回值相等

====TreeMap
----底层的红黑树只对key进行排序

TreeMap要求key必须是可比较大小的
①自然排序。要求所有的key实现Comparable接口。
②定制排序。要求创建TreeMap时提供一个Comparator接口。

TreeMap怎样才算两个key相等?
①通过compareTo()比较大小时返回0,这就表明两个值相等

==========================================
Vector - 被ArrayList取代。都是基于数组实现,Vector是线程安全的,性能差

Hashtable - 被HashMap取代。Hashtable 是线程安全的、性能较差;并且不允许使用null作为key和value。

Dictionary - 已经被废弃了

Enumeration - 被Iterator代替了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值