leetcode常用数据结构(JAVA)
数据结构JAVA版本
List 接口
list接口是一个有序集合,他可以包含重复的元素。
ArrayList
基于动态数组的实现,他的元素在内存中是连续存放的。
特点
- 动态数据实现:ArrayList内部使用数组存储元素,当添加元素超过当前容量时,可以自动增常。
- 随机访问效率高:可以快速访问到数据的特定元素。
- 插入和删除效率较低:在列表的中间或者开始插入元素需要移动元素
- 非线程安全
- 支持范型
定义方式
1
2
3
4
5
6
7
8
9
10
11
12
13ArrayList<Integer> numbers = new ArrayList<>();
//指定初始容量
// 定义一个初始容量为10的ArrayList
ArrayList<Integer> numbers = new ArrayList<>(10);
// 定义一个用于存储自定义对象的ArrayList
ArrayList<MyObject> myObjects = new ArrayList<>();
import java.util.Arrays;
// 从已存在的数组或集合创建ArrayList
ArrayList<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));常用方法
- 添加元素
- add(E e):将特定元素添加到尾部 返回值 boolean
- add(int index, E e): 将指定的元素插入列表的指定位置 返回值 void
- 访问元素
- get(int index ): 返回列表中指定元素的位置 返回值 E (列表中元素的类型)
- 修改元素
- set(int index , E element) : 用于指定元素列表中指定位置的元素 返回值 E
- 移除元素
- remove(int index): 移除列表中指定位置的元素 返回值 E (返回被移除的元素)
- remove(Object o): 移除列表中首次出现的指定元素(如果存在) 返回值 boolean
- 列表大小和清空
- size(): 返回列表中的元素个数 返回值 int
- clear():移除列表中的所有元素 返回值 void
- 其他操作
- indexOf(Object o): 返回列表中首次出现指定元素的索引,如果列表不包含该元素,则返回-1。 返回值 int
- contains(Object o):判断列表中是否包含指定的元素。 返回值 boolean
- 添加元素
LinkedList
基于双向链表的实现,允许在列表的任何位置快速插入元素和删除元素,但随机访问元素则比较慢
特点
- 双向链表实现: 基于双向链表数据结构实现,这意味着他的每个元素指向前一个和下一个元素的引用。
- 插入和删除效率高:由于其链表结构,向LinkedList中添加或删除元素,通常比ArrayList快,因为不需要移动其他元素
- 随机访问效率低: 与ArrayList相比,随机访问(通过索引获取元素)在LinkedList中效率较低,因为需要从头或者结尾开始遍历元素
- 实现了List和Deque接口:ListedList不仅实现List接口,还实现了Deque接口,提供了额外的队列操作,如在头部或尾部添加/删除元素
- 内存占用相对较高:每个元素都有额外的内存开销,因为存储需要指向前一个后一个的引用
定义方式
1
2
3
4
5
6
7
8import java.util.LinkedList;
// 定义一个空的LinkedList,用于存储Integer类型的元素
LinkedList<Integer> numbers = new LinkedList<>();
// 定义一个空的LinkedList,用于存储String类型的元素
LinkedList<String> names = new LinkedList<>();常用方法
- 添加元素
- add(E e):在列表末尾添加指定的元素 返回值 boolean
- add(int index , E e): 在列表的指定位置插入指定的元素 返回值 void
- addFirst(E e): 在列表的开头插入指定的元素 返回值 void
- addLast(E e): 在列表末尾插入指定的元素 返回值 void
- 访问元素
- get(int index) : 返回列表中指定位置的元素 返回值 E
- getFirst() : 返回列表的第一个元素 返回值 E
- getLast() : 返回列表的最后一个元素 返回值 E
- 修改元素
- set(int index , E e): 用指定的元素替换列表中指定位置的元素 返回值 E(返回的是旧的元素)
- 移除元素
- remove() : 移除并返回列表的第一个元素 返回值 E
- remove(int index): 移除列表中指定位置的元素 返回值 E
- remove(Object o): 移除列表中首次出现的指定元素 返回值 boolean
- removeFirst() : 移除并返回列表的第一个元素 返回值 E
- removeLast(): 移除并返回列表的最后一个元素 返回值 E
- 其他操作
- size() : 返回列表中的元素数 返回值 int
- clear(): 移除列表中的所有元素 返回值 void
- contains(Object o ): 判断列表中是否包含指定的元素 返回值 boolean
- indexOf(Object o): 返回列表中首次出现的指定元素的索引 返回值 int
- lastIndexOf(Object o): 返回列表中最后一次出现指定元素的索引 返回值 int
栈Stack
stack是java中的一个类,他扩展了Vector类并实现了一个后进先出的堆栈
特点
- 后进先出
- 基于Vector类实现: 因此拥有vector的所有特性,如能动态扩展
- 线程安全: 所有方法都是同步的,即线程安全
- 支持所有的数据类型:虽然Stack仍能被使用,但java官方更推荐灵活的Deque 如ArrayDeque或LinkedList
定义
1
Stack<Integer> stack = new Stack<>();
常用方法
- push(E item):将元素压入堆栈顶部 返回值 E
- pop( ) : 移除并返回堆栈顶部移除的元素 返回值 E
- peek( ) : 查看堆栈顶部的对象而不移除它 返回值 E
- empty( ):测试堆栈是否为空 返回值 boolean
- search(Object o): 返回对象在堆栈中的位置,以1为基数 返回值 int
- 添加元素
Vector
他和ArrayLsit类似,是线程安全的
CopyOnWriteArrayList
线程安全的ArrayList
变体。在任何修改操作(如添加、设置和删除等)时,它都会复制底层数组。
Deque 接口
是 Java 中的一个接口,属于 Java 集合框架。它允许在队列的两端进行元素的插入和移除操作,这使得它既可以被当作队列使用,也可以作为栈使用。
LinkedList
ArrayDeque
ArrayDeque
是 Deque
接口的一个具体实现,使用了可变大小的数组。
特点
- 高效的双端操作: 允许高校的在队列的两端插入和删除元素,可以实现栈,也可以实现队列
- 无容量限制: 虽然是基于数组实现的,但他可以在运行时动态的扩展和缩减其容量
- 更快的迭代性能:与基于链表的LinkedList相比,ArrayDeque在迭代访问时更快
- 非线程安全: ArrayDeque不是线程安全,如果在多线程环境下使用,需要外部使用
- 不允许插入null元素:使用ArrayDeque时不能添加null元素,因为null被用来作为特殊的返回值,以指示队列为空。
定义
1
2
3Deque<Integer> deque = new ArrayDeque<>();
// 或者,直接使用 ArrayDeque 类型
ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();常用方法
- 添加元素
- addFirst(E e) : 在队列前端添加一个元素
- addLast(E e): 在队列的后段添加一个元素
- offerFirst(E e): 在队列的前端添加一个元素,如果队列已满,则返回 false
- offerLast(E e): 在队列的后段添加一个元素,如果队列已满,则返回 false
- 移除元素
- removeFirst() : 移除并返回队列前端的元素
- removeLast() : 移除并返回队列后段的元素
- pollFirst() :移除并返回队列前端的元素,如果队列为空,则返回null
- pollLast() : 移除并返回队列后段的元素,如果队列为空,则返回null
- 查看元素
- getFirst() : 返回队列前端的元素但不移除
- getLast() : 返回队列后段的元素
- peekFirst() : 返回队列前端的元素但不移除它,如果队列为空,则返回null
- peekLast() : 返回队列后端的元素但不移除它,如果队列为空,则返回null
- 栈操作
- push(E e) : 将元素推入堆栈表示的队列前端
- pop() :移除并返回堆栈表示的队列前端的元素
- 其他方法
- size() : 返回队列中元素数量
- isEmpty() : 检查队列是否为空
- clear() : 清空队列
- 添加元素
Set集合
Map集合
定义
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
方法
创建和修改
- put(K key, V value):将指定的值与此映射中的指定键关联
删除
- remove(Objcet key): 如果存在,则从此映射中移除键的映射
- clear():清除所有映射
查询
- get(Object key); 返回指定键所映射的值,如果此映射不包含键的映射关系,则返回null.
- containsKey(Object key):如果此映射包含指定键的映射关系,则返回true
- containsValue(Object value): 如果此映射将一个或多个键映射到指定值,则返回true
- size(): 返回此映射中的键值映射关系的数。
- isEmpty():如果此映射不包含键值映射关系,则返回true。
迭代
keySet(): 返回set视图,示例如下
1
2
3
4
5
6
7
8
9Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
Set<String> keySet = map.keySet();
for (String key : keySet) {
System.out.println(key);
}
// apple bananavalues(): 返回collection视图
1
2
3
4for (Integer value : map.values()) {
System.out.println(value);
}entrySet(): 返回包含
1
2
3
4
5
6for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " => " + value);
}
Iterator
迭代器
定义 Iterator
是一个用于遍历集合(Collection)的接口,几乎所有的集合类都提供了一个方法来获得一个实现Iterator
接口的对象,该对象能够遍历集合中的元素。
基本使用方法
调用集合的iterator()方法获取Iterator对象
使用hasNext()方法检查集合中是否还有元素
使用next()方法获取集合中的下一个元素
如果有需要,使用remove()方法从集合中移除next()方法返回的最后一个元素
- Post title:leetcode常用数据结构(JAVA)
- Post author:秋水
- Create time:2024-01-11 17:12:16
- Post link:tai769.github.io2024/01/11/leetcode常用数据结构-JAVA/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.