JAVA的集合体系

  • 常见数据结构
    线性表

    顺序线性表:数组,查询快,增删插入慢

    链式线性表:单向、双向链表

    栈 = last in first out

    队列:FIFO = first in first out

    数组与集合
    数组
    1.查询块,增删慢。
    2.相同数据类型,且定长。
    3.数组元素既可以为基本数据类型,也可以为引用类型。
    集合
    1.集合可以为不同类型(一般为相同类型,或自动转换),且长度自增。
    2.集合中的元素只能为引用类型或者说Object及其子类。集合中不能有基本数据类型的元素。
    在这里插入图片描述

     List、Set、Map的区别主要体现在两方面:元素是否有序、是否允许元素重复。三者之间的区别,如下表:
    在这里插入图片描述

     

    List接口
    1.是Collection接口的子接口,该List接口中的元素,是有序的,可重复的,可为多个null;且可以通过索引对List接口中的元素进行访问。
    2.List特有的方法listIterator()方法。
    在迭代过程中,不能使用迭代对象和集合对象同时操作集合中的元素。否则会报ConcurrentModificationException。
    ListIterator对象中除了可以在迭代过程中,移除集合中的元素,还可以对集合进行添加,设置。还可以从下往上遍历循环集合中的元素。
    Iterator接口只能从上向下遍历集合中的元素,且在迭代过程中,仅可以移除集合中的元素。

    List接口实现
    ArrayList 可变数组
    底层由数组实现,查询快,删插入速度慢。
    ArrayList类是不同步的,如果需要同步,可以使用Coolections.synchronizedList(ArrayList对象)方法,使其同步。
    Vector 矢量
    底层也由数组实现
    与ArrayList基本相同
    是同步的类
    LinkedList 链表
    底层有双向循环链表实现。查询速度慢,删插入速度快。
    LinkedList除了实现父接口中的方法,还扩展了自己的方法。比如在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。
    此实现不是同步的,想要实现同步,可以使用List list = Collections.synchronizedList(new LinkedList(…));
    ArrayList类与Vector类的异同
    相同点
    他们都是Collection或List接口的具体实现类。
    他们都能存储任意类型的对象。但通常情况下,这些不同的对象都具有相同的父类或父接口。
    他们都不能存储基本数据类型(primitive);集合对象.add(1),可以添加成功,但内部相当于int->Integer->Object.
    他们底层都是由可变数组实现的。容量都可以自动扩充。
    不同点
    Vector是同步的,线程安全的,效率较低;ArrayList是不同步的,线程不安全,但效率高。
    Vector缺省情况下,自动增长为原来的一倍空间;ArrayList缺省情况下,自动增长为原来的一半。
    Iterator和ListIterator接口
    iterator()方法在Collection接口;(List,Set中都包含)
    listIterator()方法仅在List接口中;
    ListIterator接口中提供了比Iterator接口更多,更丰富的方法。

    Iterator与Enumeration两个接口
    Iterator迭代器取代了 Java Collections Framework 中的 Enumeration。其功能相同。
    迭代器与枚举有两点不同:
    迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
    方法名称得到了改进。
    Set接口
    没有扩充自己的方法,与Collection中的方法完全一致

    HashSet
    此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
    此实现不是同步的,想实现同步,需要使用Set s = Collections.synchronizedSet(new HashSet(…));
    当一个对象存入HashSet集合对象中时,会先比较hashCode值,如果hashCode值不同,则直接存入集合;如果hashCode值相同,再使用equals方法比较对象,如果为true则不添加;如果为false,则添加到该集合对象中。也就是说,hashcode值相同,则equals未必相同,equals相同的两个对象,hashcode值一定相同。
    如果自定义类的对象,存放入HashSet对象中,必须要实现hashCode()方法和equals方法。

    在使用HashSet时,如果添加对象后,对对象的属性值进行修改了,可能会造成内存泄漏。以后使用HashSet存放数据时,尽量不要修改其中对象的属性值。
     

    public class MySet
    {
        private LinkedList[] lls = new LinkedList[10];
        public MySet(){}
        public boolean add(Object obj)
        {
            int hashcode = obj.hashCode();
            int index = hashcode % lls.length;
            //第一次向数组中存放元素。
            if(lls[index] == null)
            {
                lls[index] = new LinkedList();
                lls[index].addFirst(obj);
                return true;
             }else{
                //用obj对象使用equals方法与lls[index]表示的集合对象中每个元素比较属性值是否相同
                if(lls[index].contains(obj))
                {
                    return false;
                }
                lls[index].addFirst(obj);
                return true;
            }
    }
    }
    

    TreeSet
    使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序。
    对集合中的元素,默认按照自然顺序自动排列。
    TreeSet底层使用是二叉树。
    对于TreeSet对象来说,要求存放入其元素的类型必须具有比较性。当类实现Comparable接口,并重写compareTo方法,该类的对象具有了比较性。把这种形式叫做按照自然顺序排序。
    TreeSet对象,通过compareTo对存放入其中的元素进行排序,且也是通过该方法比较两个对象是否相同。如果相同,则不会添加到TreeSet对象中。为了更精确的表示两个对象相等,当某个属性比较为0时,必须判断其他属性是否相等,当所有属性都相等时,两个对象真正相同。
    Comparable与Comparator区别?
    Comparable位于java.lang包中;Comparator位于java.util包中。
    Comparable需要重写compareTo方法;Comparator需要重写compare方法。
    Comparable只能对排序对象指定一个排序规则;Comparator,可以自己创建类,独立的定义对象的排序规则,而且可以定义多个排序规则。
    Map接口
    表示集合,与Collection体系无关,Map存放的是key-value的键值对。
    在Map中,key不能重复,所以key的集合为Set;value的值可以重复,所以value的集合可以看做Collection。

    HashMap
    Hashtable
    Properties
    TreeMap
    HashMap与Hashtable
    HashMap底层是哈希表,key和value可以为null;不同步,线程不安全,效率较高。如果想实现HashMap的同步,则使用Collections.synchronizedMap方法。
    Hashtable底层是哈希表,key和value不能为null;同步,线程安全,效率较低。
    注意:
    –Map在真实使用中,key很少使用自定义的类型,如果为自定义的类型,则该类必须重写hashCode和equals方法。一般key都是使用八种基本数据类型对应的包装类或String类型。
    –对于Map来说,key和value是一一对应的。如果出现一个key对应多个value的情况。比如巴塞罗那足球队有多个球员。将所有的球员添加到一个集合中,球队为key,集合为value。

    Collections类
    是一个工具类,类中所有的方法都是static。这些方法都是操作Collection体系的。
    Collections类中,主要对集合进行排序,查找,替换,填充等功能。
    Collections与Collection区别?
    Collection是集合中的顶层接口,其右两个子接口List,Set.
    Collections是工具类,里面提供了操作(Collection)集合对象的各种静态方法。
    集合和数组之间互相转换
    数组->集合
    通过Arrays.asList(T… obj)方法将数组转换成List对象。但是主要,转换后,不可以使用集合对象中的增删方法(使用的话,会报UnsupportedOperationException)。因为数组长度是固定的。但可以使用查询,判断等不修改数组长度的方法。
    集合->数组
    使用集合对象中的toArray()(该方法只能返回Object[]),toArray(T[] t)可以指定具体数组元素的类型。
    String[] objs2 = list.toArray(new String[10]);此时,T[]的数组的长度如果小于等于集合中元素的个数,JVM会自动以元素个数为数组分配内存。如果超过集合对象中元素的个数,剩余部分以数组元素类型默认值填充。
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值