一、List接口

List:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 List接口:有序的、允许多个null元素、具体实现常用的有ArrayList、Vector、LinkedList常用实现类有ArrayList、Vector、LinkedList

ArrayList定义及特点

public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable

  1. 实现原理,采用动态对象数组实现,默认构造方法创建了一个空数组
  2. 第一次添加元素,扩展容量为10,之后的扩充算法:原来的数组大小+原数组大小的一半
  3. 不适合进行删除或插入操作
  4. 为了防防止数组动态扩充次数过多,建议在创建时给定初始容量
  5. 线程不安全,适合在单线程使用,效率较高

Vector定义及特点

public class Vector extends AbstractList implements List, RandomAccess, Cloneable, Serializable

  1. 实现原理,采用动态数组实现,默认构造方法创建了一个大小为10的对象数组
  2. 扩充的算法:当增量为0时,扩充为原来大小的两倍,当增量大于0时,扩充为原来大小+增量
  3. 不适合删除或插入操作
  4. 为了防防止数组动态扩充次数过多,建议在创建时给定初始容量
  5. 线程安全,适合在多线程访问时使用,效率较低

LinkedList定义及特点

public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, Serializable

  1. 实现原理,采用双向链表结构实现
  2. 适合插入、删除操作,性能高

在实际开发中,如何选择List接口的具体实现?需要考虑的问题有:

  • 安全性问题
  • 是否频繁插入、删除(LinkedList)
  • 是否存储后遍历

二、Set接口

一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。常用的实现类有HashSet、LinkedHashSet、TreeSet

HashSet定义及特点

public class HashSet extends AbstractSet implements Set, Cloneable, Serializable

  1. 实现原理,基于哈希表(HashMap)实现
  2. 不允许重复,最多可以有一个null元素
  3. 不保证顺序恒久不变
  4. 添加元素时把元素作为HashMap的key保存,HashMap的value使用一个固定的Object对象
  5. 排除重复是通过equals方法来检查对象是否相等
  6. 判断两个对象是否相同,先判断两个对象的hashCode是否相同(两个对象的hashCode相等不一定是同一个对象,但如果不同,一定不是同一个对象),若不同,则两个对象不是同一个对象;若相同,还要进行equals判断。equals方法返回true则为同一个对象,返回false则不是同一个对象。
  7. 自定义类存入HashSet时,建议重写类的hashCode和equals方法

哈希表的存储结构:数组+链表,数组里的每个元素以链表的形式存储
如何把对象存储到哈希表中?先计算对象的hashCode值再对数组的长度求余数,来决定对象要存储在数组中的哪个位置。

TreeSet定义及特点

public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable

  • 基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
  • 有序的,基于TreeMap(二叉树数据结构)实现,对象需要比较大小,通过对象比较器来实现。对象比较器还可以用来去除重复元素,若自定义的类没有实现比较器(Comparable)接口,将无法添加到TreeSet中。

LinkedHashSet定义及特点

public class LinkedHashSet extends HashSet implements Set, Cloneable, Serializable

具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 set s 中。)

如何选择Set接口的具体实现?

  • 如果要排序,选TreeSet
  • 如果不用排序,也不用保证顺序,选HashSet
  • 如果不用排序,要保证顺序,选LinkedHashSet

List接口和Set接口及其常用实现类概述的更多相关文章

  1. 集合中Set接口与Collection接口,常用子类TreeSet,HashSet.

    Set接口与List接口的不同之处在于: 不允许有重复的数据. 定义如下: public interface Set<E>extends Collection<E> 主要方法与 ...

  2. Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

    (一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...

  3. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

  4. 【Java面试题】43 说出一些常用的类,包,接口,请各举5个

    要让人家感觉你对java ee开发很熟,所以,不能仅仅只列core java中的那些东西,要多列你在做ssh项目中涉及的那些东西.就写你最近写的那些程序中涉及的那些类. 常用的类:BufferedRe ...

  5. Servlet技术——常用的类和接口

    Servlet是运行在服务器端的Java应用程序,由Servlet容器对其进行管理. 当用户对容器发送HTTP请求时,容器将通知相应的Servlet对象进行处理,完成用户和程序之间的交互. 在Serv ...

  6. Map接口常用实现类学习

    HashMap 1.6的HashMap:数组加单向链表结构 最重要的内部类Entry,全类名是java.util.HashMap.Entry,是个静态类,实现了Map.Entry接口.HashMap. ...

  7. 29个android开发常用的类、方法及接口

    在安卓开发中,我们常常都需要借助各种各样的方法.类和接口来实现相关功能.提升开发效率,但对于初学者而言,什么时候该用什么类.方法和接口呢?下面小编整理了29个,日常开发中比较常用的类.方法.接口及其应 ...

  8. JDBC中常用的类和接口

    <零基础学Java> JDBC中常用的类和接口 利用JDBC的这些类和接口可以更方便地访问并处理存储在数据库中的数据. DriverManager类 DriverManager类 是JDB ...

  9. Java中实现对象的比较:Comparable接口和Comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...

随机推荐

  1. C#防止窗口重复打开

    修改Program.cs文件 using System; using System.Collections.Generic; using System.Linq; using System.Windo ...

  2. 前端通过axios和FormData实现文件上传功能遇到的坑

    使用element-ui中的upload上传组件,前端上传数据参数已经传过去了,但是后端 (java) 接不到数据 (null) [解决方案] html部分: <el-button type=& ...

  3. mybatis 绑定 statement 失败

    错误信息:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 问题原因:编译时没有将mapp ...

  4. 协议-网络-WebDev:WebDec 百科

    ylbtech-协议-网络-WebDev:WebDec 百科 WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1 ...

  5. day17—Flex弹性布局详解(一)

    转行学开发,代码100天——2018-04-02 今天看到一篇大神的文章,关于flex布局的详解,对flex用法介绍的相当详细,非常有助于我等初学者更深入了解这种布局方式. 文章链接 [基础知识]Fl ...

  6. STM32 HAL库关于串口中断烧录程序后可以正常运行,断电重启后无法进入中断的问题分析以及解决方法

    1.情景描述: 最近在做一个项目,X86的上位机通过串口控制MCU,使用串口中断接收上位机数据时,MCU在上电的情况下烧录程序,可以正常接收上位机的数据,在断电重启后,一直进入不了中断回调函数,上电的 ...

  7. pycharm常用快捷键 --- keymap==ecplise

    F5 进入函数逐行调试 F6 执行完一行代码 F8 执行到下一个断点处 ctrl + d    --删除一行代码 ALT + 上/下 箭头   代码上下移动 ALT + 左/右 箭头    左--返回 ...

  8. C#将数据写入本地文件

    在平时开发过程中,可能会碰到内网测试没问题,但是更新到外网时会报错,这时我们又无法在外网进行调试.如果我们分析完业务可能产生的问题还是无法得到报错的原因,那么可以在关键的地方加上异常处理,然后将异常或 ...

  9. .apk的MIME类型

    1.扩展名: .apk      MIME类型: application/vnd.android 2.Internet 服务管理器添加.apk:打开IIS --->找到MIME类型,双击之 -- ...

  10. 21.线程,全局解释器锁(GIL)

    import time from threading import Thread from multiprocessing import Process #计数的方式消耗系统资源 def two_hu ...