Java集合框架

一. 集合类接口

Collection

最基本的集合接口,是各种集合结构的父接口,List和Set是继承自它的子接口。

List

是有序的,会精确的将元素插入到指定的位置(允许有相同元素)。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素。

ArrayList

List接口实现类,实现可变大小的数组,允许不同数据类型作为数据成员,可以随机访问

  • 底层用数组实现
  • 访问效率高,插入和删除效率低
  • 没有同步方法,不是同步的,线程不安全
LinkedList

List接口实现类,允许null元素,通常在首部或者尾部操作,常被使用做堆栈(Stack)、队列(Queue)和双向队列(Deque)

  • 底层用链表实现
  • 插入删除效率高,访问效率低
  • 没有同步方法,不是同步的,线程不安全
Vector

List接口实现类,类似于ArrayList,大小可变,存储类型必须是引用类型

  • 底层用数组实现
  • 是同步的,线程安全(Stack继承自Vector)

Set

不包含重复元素的Collection接口,只关心元素是否属于Set,不允许有相同元素,而不关心它的顺序

Map、Collection、Iterator关系

img

  • Iterator 适用于 Collection 所有子类
// Iterator 和 Collection的联系
Iterator iter = c.iterator() // c为某一集合类
  • Map 没有继承 Collection,由一系列键值对组成,键值对保持一一对应关系

Collection vs Collections

Collection
  • 集合接口,对集合对象进行基本操作的通用接口方法
  • 是各种集合结构的父接口,为各种具体的集合提供了最大化的统一操作方式
  • 例如:Set、List
Collections
  • 包装类,通过一些静态方法,完成集合类的一些操作功能的工具类
  • 不能被实例化
  • 例如:对集合进行的排序、二分查找的方法

集合类接口间对比总结

VectorArrayListLinkedList
是同步的(Synchronized),是线程安全的(thread-safe)不是同步的,但性能很好(线程的同步必然要影响性能)不是同步的,线程不安全
当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小
内部实现基于内部数组Object[]内部实现基于内部数组Object[]内部实现基于一组连接的Node结点
随机访问元素时,可以通过索引直接定位,效率较高;插入、删除等操作需移动数组元素,效率较低;元素个数大于数组容量,需要扩容随机访问元素时,必须从表头开始访问,效率较低;插入、删除操作不需移动Node结点,比ArrayList效率高;按需为元素分配内存空间
Hashtable(被淘汰)HashMapTreeMap
父类 Dictionary类(已被废弃)父类 AbstractMap类父类 AbstractMap类
数组+链表数组+链表红黑树
是线程安全的,它的每个方法中都加入了Synchronize方法不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题不是线程安全的,不同步
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1HashMap默认的初始化大小为16,之后每次扩充,容量变为原来的2倍
Hashtable使用对象的hashCode,进行除法运算得到元素位置哈希表的大小固定为2的幂,通过位运算获取元素位置
数据无序数据无序二叉树排序,数据有序(自然排序、定制排序)
不允许null key和null value允许null key和null value除第一个键外非空

二. 集合遍历方法

Iterator接口

  • hasNext():检索到有下一个对象返回ture,否则返回false。
  • next():在hasNext方法为true时调用,返回一个Object类型的对象引用。若这个方法没有对象返回,则抛出一个NoSuchElementException异常。
  • remove():在提供迭代器的集合对象中删除由next()方法指向的一个对象元素。若没有调用next(),或调用next()后连续两次调用 remove(),则会抛出 IllegaStateException 异常。不是所有提供此迭代器的集合对象都支持这个方法,如果不支持情况下调用了该方法,则会抛出 UnsupportedOperation 异常。
// c为某一集合类
// for循环
for(Iterator it = c.iterator(); it.hasNext();){
    MyObject o  = (MyObject)it.next();
    ...
}
// while循环
Iterator it = c.iterator(); 
while(it.hasNext()){
   MyObject o  = (MyObject)it.next();
   ...
}
// JDK 5 for each语句
for(MyObject o : c){
    ...
}

ListIterator接口

不仅可以实现向后遍历,还可以实现向前遍历

  • hasNext() / hasPrevious():检索到有下一个对象 / 上一个对象返回ture,否则返回false
  • next() / previous():在 hasNext / hasPrevious 方法为true时调用,返回一个Object类型的对象引用。若这个方法没有对象返回,则抛出一个NoSuchElementException异常。
