概述
数组可以以组的形式管理对象,但是数组的长度固定,而且有时需要比数组更复杂的存储方式,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底层实现是二叉树。
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)
最后
以上就是踏实往事为你收集整理的黑马程序员——集合类的全部内容,希望文章能够帮你解决黑马程序员——集合类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复