(最详细)关于List和Set的区别与应用

本文详细比较了Java中的List和Set两种数据结构,强调了它们在实现、顺序性、元素重复性、查找效率以及contains()方法上的差异,以实例展示了Set在contains()方法上的优势。
摘要由CSDN通过智能技术生成

关于List与Set的区别

List和Set都继承自Collection接口;


  • List接口的实现类有三个:LinkedList、ArrayList、Vector。
  • Set接口的实现类有两个:HashSet(底层由HashMap实现)、LinkedHashSet。

在List中,List.add()是基于数组的形式来添加元素的,因此在List中,元素存放是有序的,且可重复,并且支持for循环和迭代器遍历,因此List在查找元素效率较高,插入和删除元素效率较低。

在Set中,Set.add()是基于HashMap实现的,通过Map.put来添加元素,因此在Set中元素不可重复(map-key不可重复),且元素存放位置是由该元素的hashCode来决定的,其位置是固定且无序的,Set遍历也只能使用迭代器,因为其无序,所以不能使用下标取值。

在List和Set中,都有一个contains()方法来判断是否存在指定元素,但由于两者实现方式各不相同,因此两者该方法的效率都不一样。在List中的contains是对每一个元素都是用equals()来判断是否存在该值,但是在Set是基于HashMap实现的,其中的contains实际上是调用Map.ccontainsKey方法,先判断元素对应的hashcode只有有值,没有直接返回,有的话再用equals判断内容是否相等


简单总结:与List相比,Set的contains()方法效率要高很多,如下示例

public class Test {
    public static void main(String[] args) {

        List<String> list = getListData();
        Set<String> set = getSetData();

        long listStart = System.currentTimeMillis();
        if (list.contains("list1000000")) {
            System.out.println("list contains list1000000");
        }
        long listEnd = System.currentTimeMillis();
        System.out.println("list contains list1000000 time:" + (listEnd - listStart));

        long setStart = System.currentTimeMillis();
        if (set.contains("set1000000")) {
            System.out.println("set contains set1000000");
        }
        long setEnd = System.currentTimeMillis();
        System.out.println("set contains set1000000 time:" + (setEnd - setStart));
    }

    public static List<String> getListData() {
        List<String> list = new ArrayList<>();
        for (int i = 0; i <= 1000000; i++) {
            list.add("list" + i);
        }
        return list;
    }

    public static Set<String> getSetData() {
        Set<String> set = new HashSet<>();
        for (int i = 0; i <= 1000000; i++) {
            set.add("set" + i);
        }
        return set;
    }
}

输出结果:

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sinder_小德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值