集合的使用


前言

针对最近几天对集合的学习,做出一些自己的理解,有不对的地方请指出。


一、集合的体系结构

在这里插入图片描述


二、Collection

1.概述

  • 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素

  • JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现

2.常用方法

  • boolean add (E e):添加元素
  • boolean remove(Object o):从该集合中删除指定元素的单个实例
  • void clear():清空集合中的元素
  • boolean contains(Object o):如果此集合包含指定的元素,则返回true
  • boolean isEmpty():如果此集合不包含元素,则返回 true
  • int size():集合的长度,也就是集合中元素的个数

3.案例

import java.util.ArrayList;
import java.util.Collection;

public class collectionDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<String> c = new ArrayList<>();

        //添加元素
        c.add("hello");
        c.add("world");
        c.add("java");

        //删除指定元素
        System.out.println(c.remove("world" ));
		//没有指定元素则返回false
        System.out.println(c.remove("javas" ));

        //清空集合中的元素
        c.clear();

        //如果此集合包含指定的元素,则返回true,否则返回false
        System.out.println(c.contains("world"));

        //如果此集合不包含元素,则返回 true,否则返回false
        System.out.println(c.isEmpty());

        //返回集合的长度,也就是集合中元素的个数
        System.out.println(c.size());

        //输出集合对象
        System.out.println(c);
    }
}

三、List

1.特点

  • 有序:存储和取出元素顺序一致
  • 可重复:存储的元素可以重复

2.子类

  • ArrayList:底层数据结构为数组,查询快,增删慢,线程不安全,效率高;
  • Vector:底层数据结构为数组,查询快,增删慢,线程安全,效率慢,一般不用;
  • LinkedList:底层数据结构为链表,查询慢,增删快,线程不安全,效率高

3.常用方法

  • boolean add(E o) 向列表的尾部追加指定的元素
  • void add(int index,E element) 在列表的指定位置插入指定元素。
  • boolean addAll(Collection<? extends E> c) 追加指定 collection中的所有元素到此列表的结尾,顺序是指定collection的迭代器返回这些元素的顺序。
  • boolean addAll(int index,Collection<? extends E> c) 将指定collection中的所有元素都插入到列表中的指定位置。
  • void clear() 从列表中移除所有元素。
  • boolean contains(Object o) 如果列表包含指定的元素,则返回true。
  • boolean containsAll(Collection<?> c) 如果列表包含指定collection的所有元素,则返回true。
  • boolean equals(Object c) 比较指定的对象与列表是否相等。
  • E get(int index) 返回列表中指定位置的元素。
  • int hashCode() 返回列表的哈希码值。
  • int indexOf(Object o) 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回-1。
  • boolean isEmpty() 判断集合是否为空 如果为空 则返回true,否则返回false
  • Iterator iterator() 返回以正确顺序在列表的元素上进行迭代的迭代器。
  • int lastIndexOf(Object o) 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回-1。
  • ListIterator listIterator() 返回列表中元素的列表迭代器(以正确的顺序)。
  • ListIterator listIterator(int index)返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始。
  • E remove(int index) 移除列表中指定位置的元素。
  • boolean remove(Object o) 移除列表中出现的首个指定元素。
  • boolean removeAll(Collection<?> c) 从列表中移除指定collection中包含的所有元素。
  • boolean retainAll(Collection<?> c)仅在列表中保留指定collection中所包含的元素。
  • E set(int index,E element) 用指定元素替换列表中指定位置的元素。
  • int size() 返回列表中的元素数。
  • List subList(int forIndex,int toIndex) 返回列表中指定的formIndex(包括) 和toIndex(不包括)之间的部分视图。
  • Object toArray() 返回以正确顺序包含列表中的所有元素的数组。

4.遍历方式

