热门标签 | 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。


推荐阅读
  • 最近同事提了一个需求过来,他觉得项目对于第三方日志记录的太多了,只想记录一些业务相关的日志减少对于框架日志的显示。具体要求就是对于框架日志只显示warn等级以上的,而业务日志显示info等级以上 ... [详细]
  • Go语言开发中的常见陷阱与解决方案
    本文探讨了在使用Go语言开发过程中遇到的一些典型问题,包括Map遍历的不确定性、切片操作的潜在风险以及并发处理时的常见错误。通过具体案例分析,提供有效的解决策略。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文介绍如何在Windows Forms应用程序中使用C#实现DataGridView的多列排序功能,包括升序和降序排序。 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • 本文介绍了在Android项目中实现时间轴效果的方法,通过自定义ListView的Item布局和适配器逻辑,实现了动态显示和隐藏时间标签的功能。文中详细描述了布局文件、适配器代码以及时间格式化工具类的具体实现。 ... [详细]
  • 本文将探讨从ASP.NET 1.1到2.0期间编译系统的重要变革。通过对比两个版本的即时编译模型,我们将揭示2.0版本中引入的新特性和改进之处。 ... [详细]
  • Gradle复合构建详解
    自Gradle 3.3起,复合构建功能得以实现,这是一种能够整合其他独立构建的高级构建模式。本文将详细介绍复合构建与多项目构建的区别,以及如何在实际项目中应用复合构建。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • ▶书中第四章部分程序,包括在加上自己补充的代码,有边权有向图的邻接矩阵,FloydWarshall算法可能含负环的有边权有向图任意两点之间的最短路径●有边权有向图的邻接矩阵1 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • 在Python编程学习过程中,许多初学者常遇到各种功能实现难题。虽然这些问题往往并不复杂,但找到高效解决方案却能显著提升编程效率。本文将介绍一个名为‘30-seconds-of-python’的优质资源,帮助大家快速掌握实用的Python技巧。 ... [详细]
  • 本文介绍了一种在Win10 UWP应用中实现根据数值动态改变颜色的控件的方法。通过将椭圆的颜色与整数绑定,并利用值转换器来实现颜色的渐变效果。 ... [详细]
  • 详解 | 日志系统ViseLog的基本使用与功能
    本文详细介绍了日志系统ViseLog的使用方法及其核心功能,旨在帮助开发者更好地理解和利用这一工具,提高开发效率。 ... [详细]
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社区 版权所有