一、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. SpringBoot怎么访问html文件

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. 有道翻译爬取【json】

    ''' @Modify Time @Author ------------ ------- 2019/9/2 0:19 laoalo ''' import requests import json i ...

  3. LintCode之在O(1)时间复杂度删除链表

    题目描述: 分析:因为题目要求不能用循环,而且只给了要删除的节点,并没有给链表.所以我无法取得要删除节点的前一个节点,只能在待删除的节点以及下一个节点上做文章.我的思路是:将待删除的节点的下一个节点的 ...

  4. DataTable 转Json格式C#代码

    /// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...

  5. Java多线程,实现卖电影票的业务

    本篇重点:多线程共享资源时发生的互斥问题 一般的我们售卖电影票或者火车票时会有多个窗口同时买票, 我们来看测试代码:主方法new一个Ticket(一个堆),之后三个线程来启动(三个窗口买票) clas ...

  6. machine learning 之 Recommender Systems

    整理自Andrew Ng的machine learning 课程 week 9. 目录: Problem Formulation(问题的形式) Content Based Recommendation ...

  7. redis centos集群搭建和java应用

    1. 首先要ssh免密登录 redis集群,3台虚拟机,6个节点,每台机器2个节点一主一从. 192.168.132.154 c0192.168.132.156 c1192.168.132.155 c ...

  8. 设计模式 - 装饰器模式(Decorator)

    简介 场景 通过继承和关联都可以给对象增加行为,区别如下: 继承是静态的(无法在程序运行时动态扩展),且作用于所有子类.硬编码,高耦合. 通过装饰器可以在运行时添加行为和属性到指定对象.关联关系就是在 ...

  9. Go-Mutex互斥量

    先来看一段go1.12.5中Mutex的源码: // Copyright 2009 The Go Authors. All rights reserved. // Use of this source ...

  10. Expected one result (or null) to be returned by selectOne() 数据库结果集和java实例

    mybatis会根据查询的结果集初始化java实例. 如果是复杂类型,我们一般都会在mapper中做好映射. 1.所以如果查询到的是多个结果,那么对应的java类型也必须的集合类型.(result 为 ...