1.线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列..
线性表在逻辑上是线性结构,是连续的一条直线,但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的方式存储。
2.顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况采用数组存储。在数组上完成数据的增删查改。
3.ArrayList简介
在集合框架中,ArrayList是一个普通类,实现了List接口,具体框架图如下:
1. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
2. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
4. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
5. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表.
4.ArrayList使用
4.1 ArrayList的构造
import java.util.*;
public class make {
public static void main(String[] args) {
//ArrayList创建,推荐写法
//构造一个空的列表
List<Integer> list1 =new ArrayList<>();
//构造一个具有10个容量的列表
List<Integer> list2 = new ArrayList<>(10);
list2.add(1);
list2.add(2);
list2.add(3);
//list2.add("hello");//添加hello失败,因为List<Integer>已经限定了,list2中只能存储整型元素;
ArrayList<Integer> list3=new ArrayList<>(list2);
ArrayList<String> list4=new ArrayList<>(10);
list4.add("hello");
list4.add("world");
System.out.println(list2);
System.out.println("================");
System.out.println(list3);
System.out.println(list4);
}
}
4.2 ArrayList的常见操作方法
| |||||||||||||||||||||||
|
public static void main(String[] args) {
List<String>list= new ArrayList<>();
list.add("javaSE");
list.add("javaweb");
list.add("JVM");
System.out.println(list);
//获取list中有效元素的个数
System.out.println(list.size());
//获取和设置index位置上的元素,index必须介于[0,size)之间;
System.out.println(list.get(1));
list.set(1,"javaWEB");
System.out.println(list.get(1));
//在list的index位置插入指定元素,Index及后续的元素统一往后搬移一个位置;
list.add(1,"java数据结构");
System.out.println(list);
//删除指定元素,找到了就删除,该元素之后的元素统一往前挪移一个位置;
list.remove("JVM");
System.out.println(list);
//删除list中index位置上的元素,注意index不要超过list中的有效元素个数,否则会越界;
list.remove(list.size()-1);
System.out.println(list);
//检测list中是否包含指定元素,包含返回true,否则返回false;
if(list.contains("java数据结构")){
list.add("测试课程");
}
System.out.println(list);
//查找指定元素第一次出现的位置:indexOf()从前往后找,lastindexOf从后往前找;
list.add("JavaSE");
System.out.println(list.indexOf("JavaSE"));
System.out.println(list.lastIndexOf("JavaSE"));
// 使用list中[0, 4)之间的元素构成一个新的ArrayList返回
List<String> ret = list.subList(0,2);
System.out.println(ret);
list.clear();//清空顺序表
System.out.println(list.size());
}
}
4.3数组的遍历
使用for循环加下标、foreach、使用迭代器
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 x:list
) {
System.out.print(x+" ");
}
System.out.println();
Iterator<Integer> it =list.listIterator();
while(it.hasNext()){
System.out.print((it.next())+" ");
}
System.out.println();
}
}
4.4ArrayList的扩容机制
public static void main(String[] args) {
List<Integer> list= new ArrayList<>();
for(int i=0;i<100;i++){
list.add(i);
}
System.out.println(list);
}
ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。