Java核心——集合(二)

一、实现类

Java提供了一套实现Collection接口的标准集合类(实现类),其中包含具体类(可直接拿来使用)和抽象类(提供了接口的部分实现)。

 

其中抽象类描述如下(图中蓝底部分):

  1. AbstractCollection:实现了大部分的集合接口。
  2. AbstractList:继承于AbstractCollection并且实现了大部分List接口。
  3. AbstractSequentialList:继承于AbstractList,提供了对数据元素的链式访问而不是随机访问。
  4. AbstractSet:继承于AbstractCollection并且实现了大部分Set接口。
  5. AbstractMap:实现了大部分的Map接口。

具体实现类描述如下:

  1. LinkedList:继承了AbstractSequentialList,实现了List接。允许有Null(空)元素,主要用于创建链表数据结构。此类没有同步方法,如果多个线程同时访问一个List,必须自己实现同步访问,解决办法就是在创建List的时候构造一个同步的List。例如:
    List list = Collections.synchronizedList(newLinkedList(...));
    LinkedList与ArrayList相比,增加和删除的操作效率更高,查找和修改的操作效率较低。
  2. ArrayList:继承了AbstractList,并实现了List接口。此类是一个可以动态修改的数组,没有固定的大小,提供了添加、删除、修改、遍历等功能。该类也是非同步的,在多线程的情况下不要使用。ArrayList增长当前长度的50%,插入删除效率低。
  3. HashSet:基于HashMap实现,实现了Set接口。不允许出现重复元素,不保证集合中元素的顺序(无序即不会记录插入的顺序),允许包含值为Null的元素,但最多只能一个。该类不是线程安全的,如果多个线程尝试同时修改HashSet,则最终结果是不确定的。必须在多线程访问时显示同步对HashSet的并发访问。
  4. LinkedHashSet:具有可预知迭代顺序的Set接口的哈希表和链接列表实现。
  5. TreeSet:实现了Set接口,可以实现排序等功能。
  6. HashMap:继承于AbstractMap,实现了Map接口。该类是一个散列表,它存储的内容是键值对(key-value)映射,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。它是无序的,即不会记录插入的顺序
  7. TreeMap:继承于AbstractMap,并且使用一棵树,
  8. WeakHashMap:继承于HashMap,使用元素的自然顺序对元素进行排序(如果元素是数字型,则从小到大排序;如果是字符型,则以ASCII码来排序)。
  9. IdentityHashMap:继承于AbstractMap,比较文档时使用引用相等。
  10. Vector:此类与ArrayList相似,但是此类是同步的,可以用在多线程的情况,此类允许设置默认的增长长度,默认扩容方式为原来的2倍。
  11. Stack:栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
  12. HashTable:是Dictionary(字典)的子类。

二、算法 

 集合框架定义了几种算法,可用于集合和映射。这些算法被定义为集合类的静态方法。集合定义三个静态的变量:EMPTY_SET,EMPTY_LIST,EMPTY_MAP,这些变量都不可改变。

异常类型:

  • 在尝试比较不兼容的类型时,一些方法能够抛出ClassCastException异常。
  • 当试图修改一个不可修改的集合时,抛出UnsupportedOperationException异常。

三、迭代器 

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代ArrayList和HashSet等集合。

迭代器it的基本操作时是next、hashNext和remove。

  • 调用it.next()会返回迭代器的下一个元素,并且更新迭代器的状态。
  • 调用it.hashNext()用于检测集合中是否还有元素。
  • 调用it.remove()将迭代器返回的元素删除。

使用迭代器: 

import java.util.ArrayList;
import java.util.Iterator;

public class Test{
    public static void main(String[] args){
//创建集合
        ArrayList<Integer> numbers = new ArrayList<Integer>();
        numbers.add(11);
        numbers.add(22);
        numbers.add(33);
        numbers.add(44);
        numbers.add(55);
//获取迭代器
        Iterator<Integer> it = numbers.iterator();
        Iterator<Integer> it2 = numbers.iterator();
//输出集合中的所有元素
        while(it.hashNext()){
            System.out.println(it.next());
        }
//删除集合中大于30的元素
        while(it2.hashNext()){
            Integer i = it2.next();
            if(i > 30) {  
                it2.remove();
            }
        }
//创建Map
        Map<String,String> map = new HashMap<String,String>();
        map.put("1","value1");
        map.put("2","value2");
        map.put("3","value3");
//获取迭代器
        Iterator<Map.Entry<String,String>> itm = map.entrySet().iterator();
        while (itm.hasNext()) {
           Map.Entry<String, String> entry = itm.next();
           System.out.println("key= " + entry.getKey() + " and value= " +entry.getValue());
      }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值