单列集合

List集合

  • 存储有序
  • 元素有索引
  • 存储元素可以重复

ArrayList: 底层为数组,查询块,增删慢,查询块

LinkedList: 底层为链表,查询慢,增删快

Vector: 底层为数组,线程安全,增删和查询都慢,已经被ArrayList替代.

Set集合

  • 存储无序
  • 元素无索引
  • 存储的元素不能重复

Set集合实现元素添加,使用的是双列集合map的put方法,因为map集合的键是唯一的,不允许重复,刚好满足set集合的需求.

查看HashSet和TreeSet的add()方法,源码如下:

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

Hashset: 底层为hash表.

HashSet保证元素唯一性源码分析:

public V put(K key, V value) {

    // 得到哈希值
    int hash = hash(key);
    int i = indexFor(hash, table.length);

    //遍历集合,将集合中所有元素与待添加元素进行比较
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
    //如果hash值不同直接添加
    //如果hash相同,则比较内容,如果内容相同,则返回原元素值,不添加
    //hash值不同,内容不同则添加
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

HashSet为了保证元素的唯一性,添加元素比较hashcode值,如果hash值不一样,直接添加.如果一样,则比较地址值或者通过equals方法比较内容.自定义对象的hash值都不相同,没有办法实现去重.所以需要重写hashcode方法和equals方法.重写hashcode时,一般会和对象的属性相关联,从而降低一部分equals方法的比较,从而可以提高我们程序的效率

TreeSet: 底层为二叉树

TreeSet保证集合元素唯一性原理:要保证元素唯一性,首先存储的元素需要具备可比较性,基本数据类型的包装类都实现comparable接口,具备可比较性.

如果要存储自定义对象,该自定义对象需具备可比较性,有两种方式:

第一:让该类实现Comparable接口,重写compareTo()方法,在compareTo()方法中自定义比较方式.

第二:让该类实现Comparator接口,重写compare()方法自定义方法排序,参见TreeSet构造方法.

public TreeSet(Comparator<? super E> comparator) {

    this(new TreeMap<>(comparator));
}

既然谈到比较了,现将以下几种比较方式进行对比分析:

==, .equals(), compareTo(), and compare()

==

  • 如果比较基本数据类型,比较的是字面值.
  • 如果比较的是引用,则可以用于比较判断该引用指向是否为空.
  • 可以比较两个枚举值,因为一个枚举常量只能有一个对象.
  • 可以用于判断两个引用是否指向同一个对象.

a.equals(b)

比较字面值是否相等,定义在object类中如下:

public boolean equals(Object obj) {
    return (this == obj);
}

其他类如果不重写该方法,则相当于使用==进行比较

a.compareTo(b)

该方法来源于Comparable接口,比较的是数值,返回一个int数,判断值小于(返回一个负数),等于(返回0),或者大于(返回一个正数)如果一个类实现了comparable接口,定义了compareTo()方法.所有Java类中实现了该接口的类,都可以进行自然顺序.

compare(a, b)

该方法来源于Comparator接口,可以用于TreeMap and TreeSet集合对数据进行排序.可以自定义方法,对事物进行比较排序,比如可以定义一个方法,根据字符串的长度,对字符串进行排序.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,有多种单列集合可供使用。其中一些常见的单列集合包括: - ArrayList:ArrayList是基于数组实现的动态数组,可以根据需要自动扩展容量。它允许存储重复元素,并且可以按索引访问元素。 - LinkedList:LinkedList是基于链表实现的集合,它可以高效地进行插入和删除操作。与ArrayList相比,LinkedList在随机访问方面性能较差,但在插入和删除操作方面更加高效。 - HashSet:HashSet是基于哈希表实现的集合,它不允许存储重复元素,并且不保证元素的顺序。HashSet提供了常数时间的插入、删除和查找操作。 - TreeSet:TreeSet是基于红黑树实现的有序集合,它按照元素的自然顺序进行排序,或者根据提供的Comparator进行排序。TreeSet不允许存储重复元素。 - LinkedHashSet:LinkedHashSet是基于哈希表和链表实现的有序集合,它按照元素插入的顺序进行排序。LinkedHashSet允许存储重复元素。 - PriorityQueue:PriorityQueue是基于优先级堆实现的队列,它根据元素的优先级进行排序。PriorityQueue允许存储重复元素,并且提供了常数时间的插入和删除最小元素的操作。 以上是一些常见的单列集合,每种集合都有其特定的用途和适用场景。具体选择哪种集合取决于你的需求和性能要求。 #### 引用[.reference_title] - *1* *2* *3* [Java中Collection单列集合](https://blog.csdn.net/m0_60489526/article/details/119830185)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值