java集合类框架

原文出处:于卫国,http://yuweiguocn.github.io/java-collection/

Java集合类框架概览及各集合之间的区别。
集合中存放的是对象的引用。
Collections:集合的搜索、排序、线程安全化等

Collection接口

  • boolean add(Object o)
  • boolean addAll(Collection c)
  • boolean remove(Object o)
  • boolean removeAll(Collection c)去交集
  • boolean retainAll(Collection c)取交集
  • Iterator iterator()
  • Object[] toArray()
  • Object[] toArray(Object[] a)

Iterator接口

boolean hasNext()
Object next()

for(Iterator it=c.iterator();it.hasNext();) {
  Object o=it.next();
}

ListIterator接口

ListIterator是Iterator的子接口。

Iterator和ListIterator的区别

  • 遍历方法 ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序身后遍历,但是ListIterator还有hasPrevious()和pervious()- 方法,可以实现逆向(顺序向前)遍历,Iterator就不可以。
  • 遍历索引定位 ListIterator 可以定位索引位置——nextIndex()和previousIndex(),Iterator没有此功能。
  • 增加集合对象元素方法 ListIterator有add方法,可以向List中添加对象,而Iterator不能。
  • 对象维护 都可实现删除对象,但ListIterator可以调用set方法来对集合元素进行修改。而Iterator不能。

Map接口类型

Map接口实现者调用接口方法values()返回一个实现collection接口的对象引用。collection接口的实现者又可以调用iterator()方法返回一个实现Iterator接口的对象引用。

Map接口用于将一个键(key)映射到一个值(value),且不允许有重复的键。Map提供了一个称为entrySet()的方法,这个方法返回一个实现Set接口的集合对象,集合中的每个对象元素又都实现了Map.Entry接口。Map.Entry接口提供了一个getKey()方法和一个getValue()方法。

集合对象排序接口Comparator

实现此接口的类可以进行排序,实现compare方法就可以了。
基本数据类型实现了这个接口,调用Collections.sort(list)进行排序;
如果Comparator只用一次,可使用匿名类。

List和Set的区别

List:
元素是有序的,因为该集合体系有索引
元素可以重复
Set:
元素是无序的
元素不可以重复
取出只能是Iterator

HashSet和TreeSet的区别

HashSet:
哈希表结构 判断是否重复用hashCode和equals方法
当hashCode相等时判断equals方法
TreeSet:
二叉树结构,可以排序

Vector和ArrayList的区别

Vector:
线程同步
当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍

ArrayList:
线程不同步,但性能很好
当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小

ArrayList和LinkedList的区别

ArrayList:
底层是数组数据结构
查询快,增删慢

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

HashTable和HashMap的区别

HashTable:
线程同步
不允许key和value的值为null
HashMap:
线程不同步
允许一个key为null,和多个value为null

TreeMap和HashMap的区别

  • TreeMap:
    • 二叉树结构
    • 线程不同步
    • 可用于给map集合中的键进行排序
  • HashMap:
    • 哈希表结构
    • 线程不同步
    • 允许一个key为null,和多个value为null

hashCode的作用

哈希算法可以提高从集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定对象应该存储在哪个区域。hashCode在有哈希算法类的集合里才有价值,如hashSet、hashMap、hashTable。只有类的实例对象被要求采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。

当一个对象存储进hashSet集合中就不能再修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合时的哈希值就不同了。这种情况下,即使在contains方法中使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。

集合类的选择

是否有线程安全问题
集合类的元素数量是否很大(很大应该选择Hash开头的类,便于快速检索)
哪种集合类的结构方便当前使用

Collections类

  • Set singleton(Object o)
  • List singletonList(Object o)
  • Map singletonMap(Object key,Object value)
  • 填充集合 nCopies(int length,Object o)
  • 复制集合 copy(List dest,List src)
  • 查找替换 boolean replaceAll(List list,Object oldVal,Object newVal)
  • 集合排序 void sort(List list)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值