Java中用的最多的类(之一) 容器类

java容器类的两大接口

collection和map,是Java容器类中的最主要的两个接口。其他容器类都是从这两个接口中派生出来的。

  • collection:可以认为是基础的线性表,旗下继续派生出两个子接口:list和set。
  • map:可以认为是基础的键值对集合

collection接口

collection拥有对线性表的基础操作,主要方法有:

boolean add(Object o) //添加对象到集合
boolean remove(Object o) //删除指定的对象
int size() //返回当前集合中元素的数量
boolean contains(Object o) //查找集合中是否有指定的对象
boolean isEmpty() //判断集合是否为空
Iterator iterator() //返回一个迭代器
boolean containsAll(Collection c) //查找集合中是否有集合c中的元素
boolean addAll(Collection c) //将集合c中所有的元素添加给该集合
void clear() //删除集合中所有元素
void removeAll(Collection c) //从集合中删除c集合中也有的元素
void retainAll(Collection c) //从集合中删除集合c中不包含

Iterator:所有的集合类都继承了这个接口。可以配合for-each循环获得集合的所有元素,而不需要知道具体细节
这些操作也是集合类中最常用的操作,不多说了,我先背这些方法去了。。

collections:这是一个工具类,提供了很多方法来对collections进行操作。与collection分清。

List和Set

这是继承自collection接口的两个接口,分别拓展了不同的作用

  • List:加入了“有序”的概念,可以使用户控制插入元素的位置(collection不行)。也可以使用位置(数组下标?)直接访问元素。
    包括:ArrayList,LinkedList,Vector,Stack等

  • Set:这个集合中的元素是不能重复的。即 e1.equals(e2) = false
    包括:HashSet,TreeSet等

以上两个接口继续往下拓展,下面即是用的最多的各种collection实现类了

List旗下
  • ArrayList:用的最多,表面上看是更加灵活、容量可变的数组,实际上底层实现也是数组。所以擅长随机访问,不擅长随机增删。
    长度自动增长是由复制粘贴算法实现,所以如果大数据存放,事先应该设置大小

  • LinkedList:底层实现是链表,所以更加擅长增删,不擅长随机访问。此外LinkedList提供额外的get(),remove(),insert()方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

    以上两个类都是线程不安全的,如果需要线程安全,请使用下面这个类

  • Vector:可以认为是线程安全的ArrayList。迭代器在别的线程改变元素时,会抛出异常(上面两个类不会)。

  • Stack:继承自Vector,是一个堆栈。提供push()、pop()等方法进行堆栈操作。

Set旗下
  • HashSet:使用哈希表来实现Set,不允许重复,访问速度快,允许包含值为null的元素。底层使用了hashmap进行实现。

    哈希表是一种用空间换时间的数据结构,访问速度快。

  • TreeSet:是一种排序的Set,插入时即确保顺序,底层使用TreeMap进行实现

    底层实现是map,表现出来connection(笑)

Map接口

这个接口定义了一种键值对的集合,一个Map中不能包含相同的key,每个key只能映射一个 value。
主要方法:

    boolean equals(Object o) //比较对象
    boolean remove(Object o) //删除一个对象
    put(Object key,Object value) //添加key和value

以下是几个主要的实现类

  • HashTable:实现了一个key-value的哈希表,get()和put()操作实现添加和取出。Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。哈希表需要在时间和空间方面取舍。
    这个类是线程安全的,不允许空元素(null)

    按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。
    如果需要用自己定义的类作为key,为了避免上面的冲突,需要同时复写equals方法和hashCode方法,而不要只写其中一个。

  • HashMap:类似hashtable,不同的是,这个类是非同步的,并且允许null存在

  • WeakHashMap:WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。


以上只是简单地说了说java中常用的集合类,其实每个类展开都能讲很多,还需要在日常使用中多加熟练。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值