[总结]Java中的集合

/ 0评 / 0

    集合的由来:

        在Java当中存储一类数据的时候可以使用数组,但数组有一个缺点:长度是固定的,当添加的元素超过了数组的长度时需要对数组重新定义。而集合类可以存放对象的引用。

    相较于数组集合有两个特点 :1、长度可以自动增长 2、存放元素有自动装箱过程

    集合的分类

Collection 
├List 可重复的无序列表
│├LinkedList   底层使用链表,增删快查找慢 效率高
│├ArrayList  底层使用数组,查询快增删慢,线程不安全效率高
│└Vector    底层使用数组,查询快增删慢,线程安全效率高
│ └Stack
└Set    无序不重复的集,旗下TreeSet有序
Map    双列结构的映射
├Hashtable
├HashMap
└WeakHashMap

Collection接口:


    由上可知Java中的集合都实现了这个接口,故只要是集合就会存在以下的一些方法:


    其中可以发现 存在其当中的Iterator迭代器。这个迭代器一般用于遍历集合。

    List



    由于实现了Collecton接口,所以List当中的方法大多苟同,这里只关心他们三个的特点和区别:

    ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。
    LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。
    Vector:底层数据结构是数组,查询快,增删慢。线程安全,效率低。
    Vector相对ArrayList查询慢(线程安全的)
    Vector相对LinkedList增删慢(数组结构)

    Set


    此处暂时只写HashSet的构造方法,由于TreeSet独有的单列排序无重复的特点,放到后面和 TreeMap一起。而HashSet继承了 AbstractSet,在底层Set在去元素重复的时候会有这样一个过程:每添加一个新的元素的时候Set会生成一个Hash值,这个值来源于其底层的HashCode方法,他会先比较hash值,若值相同会继续使用equals方法来对比。当插入的引用是自定义的时候,需要重写equals方法和hashcode方法来自定义自己的去重复标准。

    Map

Map的双列结构注定和单列的Collection不一样,他的构造方法如下:


    而Map也是根据键值对来确定你的元素是否重复,若键值相同那么Map就实行后来者居上的办法将原来的值覆盖。其中HashMap和HashTable还是有区别的:

        Hashtable是JDK1.0版本出现的,是线程安全的,效率低;HashMap是JDK1.2版本出现的,是线程不安全的,效率高
        Hashtable不可以存储null键和null值;HashMap可以存储null键和null值

    Map旗下方法大致有:

    
    下面来说留下的TreeSet和TreeMap

    TreeSet


    单看构造方法也觉得没什么特别,但是TreeSet是有序集,通过实现Comparable接口亦或者是Comparator接口,其中的comparaTo或者compare方法会实现排序,同样的,当传入的引用是自定义的对象时,你先需要重写上面的两个方法之一,他们之间还是有区别的:

1)自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
2)比较器顺序(Comparator)
创建TreeSet的时候可以指定一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中compare()方法排序
调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
3)两种方式的区别
TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序
TreeSet如果传入Comparator, 就优先按照Comparator
    具体情况如下:


     这个时候需要拿出来快凉了的TreeMap,他只是同时拥有Tree 和 Map的特性,定义和使用和HashMap没有什么大的区别。

    而在java开发中集合的使用往往离不开泛型:

    泛型:参数化数据类型,将数据类型作为参数进行传递

泛型好处:
    1)提高安全性:将运行期的错误转换到编译期
    2)增加可读性
详细请跳转:https://www.ziwenxie.site/2017/03/01/java-generic/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注