1. Collection

Collection 是所有集合类的父接口,它定义了集合类最基本的操作方法:

Collection 接口

2. List

列表(List)实现了Collection,并拥有自己的特性:可以有重复元素,且是有序的,以元素添加顺序为序。该类集合中有索引【角标】。

ArrayList 底层数据结构是数组存储,查询速度快,但是增删改慢,非线程安全,长度大约0.5倍增长(len += len>>1)

ArrayList 用法

ArrayList 实现原理

LinkedList 底层数据链结构是表结构,增删改速度快,但查询慢,非线程安全,链表长度即为元素长度。

LinkedList 用法

Vector 底层实现与ArrayList一样,但是线程同步的,相比于ArrayList,查询增删都慢,长度1倍增长。

Stack 继承于 Vector ,实现了一种后进先出(LIFO)的数据结构,栈。

3. Set

集(Set)也实现了 Collection 接口,它与列表的区别在于,不允许与重复元素,且元素是无序的(元素的有序性是指与插入顺序一致)。这类集合中没有索引。

Set有两种实现类,且底层都是用Map实现的:

HashSet:底层用HashMap实现,元素存在map的key中(key, new Object()),元素无序。

TreeSet: 底层用TreeMap实现,元素存在map的key中(key, new Object()),元素无序,但是元素是升序排列的。

HashSet

底层数据: 底层使用哈希表作为数据结构。

          元素唯一性: 是通过元素的两个方法: hashCode 和 equals 来完成的。

              如果两个元素的HashCode值相同,就会判断equals是否为true。

              如果两个元素的HashCode值不同,就不会调用equals方法。

      注意:对于判断元素是否存在、删除等操作,都依赖于元素的hashCode、equals等方法。

      哈希表:给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,

        则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

      (哈希值与内存地址值之间的关系:默认的哈希值是内存地址值计算的哈希值,但是只是为了给人看的,真正在

      内存中还是依靠内存地址值来进行运算的,而不是哈希值)

TreeSet

底层数据结构: 二叉树 (保证元素唯一性的方法是保证compareTo 方法return 0)

      比较方式:

方式一、就是让元素自己具有比较性,元素需要实现comparable接口,重写其中得compareTo方法,这个排序叫做自然排序(默认排序)

              1、 无序性(按照输入元素类中自定义的compareTo方法来排定存储对象。)

              2、 单一性(通过判断元素类中自定义的compareTo方法放回值是否为0来判断元素是否相等。)

              3、 让需要存入到TreeSet中的元素,实现comparable接口,该接口中定义了一个public int compareTo方法

              4、 compareTo 方法:我们需要在类定义中重写该方法, public int compareTo,

            使得: 当有e.compareTo(e1)时,

              如果e大于e1则返回正数,当e小于e1则返回负数, 等于则返回0.

                而且当有e等于e1时, 可以定义附属判断条件来判断 两个对象的大小。

    注意:TreeSet 本情况的所有的底层比较原理只是调用了元素的compareTo方法,与 equals等方法都无关。

              (add、contains、remove等需要用到比较的方法)

      所以我们定义所有的比较都返回正数,那么靠遍历迭代器取出的元素顺序和存入顺序一样。

      如果定义所有的比较都返回负数,那么靠遍历迭代器去除的元素顺序和存入的顺序相反。

      如果定义所有比较都返回0 ,那么就只能存入一个元素,最后也只能取出一个元素。

    方式二、当元素自身没有比较性或者具有的比较性不是自身所需要的,那么就要让集合自身具有比较性。

          那么就要在集合一初始化时定义比较方式(也就是调用集合的构造方法)

        1、 无序性(按照集合实例化的时候的比较器来排布元素的存储顺序。)

        2、 单一性(通过集合的比较器的compare方法返回值是否为0 来判断元素是否相等。)

        3、 定义一个比价器的类,使其实现comparator接口, 重写覆盖其中的 int compare(T o1, T o2) 方法。

        4、 compare 方法:我们需要在比较器类定义中重写该方法,int compare(Object o1, Object o2),

      使得: 我们在该方法中比较两个对象,或者比较其对象的方法,或者直接定义一个数值返回。

          当返回值为正时代表o1大于o2,当返回值为负时代表o1小于o2,返回值为0 则代表两个对象相等。

         而且当初步判断有o1等于o1时, 可以定义附属判断条件来判断 两个对象的大小。

      注意:TreeSet 本情况的所有的底层比较原理只是调用了集合比较器的compare方法,与 元素equals等方法都无关。

          (add、contains、remove等需要用到比较的方法)

        所以我们定义所有的比较都返回正数,那么靠遍历迭代器取出的元素顺序和存入顺序一样。

        如果定义所有的比较都返回负数,那么靠遍历迭代器去除的元素顺序和存入的顺序相反。

          如果定义所有比较都返回0 ,那么就只能存入一个元素,最后也只能取出一个元素。

4. Map

映射(Map)没有实现 Collection 接口,它的每一项都是成对存储的,(key, value)。存储的每一个数据都有一个对应的关键字key,key 是唯一的。

key虽然决定了数据在映射中存储的位置,检索数据时,需要提供相应的Key。但是并不是靠key本身来确定的,而是使用了一种散列(hashing)技术来处理,产生一个被称为散列码(hash code)的整数值,它通常作为一个偏置量,该偏置量是相对于数据存储位置与map内存起始位置的偏移,由此来确定(key, value)的存储位置。

