java集合总结

不积硅步无以至千里 不积小溪无以成江海

基本的UML图如下:
这里写图片描述

注意:带三角箭头的实线表示继续关系,带三角箭头的虚线表示实现关系

有两条分支如下:Collection 和 Map

Collection接口没有实现类,有两个接口:Set和List。

Set 无序,没有重复元素。接口 SortedSet升序排列的Set,实现类是TreeSet。


TreeSet
不允许有重复值, 允许有一个null, 它包含的对象是经过排序的, 排序之后形成一个树状结构, 这就是叫它 TreeSet 的原因. 因为它要排序, 所以加入它的对象必须实现 Comparable 接口或在创建 TreeSet 时提供比较器(Comparator), 在迭代 TreeSet 时, 我们可以按照升序迭代, 也可以按照降序迭代


HashSet
不允许有重复值, 允许有一个null, 它的优点是可以快速的帮我们查找对象, 缺点是我们无法控制对象的顺序.


LinkedHashSet
继承了 HashSet, 它克服了 HashSet 的缺点, 我们可以按照对象插入的顺序来迭代对象


List 有序,可以有重复元素。

ArrayList:数据结构为数组,方便取得固定下标的元素
ArrayList 是一个可变数组, 它有数组的所有优缺点, 如高效的随机访问, 低效的插入和删除. 它允许重复值, 允许null, 有序(所谓的有序指的是读取元素的顺序和插入的顺序一致,保证以某种特定插入顺序来维护元素顺序,即保持插入的顺序).


LinkedList:数据结构为双向列表,方便在List中插入、删除操作
LinkedList 是一个双向列表, 它的特点是高效插入和删除, 低效的随机访问, 所以千万不要使用像 get(int index) 等包含索引信息的方法. 问题是有时候我们并不知道某个List 到底是Arraylist 还是LinkedList, 为此, JDK 1.4 引入了一个接口 RandomAccess,它没有任何方法,只是用来标记某个list 是否支持高效的随机访问。 所以,我们可以使用下面的代码来判读某个list是否支持高效的随机访问。
if (list instanceof RandomAccess) {

} else {

}
除此之外, 它允许重复值, 允许null, 有序.


Vector 除了提供了同步外, 它和 ArrayList 没有任何区别, 因为它是线程安全的, 所以效率比较差, Java 推荐我们尽量使用 ArrayList.


Stack 是一种后进先出的数据结构, 它继承自Vector, 所以它也是线程安全的. 由于设计上的缺陷, 现在已经不推荐使用了, 推荐使用 Deque.


Map接口实现类HashMap 接口SortedMap按key的升序排列,实现类是TreeMap
注意:TreeSet和TreeMap的排序规则要实现对象的hashCode和equals方法,速度比HashSet和HashMap慢,所以不需排序的时候使用后者

HashMap

允许null值和null键. 它的优点是可以快速的帮我们查找对象, 缺点是我们无法控制对象的顺序


Hashtable

Hashtable 和 HashMap 的主要区别在于 Hashtable 是线程同步的, 除此之外, Hashtable 不允许有 Null 值和 Null 键.


TreeMap

TreeMap 的键是经过排序的, 排序之后形成一个树状结构, 这就是叫它 TreeMap 的原因. 因为它要排序, 所以加入它的键必须实现 Comparable 接口或在创建 TreeMap 时提供比较器(Comparator). 除此之外, 它还提供了一些按键检索的方法.


Properties
主要用于读取Java的配置文件。在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用”#”来注释。


额外介绍两个工具类Arrays 和 Collections
它们包含了很多非常实用的静态方法。比如Collections.sort()集合排序,具体可自己查看java的api帮助文档。

总结

集合在笔试和面试中基本都会提起到。
网上搜下就会搜到很多问题:比如ArrayList和Vector 区别,HashMap和Hashtable的区别等,以下总结取自于度娘

1.通过下面这张表可以看到基本的异同
这里写图片描述


2.集合中键值是否允许null小结
List:可以有多个null,可以有重复值。
HashSet:能插入一个null(因为内部是以 HashMap实现 ),忽略不插入重复元素。
TreeSet:不能插入null (因为内部是以 TreeMap 实现 ) ,元素不能重复,如果待插入的元素存在,则忽略不插入,对元素进行排序。
HashMap:允许一个null键与多个null值,若重复键,则覆盖以前值。
TreeMap:不允许null键(实际上可以插入一个null键,如果这个Map里只有一个元素是不会报错的,因为一个元素时没有进行排序操作,也就不会报空指针异常,但如果插入第二个时就会立即报错),但允许多个null值,覆盖已有键值。
HashTable:不允许null键与null值(否则运行进报空指针异常)。也会覆盖以重复值。基于线程同步。


3.对list,set,map的选择
对List的选择:
对于随机查询与迭代遍历操作,数组比所有的容器都要快。
从中间的位置插入和删除元素,LinkedList要比ArrayList快,特别是删除操作。
Vector通常不如ArrayList快,则且应该避免使用,它目前仍然存在于类库中的原因是为了支持过去的代码。
最佳实践:将ArrayList作为默认首选,只有当程序的性能因为经常从list中间进行插入和删除而变差的时候,才去选择LinkedList。当然了,如果只是使用固定数量的元素,就应该选择数组了。
对Set的选择:
HashSet的性能总比TreeSet好(特别是最常用的添加和查找元素操作)。
TreeSet存在的唯一原因是,它可以维持元素的排序状态,所以只有当你需要一个排好序的Set时,才应该使用TreeSet。
对于插入操作,LinkedHashSet比HashSet略微慢一点:这是由于维护链表所带来额外开销造成的。不过,因为有了链表,遍历LinkedHashSet会比HashSet更快。
对Map的选择:
Hashtable和HashMap的效率大致相同(通常HashMap更快一点,所以HashMap有意取代Hashtable)。
TreeMap通常比HashMap慢,因为要维护排序。
HashMap正是为快速查询而设计的。
LinkedHashMap比HashMap慢一点,因为它维护散列数据结构的同时还要维护链表。


4.当以自己的对象做为HashMap、HashTable、LinkedHashMap、HashSet 、LinkedHashSet 的键时,一定要重写hashCode ()与equals ()方法,因为Object的hashCode()是返回内存地址,且equals()方法也是比较内存地址,所以当要在这些hash集合中查找时,如果是另外new出的新对象是查不到的,除非重写这两个方法。因为AbstractMap类的containsKey(Object key)方法实现如下:
if (e.hash == hash && eq(k, e.key))//先比对hashcode,再使用equals
return true;

static boolean eq(Object x, Object y) {
return x == y || x.equals(y);
}
String对象是可以做为键的,因为已重写了这两个方法。
因此,Java中的集合框架中的哈希是以一个对象查找另外一个对象,所以重写hasCode与equals方法很重要。
重写hashCode()与equals()这两个方法是针对哈希类,至于其它集合,如果要用public boolean contains(Object o)或containsValue(Object value)查找时,只需要实现equals()方法即可,他们都只使用对象的 equals方法进行比对,没有使用hashCode方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值