一、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. ckeditor粘贴word图片且图片文件自动上传功能

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...

  2. HTML基础入门学习

    上一篇给大家介绍了学习HTML的准备工作,本文开始带大家步入HTML的学习 一.HTML基础 网页的组成: HTML:页面构成 css:页面样式表现 JavaScript:交互行为 HTML简介: H ...

  3. 20180821-Java封装

    java 封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外 ...

  4. postman 简单使用教程

    Postman 安装   Postman 接口测试(Collection)   Postman 接口测试(测试用例)Postman 接口测试(变量与参数化)Postman 接口测试(非 UI 运行模式 ...

  5. (转)Kubernetes部署WordPress+MySQL

    转:http://www.showerlee.com/archives/2336 这部分我们结合之前的k8s知识点给大家展示如何使用kubernetes部署wordpress+MySQL, 并利用NF ...

  6. 使dialog可拖拽指令

    在项目开发过程中,需要支持dialog弹窗可拖拽,则需要对dialog添加指令.具体操作说明如下: (1)在用于存放指令的文件夹内,新建拖拽指令文件夹,例如命名为:el-dragDialog,如下所示 ...

  7. 132、TensorFlow加载模型

    # The tf.train.Saver对象不仅保存变量到checkpoint文件 # 它也恢复变量,当你恢复变量的时候,你就不必须要提前初始化他们 # 列如如下的代码片段解释了如何去调用tf.tra ...

  8. day06—JavaScript之闭包

    转行学开发,代码100天——2018-03-22 第一次听说“闭包”这个词,还是在2015年某个深夜在听一节腾讯课堂的公开课上,当时老师讲什么已经没有清晰的记忆了,只知道是一次web的开发课程. 过了 ...

  9. 大数据学习笔记之Zookeeper(三):Zookeeper理论篇(二)

    文章目录 3.1 数据结构 3.2 节点类型 3.3 特点 3.4 选举机制 3.5 stat结构体 3.6 监听器原理 3.1 数据结构 ZooKeeper数据模型的结构与Unix文件系统很类似,整 ...

  10. 字符串类——KMP子串查找算法

    1, 如何在目标字符串 s 中,查找是否存在子串 p(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述KMP实现原理) ? 1,朴素算法: 2,朴素解法的问题: 1,问题:有时候右移一位是 ...