理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。

Map有多种实现:

HashMap:非线程安全,底层为散列表,允许存储一个 null key,和多个 null value。

HashTable:线程安全,执行效率较低。所有的 key 必须非null。为了能更高效的工作,所有的类必须实现 equal()和 hashcode()方法。

LinkedHashMap:非线程安全,底层实现为散列表,能够保证元素的插入顺序(相对于读取而言的)。

WeakHashMap:非线程安全,底层实现为散列表,当某个键不在被引用时,其对应的键值对可能会对GC回收,从map中清除。

TreeMap:底层为二叉树结构,元素按key值升序排列,不是按插入顺序。

collection集合 地址_有容乃大--Java 集合(List/Set/Map)相关推荐

  1. 有容乃大 ——Java集合(List/Set/Map)

    有容乃大 --Java集合(List/Set/Map) 数据结构的概念 数据结构定义: 数据结构是计算机对数据存储的一种安排. 就是计算机组织.存储数据的方式. 数据结构有哪些? 堆.栈.数组.队列. ...

  2. 有容乃大--Java 集合

    Java集合类:可用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈.队列等.还可以用于保存具有映射关系的关联数组.Java集合大致可以分为Set.List.Map三种体系 其中Set代表无序 ...

  3. 有容乃大 -- Java 集合(List/Set/Map)

    集合框架 学习方法 [知识点的理解和认识] (1) 执行流程[顺序 选择 循环]->独立的方法的使用,对象:线程 (2) 面向对象的编程思想 将具有相同属性和行为的事物抽象出来,划分为类.每一个 ...

  4. 有容乃大——Java集合

    1.常见的数据结构 1.数组(ArrayList) 2.链表(LinkedList) 3.堆栈(栈) 特点 FILO 4.队列 FIFO 2.集合框架的体系 继承体系 Collection(所有集合类 ...

  5. arraylist如何检测某一元素是否为空_我们应该如何理解Java集合框架的关键知识点?...

    以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介绍每个集合类的用途和特点,然后通过比较相关集合类的不同特点来让我们更深入的了解它们. Collection接口 Collection是最基本的 ...

  6. java arraylist排序_一文读懂Java集合框架

    欢迎关注微信公众号:深入浅出Java源码 概念 Java集合框架为程序员提供了预先包装的数据结构和算法来操纵他们.集合框架被设计成要满足以下几个目标. 该框架必须是高性能的.基本集合(动态数组,链表, ...

  7. java面向对象编程集合边框_第六章使用java实现面向对象-集合框架

    一:接口:即表示集合的抽象数据类型. 实现:即集合框架中接口的实现. 算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,例如查找. 排序等. Collection 接口存储一组 ...

  8. hashtable允许null键和值吗_【29期】Java集合框架 10 连问,你有被问过吗?

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 首先要说一下,本文对这些Java集合框架的面试题只做了一个总结式的回答,对每一道题目,都值得深入去了解一下(什么是扎 ...

  9. 牛客网 编程初学者入门训练 BC3 有容乃大 Java

    题目来源:牛客网 编程初学者入门训练 BC3 有容乃大 public class Main {public static void main(String[] args) {System.out.pr ...

最新文章

  1. Nature:“巨型原子”使芯片同时处理和收发量子信息成为可能
  2. BPI:bit for Webduino WEB:Bit 教育版平台正式发布,支持离线安装使用
  3. 【试验】三个用于日常监控开发库与对应测试库的存储过程
  4. 手撕设计模式之「工厂方法模式」(Java描述)
  5. wd2003计算机考试,2015计算机一级MsOffice练习:Word2003
  6. 【Python】这10个Python性能调优的小技巧,你知道几个?
  7. nginx 知识点 :ctx_index and index
  8. svn提交报e200007错误
  9. 阮一峰react demo代码研究的学习笔记 - demo7 debug - how ref node is attached
  10. Chapter2-1_Voice Conversion(Feature Disentangle)
  11. go爬虫和python爬虫_爬虫练手-豆瓣top250(go版以及python版)
  12. 计算机专业Java必读书单,高清PDF电子版下载
  13. kubernetes使用secrets保存敏感信息
  14. 基于ARM裸机的知识点总结(9)------基于S5PV210的定时器、看门狗和RTC
  15. 23王道考研数据操作目录一览
  16. java面试题大合集
  17. 网页版2048实战--简介及构建页面
  18. Python Scrapy 爬虫 - 爬取多级别的页面
  19. c语言顺序线性表的实现
  20. 今日头条点击链接跳转微信公众号、加好友、小程序的方法(今日头条引流到微信公众号)

热门文章

  1. go语言与php优势,go语言有什么优点?
  2. java局部变量的描述正确的是_【Java入门课|这才是Java局部变量的正确使用方法,你真的会用这些吗】- 环球网校...
  3. CentOS下安装Tomcat并配置JRE
  4. 导出jvm的内存快照进行分析
  5. n平方的求和公式_高中数学:数列求和及数列的综合应用,掌握常见模型
  6. mysql 分号子查询_MySQL子查询详解
  7. c语言三线程,如何用C语言实现多线程
  8. c语言 while(cin),C++中while(cina)是什么意思
  9. 基础的面试知识,成就面试宝典
  10. shell echo单行和多行文字定向写入到文件中