java中的单列集合List和Set

集合框架(集合的由来及集合继承体系图)

  • A:集合的由来
    • 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少
  • B:数组和集合的区别
    • 区别1 :
      • 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
      • 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
    • 区别2:
      • 数组长度是固定的,不能自动增长
      • 集合的长度的是可变的,可以根据元素的增加而增长
  • C:数组和集合什么时候用

  * 1,如果元素个数是固定的推荐用数组

  * 2,如果元素个数不是固定的推荐用集合

其中,对于List集合:

  ArrayList:

      底层数据结构是数组,查询快,增删慢。

      线程不安全,效率高。

  Vector:

      底层数据结构是数组,查询快,增删慢。

      线程安全,效率低。

  Vector相对ArrayList查询慢(线程安全的)

  Vector相对LinkedList增删慢(数组结构)

  LinkedList:

      底层数据结构是链表,查询慢,增删快。

      线程不安全,效率高。

  Vector和ArrayList的区别

      Vector是线程安全的,效率低

      ArrayList是线程不安全的,效率高

  共同点:都是数组实现的

  ArrayList和LinkedList的区别

      ArrayList底层是数组结果,查询和修改快

      LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢

  共同点:都是线程不安全的

其中Set集合中的hashSet集合:

Set集合,无索引,不可以重复,无序(存取不一致)

* HashSet集合去除重复,依赖的是底层的HashCode方法和equals方法,默认的HashCode方法表示的每个对象的地址值是不同的,所以在比添加元素的时候,系统会因为各个对象的默认HashCode值不同,而认为不是同一元素,所以都添加进去了.根本就没有走equals方法,没有进行内容判断,所以添加了重复元素...所以,我们需要对Hash和equals进行重写,使得,相同元素的HashCode值一定相同,但是,这样重写之后,有可能会出现不同元素的HashCode值可能相同的情况,这样,可能会被误判断是同一元素,所以,针对这种HashCode值相等的情况需要再次走equals方法进行判断, 判断内容是不是相同,相同就是同一元素,不添加.要是不相同,就不是同一种元素,就得添加

          * 

          * 总结如下:

          *         第一步:看HashCode值是否相同,

          *                     不同:就是不同元素,添加

          *                     相同:就走equals方法进行判断

          *                             equals相等,是同一元素,不添加

          *                             equals不相等,不是同一元素,添加

  •  

            HashCode 和equals方法只应用于HashSet和LinkHashSet以及HashMap和LinkedHashMap集合,

 

 2.将自定义类的对象存入HashSet去重复

    * 类中必须重写hashCode()和equals()方法

    * hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)

    * equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储

3. LinkedHashSet的特点

     * 底层是链表实现的,是set集合中唯一一个能保证怎么存就怎么取的集合对象

     * 因为是HashSet的子类,所以也是保证元素唯一的,与HashSet的原理一样

其中Set集合中的TreeSet集合:

  • 1.特点
    • TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
  • 2.使用方式
    • a.自然顺序(Comparable)
      • TreeSet类的add()方法中会把存入的对象提升为Comparable类型
      • 调用对象的compareTo()方法和集合中的对象比较
      • 根据compareTo()方法返回的结果进行存储
    • b.比较器顺序(Comparator)
      • 创建TreeSet的时候可以制定 一个Comparator
      • 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
      • add()方法内部会自动调用Comparator接口中compare()方法排序
      • 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
    • c.两种方式的区别
      • TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
      • TreeSet如果传入Comparator, 就优先按照Comparator

自然排序原理图: 

比较器排序原理图:

TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一

     *         8种基本包装类和String类,源文件都是实现了comparable接口,而且重写了

     *         compareTo方法,默认按照字典顺序排序

     * 当compareTo方法返回0的时候集合中只有一个元素(唯一性)

     * 当compareTo方法返回正数的时候集合会怎么存就怎么取(升序)

     * 当compareTo方法返回负数的时候集合会倒序存储(降序)

猜你喜欢

转载自blog.csdn.net/weixin_41384583/article/details/82191646