Dlang 语言数据结构对应 Java 数据结构详解
Dlang 语言数据结构与 Java 数据结构对应关系
Dlang 语言与 Java 语言类似,也拥有丰富的内置数据结构,方便开发者进行数据存储和操作。本文将介绍 Dlang 语言中 List 和 Set 数据结构,以及它们与 Java 中对应数据结构的比较。
1. List (有序,可重复)
1.1 ArrayList
- 底层数据结构是数组,查询快,增删慢
- 线程不安全,效率高
1.2 Vector
- 底层数据结构是数组,查询快,增删慢
- 线程安全,效率低
1.3 LinkedList
- 底层数据结构是链表,查询慢,增删快
- 线程不安全,效率高
2. Set (无序,唯一)
2.1 HashSet
- 底层数据结构是哈希表。
- 哈希表依赖两个方法:'hashCode()' 和 'equals()'。
- 执行顺序:
- 首先判断 'hashCode()' 值是否相同
- 是:继续执行 'equals()', 看其返回值
- 是 'true': 说明元素重复,不添加
- 是 'false': 就直接添加到集合
- 否:就直接添加到集合
- 是:继续执行 'equals()', 看其返回值
- 首先判断 'hashCode()' 值是否相同
- 最终:
- 自动生成 'hashCode()' 和 'equals()' 即可
2.2 LinkedHashSet
- 底层数据结构由链表和哈希表组成。
- 由链表保证元素有序。
- 由哈希表保证元素唯一。
2.3 TreeSet
- 底层数据结构是红黑树 (一种自平衡的二叉树)。
- 如何保证元素唯一性呢?
- 根据比较的返回值是否是 0 来决定
- 如何保证元素的排序呢?
- 两种方式
- 自然排序 (元素具备比较性)
- 让元素所属的类实现 'Comparable' 接口
- 比较器排序 (集合具备比较性)
- 让集合接收一个 'Comparator' 的实现类对象
- 自然排序 (元素具备比较性)
- 两种方式
典型用例
1. ArrayList
import std.stdio; // 导入标准输入输出库
void main() {
auto list = new ArrayList!string; // 创建字符串类型的 ArrayList
list.add('apple');
list.add('banana');
list.add('orange');
writeln(list); // [apple, banana, orange]
list.remove(1);
writeln(list); // [apple, orange]
}
2. HashSet
import std.stdio; // 导入标准输入输出库
void main() {
auto set = new HashSet!string; // 创建字符串类型的 HashSet
set.add('apple');
set.add('banana');
set.add('orange');
writeln(set); // [orange, apple, banana] - 元素顺序可能不一致
}
3. TreeSet
import std.stdio; // 导入标准输入输出库
void main() {
auto set = new TreeSet!string; // 创建字符串类型的 TreeSet
set.add('apple');
set.add('banana');
set.add('orange');
writeln(set); // [apple, banana, orange] - 元素按字典序排序
}
4. LinkedList
import std.stdio; // 导入标准输入输出库
void main() {
auto list = new LinkedList!int; // 创建整数类型的 LinkedList
list.add(1);
list.add(2);
list.add(3);
writeln(list); // [1, 2, 3]
list.remove(1);
writeln(list); // [1, 3]
}
总结
- ArrayList 适合查询操作较多的场景,而且对于增删不频繁的数据表现也不错。
- HashSet 适合需要去重的场景,但是不保证元素的顺序。
- TreeSet 适合需要排序且去重的场景,但是要求元素具备可比较性。
- LinkedList 适合频繁的添加和删除操作,但是查询的效率较低。
原文地址: https://www.cveoy.top/t/topic/ojgU 著作权归作者所有。请勿转载和采集!