黑马程序员——集合类

数组可以以组的形式管理对象,但是数组的长度固定,而且有时需要比数组更复杂的存储方式,Java实例类库提供了一套相对完整的容器类来解决此问题,这一套容器类叫做集合框架,其基本类型是List、Set和Map。它们有各自的特性,如Set每个值只能保存一个对象,Map允许以键值对的形式存储对象。集合框架中的各类关系如下图:

List和Set是Collection的子类。List已实现的子类:ArrayList、LinkedList和Vector;Set已实现的子类:HashSet和TreeSet。Map已实现的子类:HashMap、TreeMap和Hashtable。

List:

ArrayList:底层数据结构是数组,查询速度快,增删动作慢,元素的个数越多,其增删越慢。
LinkedList:底层数据结构是链表,查询速度慢,增删动作快。
Vector:底层数据结构,线程同步,效率低。
每当需要增加长度时,ArrayList增长长度的50%,Vector增长长度的100%。
Vector特有方法:elements()获取枚举

Vector v=new Vector();
Enumeration en =v.elements();
While(en.hasMoreElements())
{
en.nextElement();
...
}

IO中有个类需要用枚举。

LinkedList升级1.6后新增了方法:由原来的抛异常改为返回null或false。
下面方法对,后面的是对前面方法的升级版。
方法对:addFirst——offerFirst(插入元素),getFirst——peekFirst(获取元素),removeFirst——pollFirst(删除元素并返回被删除的元素)
 新返回值:                 false                                            null                                                           null
(...Last()方法一致。)

还有push()和pop()方法,LinkedList可以用作栈、队列或双端队列。

Set:

Set:不可以重复元素
|--HashSet:数据结构是哈希表,线程是非同步的。
      保证元素唯一性的原理,判断元素的hashCode值是否相同。
       如果相同,还会继续判断元素的equals方法,是否为true。

|--TreeSet:可以对Set集合中元素进行排序。
       保证元素唯一性的依据,是compareTo方法return 0;
       让元素自身具备比较性,元素需实现Comparable接口,此接口中有一个方法-compareTo()。这种方式也称为元素的自然顺序。
       TreeSet底层实现是二叉树。

HashSet:存储数据时,先根据数据的hashCode值进行判断,如果此值和现有的某个元素的hashCode值相同,就调用数据的equals方法,如果此方法结果为0,则判定HashSet中已经有此元素,此数据不再存入。如果hashCode值不同,直接存入,不调用equals方法

hashCode()和equals()复写:

public int hashCode()
{
…
}
public boolean equals(Object obj)
{
	If(!(obj instanceof XXX))
	return false;
	XXX x=(XXX)obj;
…
}

注意复写时,equals方法的参数需要还是Object,一样才叫复写。

 TreeSet排序的第一种方式,让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为自然顺序,或者叫做默认顺序。
 TreeSet排序的第二种方式。当元素自身不具备比较性,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,在集合一初始化时就具备比较性。
先定义一个比较器类,实现Comparator接口,实现其compare(Objecto1,Object o2)方法还有equals()方法(如果有equals()方法可以不用再实现),再将该比较器类对象传入TreeSet构造方法。

Map:

 元素构造方法线程同步备注
TreeMap不可null可null键需实现Comparable接口的compareTo方法可传入构造器非同步构造器实现Comparator接口中的compare(T t1,T t2)和equals(Object o)
HashMap可null可null键需实现hashCode()和equals()方法 非同步由于键不可重复,HashMap中只能有一个null键
HashTable不可null不可null键需实现hashCode()和equals()方法 同步 

TreeMap的键完全遵从TreeSet的存储特性,HashMap的键完全遵从HashSet的特性。Map的值可以相同,还可以是null。

Map类添加键值对和删除键值对用的方法是:
V put(K key,V value)                               // 如果Map中有key,则用新value替换旧值,返回旧值;如果Map中没用key,则创建新键值对并返回null
V get(K key)                                             //如果Map中没有key,则返回null

判断Map中是否含有某键或某值:
boolean containsKey(Object key)
boolean containsValue(Object value)

由Map获取其所有键对应的Set:
Set<K> keySet()

由Map获取其所有键值对对应的Set,每个键值对被定义为一个Map.Entry<Key,Value>泛型类:
Set<Map.Entry<Key,Value>>  entrySet()                      //获得的Set中的元素是Map.Entry<Key,Value>类对象,Map.Entry<Key,Value>对象的方法有:
K getKey()
V getValue()
V setValue(V value)
boolean equals(Object obj)

集合框架类的通用方法:

void clear()
boolean isEmpty()
int size()


Iterator(迭代器):

Collection类对象都有迭代器,迭代器同意了对不同Collection类对象进行访问的方式,Collection类对象的iterator()方法可获得该对象的迭代器。
Iterator对象的方法:
boolean hasNext()
E next() // 其中E是该容器中存储的类
void remove() //删除刚由next()方法获得的对象

ListIterator:

ListIterator是Iterator类型的一个子类,功能更强大,扩展的功能有:前向移动、添加、修改和返回当前位置前后的索引值。它只能用于List类的访问。
ListIterator的方法:
void add(E e)
boolean hasNext()
boolean hasPrevious()
E next()
int nextIndex()
E previous()
int previousIndex()
void remove()
void set(E e)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值