java集合框架位于java.util包下
Collection接口
该接口的定义如下:
public interface Collection<E>
extends Iterable<E>
collection是存放单值最大的父接口,可以向其中保存多个单值数据,此接口中的方法主要有:
方法 | 描述 |
---|---|
public boolean add(E o) | 向集合中插入对象 |
public boolean addAll(Collection e | 将一个集合的内容插入进来 |
public void clear() | 清除此集合中的所有元素 |
public boolean contains(Object o) | 判断一个对象是否在集合中存在 |
public boolean containsAll(Collection c) | 判断一组对象是否在集合中存在 |
public boolean equals(Object o) | 比较对象 |
Public int hashCode() | 哈希码 |
public boolean isEmpty() | 判断集合是否为空 |
public Iterator iterator() | 为Iterator接口实例化 |
public boolean remove(Object o) | 删除指定对象 |
public boolean removeAll(Collection c) | 删除一组对象 |
public boolean retainAll(Collection c) | 保存指定内容 |
public int size() | 求出集合的大小 |
public Object[] toArray() | 将一个集合变为对象数组 |
public T[] toArray(T[] a) | 指定好返回的对象数组类型 |
但是在开发中一般不提倡直接使用Collection接口,因为这会导致表示的操作意义不明确。Collection主要的子接口如下:
List:可以存放重复的数据
set:不能存放重复的内容,所有重复内容靠hashCode()和equals()两个方法区分
queue:队列接口
sortedSet:可以对集合中的数据进行排序
List接口
List接口的定义如下:
public interface List extends Collection
List接口对Collection接口扩充了大量的方法,比较常用的方法为:
方法 | 描述 |
---|---|
public void add(int index,E element) | 在指定位置增加元素 |
public boolean addAll(int index,Collection c) | 在指定位置增加一组元素 |
public E get(int index) | 返回指定位置的元素 |
public int indexOf(Object o) | 查找指定元素的位置 |
public int lastIndexOf(Object o) | 从后向前查找指定元素的位置 |
public ListIterator listIterator() | 为Listiterator接口实例化 |
public E remove(int index) | 按指定的位置删除元素 |
public List subList(int fromIndex,int toIndex) | 取出这个范围内的子元素 |
public E set(int index,E element) | 替换指定位置的元素 |
List接口比Collection扩充了更多的方法,但是如果要想使用此接口,则需要通过其子类进行实例化。
List接口的常用字类
ArrayList
此类事List的子类,可以直接为List接口实例化。此类定义如下:
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
示例:验证增加操作
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class JavaDemo{
public static void main(String args[]){
List<String> list = null; //定义List对象
Collection<String> c = null ; //定义Collection对象
list = new ArrayList<String> ();
c = new ArrayList<String>() ;
list.add("hello");
list.add("world");
list.add("beijing");
list.add("yunnan");
System.out.println(list);
c.add("PYL");
c.add("sichuang");
list.addAll(c);
list.addAll(1,c);
System.out.println(c);
System.out.println(list);
}
}
执行结果:
[hello, world, beijing, yunnan]
[PYL, sichuang]
[hello, PYL, sichuang, world, beijing, yunnan, PYL, sichuang]
在List接口中还有一个子类:Vector。Vector的定义为:
public class Vector
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable
Vector和ArrayList一样都是继承自AbstractList类,两者的区别有:
比较点 | ArrayList(使用较多) | Vector |
---|---|---|
推出时间 | JDK1.2之后推出,属于新的操作类 | JDK1.0时推出,属于旧的操作类 |
性能 | 采用异步处理方式,性能更高 | 采用同步处理方式,性能较低 |
线程安全 | 属于非线程安全的操作类 | 属于线程安全的操作类 |
输出 | 只能使用Iterator,foreach输出 | 可以使用Iterator、foreach、Enumeration输出 |
LinkedList子类和Queue接口
LinkedList是一个链表操作类,定义如下:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Queue<E>, Cloneable, Serializable
Queue接口是Collection的子接口,定义如下:
public interface Queue<E>
extends Collection<E>
Queue接口也可以增加元素并输出,此接口的方法定义如下:
方法 | 描述 |
---|---|
public boolean add(E e) | 增加元素 |
public E element() | 找到链表的表头 |
public boolean offer(E o) | 将指定元素增加到链表的表尾 |
public E peek() | 找到但并不删除链表的表头 |
public E poll() | 找到并删除此链表的表头 |
Public E remove() | 检索并移除表头 |
LinkedList类中除了实现以上方法外,还提供有以下方法:
方法 | 描述 |
---|---|
public void addFirst(E o) | 在链表开头增加元素 |
public void addLast(E o) | 在链表结尾增加元素 |
public boolean offer(E o) | 将指定元素增加到链表的结尾 |
public E removeFirst() | 删除链表的第一个元素并返回该元素 |
public E removeLast() | 删除链表的最后一个元素并返回该元素 |
Set接口
Set接口也是Collection接口的子接口,但是与List接口不同的是:Set接口不能加入重复的元素。Set接口定义如下:
public interface Set<E>
extends Collection<E>
Set接口的主要方法与Collection是一致的,并没有对Collection几口进行扩充,只是比Collention接口要求更严格了:不能增加重复的元素。
Set接口的子类
散列的存放:HashSet
该类的定义如下:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable
该子类的主要特点是:里面不能存放重复的元素,而且采用散列的存储方式,没有顺序。
有序的存放:TreeSet
该类的定义如下:
public class TreeSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, Serializable
该子类的主要特点是:存放的元素不能重复,可以排序
TreeSet中的元素是有序的,所以对于一个对象必须指定好其排序顺序,且TreeSet中的每个对象所在的类都必须实现Comparable接口才可以正常使用。
集合的输出
在类集中提供有以下4中常见的输出操作:
- Iterator:迭代输出,是使用最多的输出方式;
- ListIterator:是Iterator的子接口,专门用于输出List中的内容;
- Enumeration:是一个旧的接口,功能与Iterator类似;
- foreach:JDK1.5之后提供的新功能,可以输出数组或集合。
迭代输出:Iterator
其定义为:
public interface Iterator<E>
此接口使用时也需要指定泛型,但是此处指定的泛型类型需要与集合中的泛型类型一致。此接口定义了3个方法,为:
方法 | 描述 |
---|---|
public boolean hasNext() | 判断是否有下一个值 |
public E next() | 取出当前元素 |
public void remove() | 移除当前元素 |
示例:集合的输出和删除操作
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class JavaDemo{
public static void main(String args[]){
List<String> list = null;
list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("beijing");
list.add("yunnan");
Iterator<String> ite = list.iterator();
while(ite.hasNext()){
System.out.print(ite.next() + "、");
}
while(ite.hasNext()){
String str = ite.next();
if("world".equals(str)){
ite.remove();
}else{
System.out.print(str + "、");
}
}
System.out.println();
System.out.println("删除之后的集合:" + list);
}
}
注意:集合操作也有一个remove()方法,但是如果在使用Iterator输出时由集合对象调用自身的删除方法,则会出现运行时错误。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class JavaDemo{
public static void main(String args[]){
List<String> list = null;
list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("beijing");
list.add("yunnan");
Iterator<String> ite = list.iterator();
while(ite.hasNext()){
String str = ite.next();
if("world".equals(str)){
list.remove(str);
}else{
System.out.print(str + "、");
}
}
System.out.println();
System.out.println("删除之后的集合:" + list);
}
}
D:\JAVA>java JavaDemo
hello、Exception in thread "main"
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at JavaDemo.main(JavaDemo.java:15)
从程序的运行结果可以发现,内容却是被删除了,但是迭代输出在内容删除之后就终止了。因为集合本身的内容被破坏掉,所以迭代将出现错误,会停止输出。
双向迭代输出:ListIterator
Iterator接口得主要功能是由前向后单向输出,而此时如果想要实现由后向前或者由前向后的双向输出,则必须使用Iterator的子接口—-ListIterator。ListIterator接口的定义如下:
public interface ListIterator<E> extends Iterator<E>
此接口定义了比Iterator接口更多的方法、主要方法有:
方法 | 描述 |
---|---|
public boolean hasNext() | 判断是否有下一个值 |
public E next() | 取出当前元素 |
public void remove() | 移除当前元素 |
public void add(E e) | 将指定元素增加到集合 |
public boolean hasPrevious() | 判断是否有上一个元素 |
public E previous() | 取出当前元素 |
public int nextIndex() | 返回下一个元素的索引号 |
public int previousIndex() | 返回上一个元素的索引号 |
public void set(E e) | 替换元素 |
ListIterator接口只能通过List接口实例化,即:只能输出List接口中的内容。在List接口中定义了如下方法可以为ListIterator接口实例化:
public ListIterator<E> listIterator()
示例:双向迭代输出
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class JavaDemo{
public static void main(String args[]){
List<String> list = new ArrayList<String>() ;
list.add("hello");
list.add("_");
list.add("world");
ListIterator<String> liter = list.listIterator();
System.out.print("由后向前输出:");
while(liter.hasNext()){
String str = liter.next();
System.out.print(str + "、");
}
System.out.println();
System.out.print("由前向后输出:");
while(liter.hasPrevious()){
String str = liter.previous();
System.out.print(str + "、 ");
}
}
}
JAVA新支持:foreach
使用foreach除了可以进行数组的输出,同样可以用于集合的输出。使用foreach的格式为:
for(类 对象 : 集合){
//集合操作
}
示例:使用foreach进行输出
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class JavaDemo{
public static void main(String args[]){
List<String> list = new ArrayList<String>() ;
list.add("hello");
list.add("_");
list.add("world");
for(String str : list){
System.out.println(str + "、");
}
}
}
废弃的接口:Enumeration
Enumeration接口是JDK1.0就推出的,之最早的迭代输出接口,最早使用Vector时就是使用Enumeration接口进行输出的。Enumeration接口定义如下:
public interface Enumeration<E>
JDK1.5之后对Enumeration接口进行了扩充,增加了泛型操作,方法为:
方法 | 描述 |
---|---|
public boolean hasMoreElements() | 判断是否有下一个值 |
public E nextElement() | 取出当前元素 |
要想使用此接口输出只能通过Vector类,Vector类定义了以下的方法可以为Enumeration接口实例化。
public Enumeration<E> elements()
范例:使用Enumeration输出
import java.util.Vector;
import java.util.Enumeration;
public class JavaDemo{
public static void main(String args[]){
Vector<String> all = new Vector<String>() ;
all.add("hello");
all.add("_");
all.add("world");
Enumeration<String> enu = all.elements();
while(enu.hasMoreElements()){
System.out.print(enu.nextElement() + "、");
}
}
}
Map接口
Map接口简介
Map中的每个元素都是以“key - value”的形式储存在集合中。Map的接口定义如下:
public interface Map<K,V>
Map接口中主要的方法为:
1、public void clear() 清空Map集合
2、public boolean containsKey(Object key) 判断指定的key是否存在
3、public boolean containsValue(Object value) 判断指定的value是否存在
4、public Set
Map.Entry接口简介
Map.Entry接口是Map内部定义的一个接口,专门用来保存“key - value”的内容。Map.Entry定义如下:
public static interface Map.Entry<K,V>
本接口提供一下方法:
方法 | 描述 |
---|---|
public boolean equals(Object o) | 对象比较 |
public K getKey() | 取得key值 |
public V getValue() | 取得value值 |
public int hashCode() | 返回哈希码 |
public V setValue(V value) | 设置value的值 |
Map接口常用的子类
Map中常用的子类有:
- HashMap:无序存放的,是新的操作类,key不允许重复
- Hashtable:无序存放的,是旧的操作类,key不允许重复
- TreeMap:可以排序的Map集合,按集合中的key排序,key不允许重复
- WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时清除掉无用的数据,使用gc进行回收
- identityHashMap:key可以重复的Map集合
HashMap
HashMap是Map的子类,可以直接使用此类为Map接口实例化,HashMap类的定义如下:
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
示例:HashMap操作:
import java.util.*;
public class JavaDemo{
public static void main(String args[]){
Map<String,String> map = null;
map = new HashMap<String,String>();
map.put("name","jack");
map.put("sex","man");
map.put("age","four");
String val = map.get("name");
System.out.println(val);
Set<String> keys = map.keySet();
Iterator<String> ite = keys.iterator();
System.out.print("输出全部的key : ");
while(ite.hasNext()){
String str = ite.next();
System.out.print(str + "、");
}
}
}
HashTable与HashMap的区别
比较点 | HashMap | HashTable |
---|---|---|
推出时间 | JDK1.2之后推出,属于新的操作类 | JDK1.0时候推出,属于旧的操作类 |
性能 | 采用异步处理方式,性能更高 | 采用同步处理方式,性能较低 |
线程安全 | 属于非线程安全的操作类3 | 属于线程安全的操作类 |
空键 | 允许将key设置为null | 不允许将key设置为null,否则将出现NullPointerException异常 |