单列集合

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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值