热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

集合框架的构成

集合框架中的Collection集合总结ArrayList:基于数组,不同步,查询较快LinkedList:基于链表&#

集合框架中的Collection集合总结

ArrayList: 基于数组,不同步,查询较快
  LinkedList:基于链表,不同步,查询较慢,增删较快
  HashSet: 哈希表
  TreeSet: 二叉树
  看到array就要想到数组, 就要想到角标, 想到查询很快。
  看到link就要想到链表, 就要想到增删很快, 最高再想到addFirst
  看到hash就要想到哈希表, 就要想到元素的hashcode方法和equals方法
  看到tree, 就要想到二叉树, 就要想到排序, 就要想到两个接口, comparable和comparator
  什么时候用List, 什么时候用Set
  保证元素唯一, 就用Set集合。不需要就使用List集合。
  实在搞不清楚, 就用ArrayList

Map集合常用类Hashtable、HashMap、TreeMap总结

Hashtable: 线程安全, 速度慢, 不允许存放null键, null值, 已被HashMap替代。
  HashMap: 线程不安全, 速度快, 允许存放null键, null值。
  TreeMap: 对键进行排序, 排序原理与TreeSet相同。

Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。
      Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
  HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
  TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。

HashMap根据键的HashCode值存放数据。

HashMap与Hashtable都采用了hash法进行索引。

HashMap是Hashtable的轻量级实现,HashMap允许空(null)键值(key)(但需要注意,最多只运行一条记录的键为null,不允许多条记录的值为null),而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。Hashtable继承自Dictionary类 ,而HashMap是Map接口的一个实现

Hashtable的方法是线程安全的,而HashMap不支持线程的同步,所以它不是线程安全的。

Hashtable使用Enumeration,HashMap使用Iterator。

Hashtable和HashMap采用的hash/rehash算法都几乎一样。

HashMap里面存入的键值对在取出时没有固定的顺序,是随机的。

TreeMap实现了SortMap接口,键是排序的。

这里写图片描述

Map是一次添加一对元素。Collection是一次添加一个元素。 iterator是迭代获取元素

第一大类:Iterator

迭代器是一个对象,它是遍历并选择序列中的对象。
  就是给后面的Collection接口里的实现类使用搭配的,为了取值罢了。Iterator 只能正向遍历集合,适用于获取移除元素。
  ListIterator 继承自Iterator,专门针对List,可以从两个方向来遍历List,同时还支持元素的修改。

第二大类:Collection

包括List(ArrayList、LinkedList)和Set(HashSet、TreeSet、LinkedHashSet)

ArrayList: 基于数组,不同步,查询较快

LinkedList:基于链表,不同步,查询较慢,增删较快

HashSet: 内部数据结构是哈希表 ,是无序不能排序,是不同步的。
  如何保证该集合的元素唯一性呢?
  是通过对象的hashCode和equals方法来完成对象唯一性的。
  如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
  如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
  如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。
  记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
  一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。
  建立对象判断是否相同的依据。
  hash是一种算法,很多存储起来,就是hash表。

TreeSet排序方式有两种。
  1, 让元素自身具备比较性。
    其实是让元素实现Comparable接口, 覆盖compareTo方法。这称为元素的自然排序。
  2, 当元素自身不具备比较性, 或者元素具备的比较性不是所需要的,可以让集合自身具备比较性。
  定义一个比较器: 其实就是定义一个类, 实现Comparator接口。 覆盖compare方法。
    将Comparator接口的子类对象作为参数传递给TreeSet的构造函数。

LinkedHashSet
    元素存入和取出的顺序一致。 是一个有序的集合, 不需要我们自己实现排序功能 。

第三大类:Map

包括(HashMap、TreeMap、LinkedHashMap)