Integer tem;
try{
	LinkedList<Integer>  lst = new LinkedList<Integer>();
	for (int i=0 ;i<10 ;i++ ){
		lst.add(new Integer(i));
	}
	ListIterator<Integer> ite = lst.listIterator(10);
	// 向前遍历
	while(ite.hasPrevious()){
		tem =ite.previous();
		System.out.print(tem.intValue()+" "); // 9 8 7 6 5 4 3 2 1 0 
	}
}catch(Exception e){
	System.out.println("error");
}

三. 常用集合类常用方法

ArrayList

import java.util.*;
public class Test {
    public static void main(String[] args){
        ArrayList<Integer> array = new ArrayList<Integer>();
        // 添加元素
        array.add(1);
        array.add(2);
        array.add(3);
        // 查找指定元素的位置
        System.out.println(array.indexOf(2)); // 1
        System.out.print("array1:");
        // 遍历元素
        for (int i : array) {
            System.out.print(i + " "); // array1:1 2 3 
        }
        System.out.println();
        // 移除指定位置元素
        array.remove(1);
        System.out.print("array2:");
        for(int i=0;i<array.size();i++) {
            // 获取指定位置的元素
            System.out.print(array.get(i)+" "); // array2:1 3 
        }
    }
}

LinkedList

import java.util.*;
public class Test {
    public static void main(String[] args){
        Integer tem;
        LinkedList<Integer> lst = new LinkedList<Integer>();
        // 添加元素
        for (int i=0; i<10 ; i++ ){
            lst.addFirst(new Integer(i));
        }
        for (int i=0; i<10; i++ ){
            // 查找第一个元素
            int n=lst.peek();
            // 移除最后一个元素
           	tem = lst.removeLast();
            System.out.print(i+1+" First:"+n+" ");
            System.out.println("Last:"+tem.intValue());
        }
    }
}
/*
	1 First:9 Last:0
	2 First:9 Last:1
	3 First:9 Last:2
	4 First:9 Last:3
	5 First:9 Last:4
	6 First:9 Last:5
	7 First:9 Last:6
	8 First:9 Last:7
	9 First:9 Last:8
	10 First:9 Last:9
*/

Vector

import java.util.*;
public class Test {
    public static void main(String[] args){
        Vector<Integer> ve=new Vector<Integer>();
        // 添加元素
        ve.addElement(2);
        ve.addElement(1);
        ve.addElement(3);
        // 移除指定位置的元素
        ve.removeElementAt(1);
        // 查找元素的位置
        System.out.println(ve.indexOf(3));
        for(int i=0;i<ve.size();i++){
            // 获取元素
            System.out.print(ve.get(i)+" ");
        }
    }
}

ArrayDeque

import java.util.*;
public class Test {
    public static void main(String[] args){
        ArrayDeque<Integer> ad=new ArrayDeque<Integer>();
        // 添加元素,push()
        ad.addFirst(4);
        ad.addLast(1);
        ad.offerFirst(2);
        ad.offerLast(3);
        // 获取第一个元素
        System.out.println(ad.getFirst()+" "+ad.peekFirst()); // 2 2
        System.out.println(ad);// [2, 4, 1, 3]
        // 移除第一个元素,pop()和最后一个元素
        ad.removeFirst();
        ad.pollLast();
        System.out.println(ad); // [4, 1]
    }
}

HashSet

import java.util.*;
public class Test {
    public static void main(String[] args){
        HashSet<Integer> hs=new HashSet<Integer>();
        // 添加元素,不重复添加
        hs.add(1);
        hs.add(5);
        hs.add(1);
        hs.add(3);
        // 遍历元素
        Iterator it=hs.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+" "); // 1 3 5
        }
    }
}

四. 集合类应用

  • 线程安全集合类(同步)
    • Vector
    • Hashtable、ConcurrentHashMap
  • 线程不安全集合类(异步)
    • ArrayList、LinkedList
    • HashMap

总结

​ 在整理博客的过程中参考了一些资料以及许多他人优秀的文章,就不一一列举,在此表示感谢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值