看到这句话的时候证明:此刻你我都在努力
加油陌生人
前言
今天给大家带来一篇有关Java顺序表和链表的文章,顺序表和链表我之前的专栏也是写过的,是用C语言实现的,也是模仿实现了顺序表和链表里的方法了。
下面是传送门:
顺序表:
你真的了解线性表中的顺序表了吗?(静态与动态顺序)-CSDN博客
链表:
数据结构对链表的初步认识(一)-CSDN博客
数据结构的带头,双向,循环链表来咯-CSDN博客
但是呢,学习了新语言Java那么就在用新语言在巩固一下了。
认识List
Java中的List
是java.util
包下的一个接口,它是Collection
接口的一个子接口,表示一个有序的集合,可以包含重复的元素。List
接口提供了一些独特的方法来插入、访问、删除元素以及搜索列表中的元素。以下是List
接口的一些关键特性和常用实现:
特性
- 有序性:
List
中的元素按照添加的顺序进行排序。 - 允许重复:可以包含重复的元素。
- 动态数组:大多数
List
实现(如ArrayList
)使用动态数组来存储元素,这使得随机访问非常高效。
常用方法
add(E e)
:向列表末尾添加一个元素。add(int index, E element)
:在指定位置插入一个元素。remove(int index)
:移除指定位置的元素并返回被移除的元素。remove(Object o)
:移除列表中第一次出现的指定元素。get(int index)
:返回指定位置的元素。set(int index, E element)
:用指定元素替换列表中指定位置的元素。size()
:返回列表中的元素数量。indexOf(Object o)
:返回第一次出现的指定元素的索引。lastIndexOf(Object o)
:返回最后一次出现的指定元素的索引。clear()
:移除列表中的所有元素。
常用实现
- ArrayList:基于动态数组实现,支持快速随机访问。但插入和删除操作可能需要数组复制,效率较低。
- LinkedList:基于双向链表实现,适合频繁的插入和删除操作。但随机访问效率较低。
- Vector:和
ArrayList
类似,但它是同步的。 - Stack:继承自
Vector
,实现栈的功能,后进先出(LIFO)。 - CopyOnWriteArrayList:线程安全的变体,在读多写少的场景下性能较好。
泛型
从Java 5开始,List
接口支持泛型,允许开发者指定列表中元素的类型,提高类型安全。
使用场景
- 当你需要有序集合并且频繁进行随机访问时,选择
ArrayList
。 - 当你需要频繁在列表中插入或删除元素,并且对随机访问的需求不高时,选择
LinkedList
。
注意事项
List
的实现不是线程安全的。如果需要线程安全,可以使用Collections.synchronizedList()
方法或CopyOnWriteArrayList
。- 选择合适的
List
实现对于性能至关重要,因为不同的实现在不同的操作下表现不同。
List
接口是Java集合框架中非常重要的一部分,合理选择和使用List
可以提高程序的性能和可读性。
认识ArrayList(顺序表)
顺序表一个用数组实现的一个结构,他和数组不同的就是它是一个类,数组是一个引用类型,顺序表还扩展了一些方法
像增,删,查,改等是最基本的,还有一些其它方法,像List里的接口方法也实现了。
ArrayList
是Java集合框架中的一种实现,属于List
接口的实现类之一,同时也实现了RandomAccess
接口,表明它支持快速的随机访问。
基本特性
- 基于数组:
ArrayList
内部使用一个动态数组(Object
数组)来存储元素。 - 动态扩容:当添加元素导致数组容量不足时,
ArrayList
会自动扩容,通常是将现有容量增加到原来的1.5倍(或根据需要调整)。 - 允许空元素:可以包含
null
值。 - 非同步:
ArrayList
不是线程安全的。
性能特点
- 随机访问:由于基于数组实现,
ArrayList
提供了快速的随机访问能力,即get(int index)
操作的时间复杂度为O(1)。 - 添加和删除:在列表末尾添加元素(
add(E e)
)是高效的,时间复杂度为O(1)。但是,如果需要在列表中间或开始位置添加或删除元素,可能需要移动其他元素以维持数组的连续性,这会导致时间复杂度为O(n)。
常用方法
代码演示:
import java.util.ArrayList;
public class T {
public static void main(String[] args) {
ArrayList arrayList1=new ArrayList<>(); //创建一个存储整数的顺序表
ArrayList arrayList2=new ArrayList<>(); //创建一个存储字符的顺序表
ArrayList arrayList3=new ArrayList<>(); //创建一个存储字符串的顺序表
//给整形顺序表添加数据
arrayList1.add(1);
arrayList1.add(2);
arrayList1.add(3);
//给字符顺序表添加数据
arrayList2.add('a');
arrayList2.add('b');
arrayList2.add('c');
//给字符串顺序表添加数据
arrayList3.add("abc");
arrayList3.add("abcd");
arrayList3.add("abcde");
//分别打印三个顺序表
System.out.println(arrayList1.toString());
System.out.println(arrayList2.toString());
System.out.println(arrayList3.toString());
//也可以单独取其中的元素进行打印
//如下取每个顺序表第一个元素进行打印
System.out.println(arrayList1.get(0));
System.out.println(arrayList2.get(0));
System.out.println(arrayList3.get(0));
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
评论记录:
回复评论: