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

Java集合框架详解:Collection体系、Comparable与Comparator区别及底层数据结构分析

本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。
1. Java集合框架概述

1.1 集合的基本概念

集合是用于存储多个对象的容器,定义了一系列对多个对象进行操作的方法。集合可以实现类似数组的功能,但更加灵活。


1.2 集合与数组的区别

  • 数组的长度是固定的,而集合的长度可以动态变化。
  • 数组可以存储基本数据类型和引用类型,而集合只能存储引用类型(如果需要存储基本数据类型,可以使用对应的包装类)。

1.3 集合框架的位置

Java集合框架提供了一套高效且易于使用的接口和类,它们位于java.util包中。


2. Comparable与Comparator的区别

2.1 Comparable接口

Comparable接口位于java.lang包中,包含一个compareTo(Object obj)方法,用于实现自然排序。

2.2 Comparator接口

Comparator接口位于java.util包中,包含一个compare(Object obj1, Object obj2)方法,用于实现定制排序。

当需要对集合进行自定义排序时,可以通过实现Comparable接口或使用Comparator接口。如果需要实现多种排序方式,可以同时重写compareTo()方法并使用多个Comparator实例。


2.3 Comparable具体案例

以下是一个使用Comparable接口进行排序的示例:

import java.util.TreeSet;

public class TestComparable {
public static void main(String[] args) {
TreeSet treeSet = new TreeSet<>();
for (int i = 5; i >= 1; i--) {
treeSet.add(new Student(i));
}
System.out.println(treeSet.toString());
}
}

class Student implements Comparable {
int age;
public Student(int age) {
this.age = age;
}
// 按照age的大小正序排序
@Override
public int compareTo(Student student) {
return this.age - student.age;
}
@Override
public String toString() {
return "Student{" + "age=" + age + '}';
}
}

运行结果:

运行结果


2.4 Comparator具体案例

以下是一个使用Comparator接口进行排序的示例:

public static void main(String[] args) {
TreeSet treeSet = new TreeSet<>(new Comparator() {
@Override
public int compare(String o1, String o2) {
int n1 = o1.length() - o2.length();
int n2 = o1.compareTo(o2);
return n1 == 0 ? n2 : n1;
}
});
treeSet.add("Hello World!");
treeSet.add("Java the best!");
treeSet.add("C#");
treeSet.add("Go");
treeSet.add("Python");
treeSet.add("C");
treeSet.add("C++");
treeSet.add("JavaWeb");
treeSet.add("Javascript");
treeSet.add("CSS");
treeSet.add("HTML");
treeSet.add("Angular");
System.out.println(treeSet.toString());
}

运行结果:

运行结果


3. 集合框架底层数据结构总结

3.1 List接口实现

  • ArrayList: 基于动态数组实现,支持快速随机访问。
  • Vector: 与ArrayList类似,但线程安全。
  • LinkedList: 基于双向链表实现,支持高效的插入和删除操作。

3.2 Set接口实现

  • HashSet (无序、唯一): 基于HashMap实现,底层使用哈希表存储元素。
  • LinkedHashSet (有序、唯一): 继承自HashSet,内部使用LinkedHashMap实现,保持插入顺序。
  • TreeSet (有序、唯一): 基于红黑树实现,支持按自然顺序或定制顺序排序。

3.3 Map接口实现

  • HashMap: JDK 1.8之前使用数组+链表实现,JDK 1.8之后在链表长度超过8时转换为红黑树,以提高查找效率。
  • LinkedHashMap: 继承自HashMap,内部使用双向链表维护插入顺序或访问顺序。
  • Hashtable: 类似于HashMap,但线程安全,不支持null键和值。
  • TreeMap: 基于红黑树实现,支持按自然顺序或定制顺序排序。

4. 如何选择合适的集合类

选择合适的集合类应考虑以下因素:

  • 需要根据键值获取元素时,选择Map接口下的集合。
  • 需要排序时,选择TreeMap。
  • 不需要排序时,选择HashMap。
  • 需要保证线程安全时,选择ConcurrentHashMap。
  • 只需存放元素值时,选择实现Collection接口的集合。
  • 需要保证元素唯一时,选择实现Set接口的集合,如TreeSet或HashSet。
  • 不需要保证唯一性时,选择实现List接口的集合,如ArrayList或LinkedList。


推荐阅读
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
author-avatar
CleanTheString
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有