08List集合,Set集合,比较器

08List集合,Set集合,比较器

1、List

ArrayList

继承自Collection接口,是单列集合的一个重要分支。
实现List接口的对象称为List集合。

  • List集合特点:
    (1)允许出现重复元素------线性方式存储,在程序中可以通过索引来访问集合中的指定元素。
    (2)元素的存入顺序和取出顺序一致

  • List接口特点:
    (1).它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、 22、33的顺序完成的)。
    (2)它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
    (3)集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

  • List接口中的常用方法:
    public void add(int index, E element):将指定的元素,添加到该集合的指定位置上;
    public E get(int index):返回集合中指定位置的元素:
    Public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素
    Public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

  • ArrayList是List接口下面的一个实现类, 是最常用的实现类。

  • ArrayList是使用数组保存数据。 特点:查询快,增删慢。

LinkedList

关于LinkedList---------------LinkedList是List接口下另一个实现类。
LinkedList内部是在使用链表(双向链表)保存数据。
LinkedList的特点是查询慢,增删快
LinkedList有一些【特有】的方法,可以对集合的首尾进行操作。
public void addFirst(E e) :将指定元素插入此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public E getFirst() :返回此列表的第一个元素。
public E getLast() :返回此列表的最后一个元素。
public E removeFirst() :移除并返回此列表的第一个元素。
public E removeLast() :移除并返回此列表的最后一个元素。
public E pop() :从此列表所表示的堆栈处弹出一个元素。
public void push(E e) :将元素推入此列表所表示的堆栈。

2、数据结构简易说明

数据结构:数据用什么样的方式组合在一起。
常见数据结构

  • 栈:stack 又称堆栈,是运算受限的线性表
  • 数据结构是数据的存储方式。常见的数据结构有:栈, 队列,数组,链表, 树
  • 栈:先进后出
  • 队列结构的特点:先进先出
  • 数组数据结构:查询快,增删慢
  • 链表(在内存中是离散存储)的特点:查询慢,增删快
  • 红黑树:
  • 平衡树:

3、Set

Set

Set是Collection下面的另一个子接口
Set接口有以下三个特点:
(1)无序(按照什么顺序存,不一定按照什么顺序取)
(2)无索引(不能根据索引获取元素)
(3)不可重复(不能存放重复元素)
Set是一个接口,如果要用需要使用实现类,最常用的实现类是HashSet。
HashSet是Set接口下最常用的实现类, 满足Set接口所有的特点。
如果要对Set集合进行遍历,可以使用迭代器或增强for循环(推荐)

哈希值

哈希值是对象的一个标识,一个特征码,哈希值是一个int数字。

在Object中有一个方法叫做HashCode,可以获取到对象的哈希值。

  • Int HashCode();获取对象的哈希值。
    Object中的hashCode方法, 哈希值是根据地址值计算的。

    注意; 哈希值是对象的一个标识,但是不是唯一的标识。对象的哈希值允许相同的。
    如果哈希值根据地址值计算,一般来说意义不大,我们更多的是希望根据对象的属性计算对象的哈希值。
    如果两个对象的属性完全相同,那么得到的哈希值也应该是相同的。
    如果想要自己定义哈希值的计算规则,那么需要重写hashCode方法。

    小结:
    1. 哈希值是一个int数字。
    2. 我们可以把哈希值看成对象的一个标识,一个特征码。
    3. 哈希值允许重复。
    4. 我们可以重写hashCode方法,定义自己的哈希值计算规则。
    使用HashSet集合存储Student对象,并保证唯一性(如果两个学生对象的属性完全相同,就看成是同一个对象)

    • HashSet保证唯一性的过程
      1. 先比较两个对象的哈希值。
        如果哈希值不同,肯定是不同的对象。
        如果哈希值相同,不一定是相同对象。
      2. 如果哈希值相同,还需要使用equals方法进行比较。
        如果equals结果是true,那么表示两个对象相同
        如果equals结果是false,那么表示两个对象不同
        结论:如果要使用HashSet存储元素并保证唯一性(对象的属性相同就看成是同一个对象),那么需要重写hashCode和equals。

LinkedHashSet

  • LinkedHashSet是Set接口下的另一个实现类。
  • LinkedHashSet内部除了有一个哈希表之外,还有一个链表, 链表的作用是保证有序。
  • LinkedHashSet的特点是有序的。
  • Set接口是无序的,但是不能保证所有的实现类都无序。

4、Collections

Collections是一个操作集合的工具;

/*
    Collections是一个操作集合的工具类。
        static void shuffle(List<?> list): 打乱顺序
        static void sort(List list): 对集合中的元素排序(自然排序)
        static void sort(List list, Comparator c):对集合中的内容排序。list表示要排序的结合。c表示比较器。(比较器排序的方法)
 */

实现Comparable接口后,就表示该类的对象就具备了比较的功能。 在使用Collection的sort方法进行排序时,内部会自动调用compareTo方法比较两个对象谁大谁小。

如果返回值是正数,表示调用者对象大于参数对象
如果返回值是负数,表示调用者对象小于参数对象
如果返回值是0,表示调用者对象等于参数对象

我们要在compareTo定义比较的规则
公式:(升序就是我(调用者)减他(参数))
要根据什么内容进行排序,那么就让什么属性相减。

Comparator表示的是比较器,当Rule实现了Comparator接口,Rule也就表示比较器
当使用Collections中的比较器排序的方法进行排序时。
内部会调用compare方法比较两个对象谁大谁小

如果compare方法返回值是正数,表示第一个对象大于第二个对象。
如果compare方法返回值是0,表示第一个对象等于第二个对象
如果compare方法返回值是负数,表示第一个对象小于第二个对象

  • 公式:【升序就是一减二】
    要根据什么内容排序,就让什么属性相减。
    Egg:Collections.sort(personList,new Rule());

  • Collections中有一个方法叫做sort,用来比较器排序
    static void sort(List list, Comparator c): 参数list表示要排序的集合,参数c表示比较器。

    如果一个类没有实现Comparable接口,那么就表示该类的对象并不具备比较的功能,那么就不能直接进行排序了。
    我们找一个法官,帮这些对象去比较大小,那么这样也可以进行排序,这种排序时比较器排序,这个法官就是一个比较器。

  • 自然排序指的是对象本身具备了比较的功能,那么我们可以使用sort方法直接排序。当类实现了Comparable接口后,表示该类的对象具备了比较的功能。

  • 比较器排序指的是即使对象不具备比较的功能,我们找一个法官(裁判)帮这些对象进行比较,这个法官就是比较器。当类实现了Comparator接口后,该类就变成了比较器

  • Comparator是一个接口,该接口表示比较器。 如果我们使用,需要使用这个接口的实现类,这个实现类需要我们自己创建。

/*
    Comparator表示的是比较器,当Rule实现了Comparator接口, Rule也就表示比较器。
 */
public class Rule implements Comparator<Person>{
    /*
        当使用Collections中的比较器排序的方法进行排序时。
        内部会调用compare方法比较两个对象谁大谁小。
        如果compare方法返回值是正数,表示第一个对象大于第二个对象。
        如果compare方法返回值是0,表示第一个对象等于第二个对象
        如果compare方法返回值是负数,表示第一个对象小于第二个对象。
        公式:【升序就是一减二】
        要根据什么内容排序,就让什么属性相减。
     */
    @Override
    public int compare(Person o1, Person o2) {
        //根据年龄升序排序
        return o1.getAge() - o2.getAge();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值