a. 特性

两个接口都是继承自Collection​,是常用来存放数据项的集合,主要区别如下:

① List和Set之间很重要的一个区别是是否允许重复元素的存在,在List中允许插入重复的元素,而在Set中不允许重复元素存在。

​   ② 与元素先后存放顺序有关,List是有序集合,会保留元素插入时的顺序,Set是无序集合。

​   ③ List可以通过下标来访问,而Set不能。

b. 常见实现类

​ (1) List接口

常见实现类如下:

​   ArrayList(数组实现):允许对元素进行快速随机访问,从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

​   Vector(数组实现):支持线程的同步,某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销(相关方法与ArrayList很相似,在方法上用synchronized修饰)。

​  发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList(1.5倍 + 1)和Vector(2倍)的数组扩容的大小不同。

LinkedList(链表实现):很适合数据的动态插入和删除,随机访问和遍历速度比较慢。还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

​(2) Set接口

常见实现类有HashSet、TreeSet和LinkedHashSet:

​ hashset: 当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置(为什么HashSet 是如何保证不重复的)。也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等。不能保证元素的排列顺序,顺序有可能发生变化;集合元素可以是null,但只能放入一个null;

LinkedHashSet : LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

​  TreeSet: TreeSet是SortedSet接口的唯一实现类,底层的数据结构是红黑树,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式,如下示例:

​  自然排序——自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。

​  定制排序——自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法

如下示例:

package javase.collection;

import java.util.Comparator;

import java.util.Iterator;

import java.util.TreeSet;

class Person implements Comparable{

private int age;

private String name;

public Person(String name,int age) {

this.name = name;

this.age = age;

}

public String toString() {

return "[" + name + " : " + age + "]";

}

public int getAge() {

return age;

}

public String getName() {

return name;

}

@Override

public int compareTo(Person person) {

//返回0表示相等,则不加入TreeSet

return this.age > person.getAge() ? 1 : -1;

}

}

class Person2 {

private int age;

private String name;

public Person2(String name,int age) {

this.name = name;

this.age = age;

}

public String toString() {

return "[" + name + " : " + age + "]";

}

public int getAge() {

return age;

}

public String getName() {

return name;

}

}

class MyComp implements Comparator{

@Override

public int compare(Person2 o1, Person2 o2) {

return o1.getAge() > o2.getAge() ? 1 : -1;

}

}

public class CollectionTest {

public static void main(String[] args) {

// TreeSet psets = new TreeSet<>(new MyComp());

// psets.add(new Person("Bob",23));

// psets.add(new Person("Alice",36));

// psets.add(new Person("Tom",18));

// Iterator it = psets.iterator();

// while (it.hasNext()){

// System.out.println(it.next());

// }

TreeSet psets = new TreeSet<>(new MyComp());

psets.add(new Person2("Bob",23));

psets.add(new Person2("Alice",36));

psets.add(new Person2("Tom",18));

Iterator it = psets.iterator();

while (it.hasNext()){

System.out.println(it.next());

}

}

}

c. 相互转化

因为List和Set都实现了Collection接口的addAll(Collection extends E> c)方法,因此可以采用addAll()方法将List和Set互相转换;另外,List和Set也提供了Collection extends E> c作为参数的构造函数,因此通常采用构造函数的形式完成互相转化。

//List转Set

Set set = new HashSet<>(list);

//Set转List

List list1 = new ArrayList<>(set);

参考资料

Java set的区别_java中List 和 Set 的区别相关推荐

  1. java iter是否存在_Java中ListIterator和Iterator的区别以及ListIterator的应用

    Java中ListIterator和Iterator详解与辨析 在使用java集合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.Arra ...

  2. java堆和客栈_java中堆和栈的区别分析

    堆和栈是java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  3. Java中string与String区别_JAVA中String与StringBuffer的区别

    JAVA中String与StringBuffer的区别 2009-12-3文字大小:大中小 在java中有3个类来负责字符的操作. 1.Character 是执行 单个字符操作的, 2.String ...

  4. java中的成员变量和局部变量的区别_java中成员变量与局部变量区别分析

    本文实例分析了java中成员变量与局部变量区别.分享给大家供大家参考.具体分析如下: 成员变量:在这个类里定义的私有变量,属于这个类. 创建以及使用成员变量 public class Person { ...

  5. java long 区别_java中long和int的区别

    java中long和int的区别 发布时间:2020-06-26 15:37:48 来源:亿速云 阅读:191 作者:Leah 这篇文章将为大家详细讲解有关java中long和int的区别,文章内容质 ...

  6. JAVA中重写和实现的区别_Java中重载和重写的区别

    Java中重载和重写的区别 1.1重载是什么 Overloading   方法重载是让类以统一的方式处理不同类型数据的一种手段,多个同名函数同时存在,具有不同的参数个数/类型 1.2为什么用重载 重载 ...

  7. java栈和堆的区别_Java中堆和栈的区别

    堆和栈都是Java用来在RAM中存放数据的地方. 堆 (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间.这些对象通过new等指令建立,通过垃圾回收器来销毁. (2)堆的优势是可以动态地分配 ...

  8. java中堆与栈的区别_java中堆和栈的区别分析

    堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  9. java变量存储位置_java 中变量存储位置的区别

    [原文] 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

  10. java instanceof 区别_Java 中 instanceof 和 isInstance 的区别

    今天百度了一下 instanceof 和 isInstance() 的区别,结果不理想.大多数人先贴一段测试代码,然后分别解释它们的用法,根本不是解释它们之间的区别. 本来想快点搜一下看个结论,不料还 ...

最新文章

  1. 3号团队-团队任务4:每日例会(2018-12-3)
  2. Java中的数据结构
  3. 多系统权限设计(一)
  4. JSONP 初步学习--但是还是有疑问
  5. SAP JAM活跃度统计
  6. CSAPP:Attack lab
  7. Web前端学习笔记:Bootstrap
  8. 3类6种,主流容器操作系统全比较
  9. 求解最大公因子(JAVA辗转相除法)、python的最大公因子,最小公倍数
  10. windows下编译librtmp库
  11. LoRaWAN协议中文版 第11章 下行ping帧格式(仅Class B)
  12. 2022年上半年软考开始报名啦
  13. oracle 12c 自增序列
  14. Win11如何查看自己电脑的显卡信息?Win11查看显卡信息的方法
  15. 短视频SDK技术选型
  16. 使用ingress暴露kubernetes集群内部的pod服务
  17. S100数字源表之LDO芯片电学特性测试方案
  18. ChatGPT工作提效之初探路径独孤九剑遇强则强
  19. 【微服务实战】什么是微服务,微服务怎么实施?
  20. java存储图片到数据库

热门文章

  1. [转]asp.net 动态添加多附件上传
  2. 智能搜索推荐模型预估框架的建设及在美团点评的实践
  3. 【报告分享】抖音-2019年下半年短视频平台营销通案.pdf
  4. python遍历本地文件系统
  5. 复赛今日启动,双赛道百支队伍上演算法精英对决
  6. 【干货】比赛后期大招之stacking技术分享
  7. 机器学习算法总结之Boosting:Boosting Tree、GBDT
  8. 扫掠曲面二条引导线_说说国策下的三四线城市与会展
  9. 怎么调整矩形边框宽度_Illustrator实例教程:利用自定义画笔绘制中国风传统边框...
  10. 刀剑神域服务器维护到什么时候,刀剑神域黑衣剑士王牌维护结束时间 服务器维护进不去怎么办...