Map与Collection在集合框架中属并列存在。Map是一次添加一对元素(存储的是夫妻)。Collection是一次添加一个元素(存储的是光棍)。
  Map存储的是键值对。
  Map存储元素使用put方法, Collection使用add方法。
  Map集合没有直接取出元素的方法, 而是先转成Set集合, 再通过迭代获取元素。
  Map集合中键要保证唯一性。

Map的两种取值方式keySet、entrySet
  keySet
    先获取所有键的集合, 再根据键获取对应的值。(即先找到丈夫,去找妻子)
  entrySet
    先获取map中的键值关系封装成一个个的entry对象, 存储到一个Set集合中,再迭代这个Set集合, 根据entry获取对应的key和value。
  向集合中存储自定义对象

HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
  TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。

Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
List集合中子类 Vector、ArrayList、LinkedList

List:有序, 可重复, 有索引。三者均为可伸缩数组。
  Vector:底层数据结构是数组结构。 jdk1.0版本。 线程安全的。 无论增删还是查询都非常慢。默认扩充为原来的2倍。
  ArrayList:底层数据结构是数组结构。 线程不安全的。 所以ArrayList的出现替代了Vector, 但是查询的速度很快。默认扩充为原来的1.5倍。
  LinkedList:底层是链表数据结构。 线程不安全的, 同时对元素的增删操作效率很高。但查询慢。
  注意: 链表结构是这样的: 让后一个元素记住前一个元素的地址。

Vector 和 ArrayList都是基于存储元素的Object[ ] array来实现的。

LinkedList是采用双向列表来实现的。

Set集合概述

Set:元素不可以重复,是无序。
  Set接口中的方法和Collection一致。
  |–HashSet: 内部数据结构是哈希表 ,是无序不能排序,是不同步的。
  如何保证该集合的元素唯一性呢?
  是通过对象的hashCode和equals方法来完成对象唯一性的。
  如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
  如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
  如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
  一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。
  建立对象判断是否相同的依据。

hash是一种算法,很多存储起来,就是hash表

|–TreeSet:可以对Set集合中的元素进行排序。是不同步的

判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。

TreeSet对元素进行排序的方式一:
 让元素自身具备比较功能,元素就需要实现Comparable接口。覆盖compareTo方法。
 如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?

可以使用TreeSet集合第二种排序方式二:
 让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
 将该类对象作为参数传递给TreeSet集合的构造函数。

Set接口中常用的类HashSet、TreeSet
  HashSet: 底层数据结构是哈希表。 哈希表这种结构, 其实就是对哈希值的存储。 线程不安全, 存取速度快。 它是如何保证元素唯一性的呢?
  TreeSet: 可以对Set集合中的元素进行排序。 底层数据结构是二叉树结构,
  这种结构, 可以提高排序性能。 线程不安全的。 它的排序是如何进行的呢? 重点内容


推荐阅读
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
  • Java学习第10天:深入理解Map接口及其应用 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 初探性能优化:入门指南与实践技巧
    在编程领域,常有“尚未精通编码便急于优化”的声音。为了从性能优化的角度提升代码质量,本文将带领读者初步探索性能优化的基本概念与实践技巧。即使程序看似运行良好,数据处理效率仍有待提高,通过系统学习性能优化,能够帮助开发者编写更加高效、稳定的代码。文章不仅介绍了性能优化的基础知识,还提供了实用的调优方法和工具,帮助读者在实际项目中应用这些技术。 ... [详细]
  • 清华大学出版社 | 杨丹:基于MATLAB机器视觉的黑色素瘤皮肤癌检测技术及源代码分析(第1689期)
    清华大学出版社 | 杨丹:基于MATLAB机器视觉的黑色素瘤皮肤癌检测技术及源代码分析(第1689期) ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 遗传算法中选择算子为何置于交叉算子和变异算子之前?本文探讨了这一问题,并详细介绍了遗传算法中常用的选择算子类型及其作用机制。此外,还分析了不同选择算子对算法性能的影响,为实际应用提供了理论依据。 ... [详细]
author-avatar
手机用户2502857113
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有