目录
Java 数据结构
数组(Arrays)
特性
示例
列表(Lists)
特性
示例
集合(Sets)
特性
示例
映射(Maps)
特性
示例
栈(Stack)
特性
示例
队列(Queue)
特性
示例
堆(Heap)
特性
示例
树(Trees)
特性
示例
图(Graphs)
特性
示例
其他一些说明
枚举(Enumeration)
特性
示例
位集合(BitSet)
特性
示例
向量(Vector)
特性
示例
栈(Stack)
特性
示例
字典(Dictionary)
特性
示例
哈希表(Hashtable)
特性
示例
属性(Properties)
特性
示例
Java 数据结构
Java 提供了丰富的数据结构来处理和组织数据。
Java 的 java.util 包中提供了许多这些数据结构的实现,可以根据需要选择合适的类。
以下是一些常见的 Java 数据结构:
数组(Arrays)
数组是一种简单的数据结构,用于存储固定大小的同类型元素集合。数组中的每个元素都可以通过索引(通常是整数)来访问。
特性
- 固定大小。
- 元素类型一致。
- 随机访问(通过索引快速访问元素)。
示例
int[] numbers = new int[5]; // 创建一个包含五个整数的数组
numbers[0] = 1; // 给第一个元素赋值
列表(Lists)
列表是 Java 中的一种动态数据结构,它允许在运行时改变元素的数量。Java 标准库中提供了多种列表实现,如 ArrayList
和 LinkedList
。
特性
- 动态大小。
- 支持添加、删除操作。
- 可以迭代访问元素。
示例
List<Integer> list = new ArrayList<>();
list.add(1); // 添加元素
list.remove(0); // 移除第一个元素
集合(Sets)
集合不允许重复元素的存在,且通常没有固定的顺序。HashSet
和 TreeSet
是两种常用的集合实现。
特性
- 无重复元素。
- 可能有序(取决于实现类)。
示例
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
// add(1) 再次尝试添加 1 将不会成功
映射(Maps)
映射(也叫字典)使用键值对来存储数据,其中每个键都是唯一的。
特性
- 键唯一。
- 值可以重复。
- 通过键快速查找值。
示例
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
Integer value = map.get("one"); // 获取键 "one" 对应的值
栈(Stack)
栈是一种只能在一端(称为栈顶)进行插入和删除操作的数据结构,遵循先进后出(FILO)的原则。尽管 java.util.Stack
类已经过时,但概念依然适用。
特性
- FILO。
- 支持 push 和 pop 操作。
示例
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.pop();
队列(Queue)
队列允许在尾部插入元素并在头部移除元素,通常遵循先进先出(FIFO)的原则。
特性
- FIFO。
- 支持 enqueue 和 dequeue 操作。
示例
Queue<Integer> queue = new LinkedList<>();
queue.offer(1); // 在队列尾部添加元素
Integer removed = queue.poll(); // 从队列头部移除元素
堆(Heap)
堆是一种特殊的树形数据结构,通常用来实现优先队列。Java 中并没有直接的堆实现,但是可以通过 PriorityQueue
来间接使用。
特性
- 按优先级排序。
- 最小堆或最大堆。
示例
PriorityQueue<Integer> heap = new PriorityQueue<>();
heap.add(3);
heap.add(1);
heap.poll(); // 返回并移除最小的元素
树(Trees)
树是一种非线性的数据结构,由节点组成,每个节点可以有零个或多个子节点。常见的树结构包括二叉树、平衡二叉搜索树(如 AVL 树、红黑树)等。
特性
- 分层结构。
- 节点可以有子节点。
- 多种遍历方式(前序、中序、后序)。
示例
// 树的实现通常需要自定义类
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
图(Graphs)
图是由节点(顶点)及其间的连接(边)组成的集合。图可以是有向的也可以是无向的。
特性
- 节点间通过边相连。
- 可能存在循环。
示例
// 图的表示可以用邻接矩阵或邻接表
class Graph {int V;LinkedList<Integer> adj[];Graph(int v) {V = v;adj = new LinkedList[v];for (int i=0; i<v; ++i)adj[i] = new LinkedList();}void addEdge(int v, int w) {adj[v].add(w); // 添加边 v-w}
}
以上就是 Java 中一些常用数据结构的基本介绍,每种数据结构都有其特定的应用场景,选择合适的数据结构能够提高程序的效率和可维护性。
其他一些说明
枚举(Enumeration)
枚举是一种特殊的数据类型,用来封装一组常量值。枚举类型在 Java 中是一种特殊的类,可以拥有构造函数、方法以及字段。
特性
- 封装一组常量。
- 可以实现接口。
- 可以定义构造函数、方法和字段。
示例
public enum Color {RED, GREEN, BLUE;
}public class EnumExample {public static void main(String[] args) {System.out.println(Color.RED);}
}
位集合(BitSet)
BitSet
是一种特殊类型的集合,用于存储位序列。它非常适合用来处理大量的布尔标志,因为它非常节省空间。
特性
- 位级别的集合。
- 节省内存。
示例
BitSet bits = new BitSet();
bits.set(0); // 设置第0位为1
bits.clear(0); // 清除第0位,将其设为0
System.out.println(bits.cardinality()); // 输出设置为1的位的数量
向量(Vector)
Vector
是一个类似于 ArrayList
的动态数组实现,不同之处在于它是同步的,因此可以安全地用于多线程环境。
特性
- 动态大小。
- 线程安全。
示例
Vector<Integer> vector = new Vector<>();
vector.addElement(1); // 添加元素
vector.removeElementAt(0); // 删除指定位置的元素
栈(Stack)
Stack
是一个基于 Vector
实现的 LIFO(后进先出)数据结构。尽管它现在被认为是过时的,但在某些情况下仍然有用。
特性
- 后进先出(LIFO)。
- 基于
Vector
。
示例
Stack<Integer> stack = new Stack<>();
stack.push(1); // 添加元素
int top = stack.pop(); // 弹出栈顶元素
字典(Dictionary)
Dictionary
是一个键值对集合的抽象基类,提供了基本的操作方法。HashMap
和 Hashtable
是其具体实现。
特性
- 键值对存储。
- 抽象基类。
示例
Dictionary<String, String> dictionary = new Hashtable<>();
dictionary.put("key", "value");
String value = dictionary.get("key");
哈希表(Hashtable)
Hashtable
是一个线程安全的 Dictionary
实现,不允许 null 键或值。
特性
- 键值对存储。
- 线程安全。
- 不允许 null 键或值。
示例
Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put("key", "value");
String value = hashtable.get("key");
属性(Properties)
Properties
是一个专门用于存储字符串键值对的子类,通常用于读写配置文件。
特性
- 键值对存储。
- 适合读写配置文件。
示例
Properties props = new Properties();
props.setProperty("name", "value");
props.store(new FileOutputStream("config.properties"), "Properties file");