集合

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的区别

比较点HashMapHashTable
推出时间JDK1.2之后推出,属于新的操作类JDK1.0时候推出,属于旧的操作类
性能采用异步处理方式,性能更高采用同步处理方式,性能较低
线程安全属于非线程安全的操作类3属于线程安全的操作类
空键允许将key设置为null不允许将key设置为null,否则将出现NullPointerException异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值