public class TraversalList {
    //http://www.cnblogs.com/interdrp/p/3663602.html
    public static void main(String args[]){

        List<String> list = new ArrayList<String>(
        list.add("hello");
        list.add("world");
        list.add("java");
            
        //方法1 用迭代器迭代
        Iterator it = list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        //方法2 增强型for循环遍历
        for(String value:list){
            System.out.println(value);
        }
        //方法3 一般型for循环遍历
        for(int i = 0;i < list.size(); i ++){
            System.out.println(list.get(i));
        }
    }
}

四、Set

1.特点

  • 存储的数据无序(不等于随机,因为是按照特定的规则制订的)
  • 不可重复

2.子类

  • HashSet : 内部数据结构是哈希表, 是不同步的
  • LinkedHashSet : 存入和取出的顺序一致(有序)
  • TreeSet : 内部数据结构是红黑树,可以对 Set 集合中的元素进行排序, 是不同步的.

3.HashSet 与 TreeSet 区别

一方面(联系):它们是set的子类,都具有无序、无重复、无索引的特点;
另一方面(区别):
(1)Hashset接口是无序、不可重复的集合;而TreeSet是有序的;
(2)HashSet底层是Hash实现(数组+链表),线程不安全;而TreeSet底层是红黑树数据结构,默认就对元素排序了;
(3)底层:HashSet实现了Set接口,由于是Hash表,实际上采用一个HashMap的实例,所有元素存储在HashMap的Key上,而value有一个固定的值,HashSet不存储重复元素iu是重写Hashcode()和equals()方法;TreeSet底层是用TreeMap实现的,构造方法中会采用一个TreeMap实例存放元素,添加元素时先判断有无比较器,如果有就根据比较器规则进行比较,没有比较器的话,就根据元素本身特性进行添加。

4.Comparable 和Comparator的区别

  • Comparable 自然排序 ,实体类实现Comparable接口,可以去重写compareTo()方法,解决实际排序问题。 把元素放到TreeSet里面去,就会自动的调用CompareTo方法; 但是这个Comparable并不是专为TreeSet设计的;只是说TreeSet顺便利用而已; 就像haashCode和equals 也一样,不是说专门为HashSet设计一样;只是你顺便利用而已;

  • Compartor第三方的比较器接口,也不是专门为TreeSet设计。 用法:设计一个比较器. 创建一个类,实现这个接口,覆写compare()方法,解决不同问题的需求。


五、Map

1.特点

  • map集合特点就是采用了 Key-value键值对映射的方式进行存储

  • key在Map里面是唯一的但是value可以重复,一个key对应一个value。

  • key是无序、唯一的

  • value是无序不唯一的

2.子类

HashMap:

  1. HashMap是map的实现类

  2. 允许多个null值和一个null键

  3. HashMap中的元素没有顺序(跟添加的顺序无关)

  4. HashMap不是线程安全的。

TreeMap:

  1. 可以按着key来做排序

  2. Key不能为null,key不能重复,值可以有多个null

  3. 不是线程安全的

3.常用方法

  • Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
  • void putAll(Map m):将m中的所有key-value对存放到当前map中
  • Object remove(Object key):移除指定key的key-value对,并返回value
  • void clear():清空当前map中的所有数据
  • Object get(Object key):获取指定key对应的value
  • boolean containsKey(Object key):是否包含指定的key
  • boolean containsValue(Object value):是否包含指定的value
  • int size():返回map中key-value对的个数
  • boolean isEmpty():判断当前map是否为空
  • boolean equals(Object obj):判断当前map和参数对象obj是否相等
  • Set keySet():返回所有key构成的Set集合
  • Collection values():返回所有value构成的Collection集合
  • Set entrySet():返回所有key-value对构成的Set集

4.HashMap与TreeMap的区别

相同点:

  • HashMap非线程安全,TreeMap非线程安全
  • 都继承了AbstractMap

不同点:

  • HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()(可以重写hashCode()和equals()),为了优化HashMap空间的使用,您可以调优初始容量和负载因子。

  • TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

  • HashMap :适用于在Map中插入、删除和定位元素。Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

  • HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。

  • HashMap的结果是没有排序的。TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map中插入、删除和定位元素,HashMap是最好的选择。TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了关于我自己对于集合的一些使用,有不对的地方也请大家指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值