目录
1.线性表
线性表
(
linear list
)
是
n
个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。
2.顺序表
顺序表是用一段
物理地址连续
的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
2.1顺序表中接口的实现
顺序表的一些基本方法
public class SeqList {
public int[] elem;//创建一个数组
public int usedSize;//用来记录数据的元素
public static final int DEAUFAL_CAPACITY = 2;
public SeqList() {
this.elem = new int [DEAUFAL_CAPACITY];//不带参数的构造方法用来初始化数组的长度
}
//打印元素
public void disPlay(){
for(int i = 0;i < usedSize;i++){
System.out.print(elem[i]+ " ");
}
System.out.println();
}
//新增一个元素
public void Add(int data){
if(ifFull()){
//进行数组扩容
elem = Arrays.copyOf(elem,elem.length*2);
}
this.elem[usedSize] = data;
usedSize++;//计数器++
}
//判断数组是否满了
public boolean ifFull(){
return elem.length == usedSize;
}
//在pos位置新增元素
public void add(int pos,int data){
//判段pos位置的下标是否合法
if(pos < 0 || pos > elem.length){
throw new RuntimeException("pos下标不合法");
}
//判断数组是否满了
if(ifFull()){
//数组扩容
elem = Arrays.copyOf(elem,elem.length*2);
}
//挪数据
for (int i = this.usedSize - 1; i >= pos ; i--) {
this.elem[i + 1] = elem[i];
}
//新增元素
this.elem[pos] = data;
usedSize++;
}
//判定是否包含某个元素
public boolean contains(int toFind){
//遍历数组并判断
for (int i = 0; i < usedSize; i++) {
if(this.elem[i] == toFind){
return true;
}
}
return false;
}
//查找某个元素对应的位置
public int indexOf(int toFind){
//遍历数组并判断
for (int i = 0; i < usedSize; i++) {
if(this.elem[i] == toFind){
return i;
}
}
return -1;
}
//获取pos位置的元素
public int get (int pos){
//判断pos下表是否合法
if(pos < 0 || pos > elem.length){
throw new RuntimeException("pos下标不合法");
}
return this.elem[pos];
}
//给pos位置的元素设为value
public void set(int pos,int value){
//判断pos下表是否合法
if(pos < 0 || pos > elem.length){
throw new RuntimeException("pos下标不合法");
}
for(int i = 0; i < usedSize;i++){
if(i == pos){
this.elem[i] = value;
}
}
}
//删除第一次出现的关键字key
public void remove(int toRemove){
if(usedSize == 0){
throw new RuntimeException("数组长度为0!");
}
//判断是否有你要删除的元素
int index = indexOf(toRemove);
if(index == -1){
System.out.println("不存在你要删除的元素!!!");
return;
}
//将数据往前挪
for (int i = index; i < usedSize ; i++) {
this.elem[i] = elem[i+1];
}
//删除数据
usedSize--;
}
//记录顺序表的长度
public int size(){
return usedSize;
}
//清空顺序表
public void clear(){
this.usedSize =0;
return;
}
}
3.ArrayList简介
在集合框架中,
ArrayList
是一个普通的类,实现了
List
接口,具体框架图如下:
1. ArrayList
是以泛型方式实现的,使用时必须要先实例化
2. ArrayList
实现了
RandomAccess
接口,表明
ArrayList
支持随机访问
3. ArrayList
实现了
Cloneable
接口,表明
ArrayList
是可以
clone
的
4. ArrayList
实现了
Serializable
接口,表明
ArrayList
是支持序列化的
5.
和
Vector
不同,
ArrayList
不是线程安全的,在单线程下可以使用,在多线程中可以选择
Vector或者
CopyOnWriteArrayList
6. ArrayList
底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
3.1 ArrayList的常见操作
方法 | 解释 |
boolean add(E e) | 尾插 e |
void add(int index, E element) | 将 e 插入到 index 位置 |
E remove(int index) | 删除 index 位置元素 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) | 获取下标 index 位置元素 |
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List<E> subList(int fromIndex, int toIndex) |
截取部分
list
|
3.2ArrayList的遍历
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 使用下标+for遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
// 借助foreach遍历
for (Integer integer : list) {
System.out.print(integer + " ");
}
System.out.println();
3.2ArrayList的扩容机制
ArrayList的底层是一组动态数组,会根据数据的多少来判断是否需要扩容(1.5倍扩容)