List及其小伙伴们

本文整理了Java中List接口的实现类ArrayList、LinkedList、Vector和Stack的相关知识点。介绍了它们的底层实现、扩容机制、线程安全性、序列化支持及应用场景等,帮助开发人员快速记忆这些重要属性,以便在不同场景中使用。

一直以来,ArrayListLinkedList的区别,ArrayListVector的区别,List下不同实现类的相关知识点都是Java开发人员在开发过程中必须要掌握的基础知识,也是在面试过程中最常见的问题之一。

在这里,本文会将这些知识点加以整理,提取出最精华,最容易使用到的部分给大家,方便记忆。

List

List是一个继承于Collection的接口,ArrayList,LinkedList,Vector,Stack都只是它的一个实现类。

ArrayList

一个动态数组,由数组实现,所以具有数组的优缺点。方便快速随机访问,不适合频繁的添加或删除元素。

默认数组大小10。

扩容:底层采用线性连续空间存放元素,当空间不够时,会重新申请一片新的空间,大小是原来的1.5倍+1,并把原有的内容复制过去。

线程安全性:非线程安全

序列化:支持序列化,实现了java.io.Serializable接口

应用场景(以下两个条件同时满足)

  1. 需要快速随机访问元素
  2. 单线程场景或者多线程场景但是List只会被单线程操作

LinkedList

一个双向链表,具有链表的一些性质。包括能够快速添加和删除元素,但是不适合频繁访问元素,因为要从头指针开始遍历查找。

查找时,会根据index下标和整个List的长度size的关系,决定是从头查找还是从尾开始。如果index<size/2,则从头查找,否则从另一端开始遍历。

默认初始大小0。

扩容:底层实现是链表,不存在扩容问题。

线程安全性:非线程安全

应用场景:适用于需要快速插入删除元素的场景

Vector

和ArrayList一样,都是由动态数组实现。方便快速随机访问,不适合频繁的添加或删除元素。

默认数组大小10。

扩容:与指定的增长系数有关,如果增长系数>0,则新的容量增长为原来的容量+增长系数,否则变为原来容量的2倍

线程安全性:线程安全,函数大多数具有关键字synchronized,即都支持同步。

性能较差,因为方法加入了synchronized修饰,当执行的时候,系统会在方法前加一把锁,方法执行结束之后再释放掉。加锁和释放锁的过程会造成一定的系统开销,因此性能上要差许多。

序列化:不支持序列化

应用场景(以下两个条件同时满足)

  1. 需要快速随机访问元素
  2. 多线程场景且List会被多个线程操作

Stack

Stack是栈,继承于Vector。具有先进后出的特点。

对Vector进行扩展,添加了五个方法操作

  1. empty() 检查栈是否为空
  2. peek() 查看栈顶对象
  3. pop() 移除栈顶对象并返回
  4. push(E item) 压入栈顶
  5. search(Object o) 查找对象并返回其位置(下标值)

线程安全性:线程安全,由于继承于Vector,Vector是线程安全,故Stack也是线程安全类。

总结

有关List族群的相关知识点肯定不止以上这些,它的每一个实现类,都具有自己独特的性质,方便开发人员在不同的场景使用。

本文的内容只是帮助大家把这些实现类中比较重要的一些属性整理并记录下来,帮助大家快速记忆。如果大家希望能够了解更多的相关知识,可以自行上网查阅资料,也可以在文章最后留言,小编会在之后的文章中针对大家的需要整理成文,提供给大家~

 

转载自>>https://darylliu.github.io/archives/b6552223.html

### 找到数列中最大值的编程实现 在编程中,找到整数数列中的最大值是一个常见的任务。以下是几种常见编程语言实现这一功能的方法。 #### Python 实现 Python 提供了内置函数 `max()`,可以直接用于寻找列表中的最大值。此外,也可以通过遍历列表来手动实现这一功能。 ```python # 输入 n 的值 n = int(input()) # 输入 n 个整数 numbers = list(map(int, input().split())) # 初始化最大值为第一个元素 max_value = numbers[0] # 遍历列表以找到最大值 for num in numbers: if num > max_value: max_value = num # 输出结果 print(max_value) ``` 这种方法的时间复杂度为 O(n),其中 n 是数列的长度[^1]。 #### C++ 实现 C++ 中可以使用标准库函数 `std::max_element` 来快速找到数组中的最大值。此外,也可以通过循环手动实现。 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin >> n; vector<int> numbers(n); for (int i = 0; i < n; ++i) { cin >> numbers[i]; } // 使用标准库函数 int max_value = *max_element(numbers.begin(), numbers.end()); cout << max_value << endl; return 0; } ``` 上述代码展示了如何使用 C++ 标准库函数 `std::max_element` 来找到数组中的最大值[^3]。 #### 单调栈实现(进阶方法) 对于更复杂的场景,如需要动态维护数列的最大值及其位置,可以使用单调栈。这种方法特别适用于需要频繁更新数列并查询最大值的情况。 ```cpp #include <vector> #include <iostream> using namespace std; int main() { int n; cin >> n; vector<int> arr(n); for (int i = 0; i < n; ++i) { cin >> arr[i]; } vector<int> stack; for (int i = 0; i < n; ++i) { while (!stack.empty() && arr[i] >= arr[stack.back()]) { stack.pop_back(); } stack.push_back(i); // 当前所有后缀最大值的位置存储在栈中 } // 最大值即为栈顶元素对应的值 cout << arr[stack.back()] << endl; return 0; } ``` 这种方法的时间复杂度为 O(n),并且能够高效处理动态更新的场景[^4]。 ### 总结 不同的编程语言提供了多种方式来实现寻找数列最大值的功能。对于简单的需求,直接使用内置函数或循环遍历即可满足要求。而对于更复杂的需求,如动态更新和查询,可以考虑使用单调栈等高级数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值