1.线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2.顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
2.1接口的实现
public interface IList {
// 新增元素,默认在数组最后新增
public void add(int data) ;
// 在 pos 位置新增元素
public void add(int pos, int data) ;
// 判定是否包含某个元素
public boolean contains(int toFind) ;
// 查找某个元素对应的位置
public int indexOf(int toFind) ;
// 获取 pos 位置的元素
public int get(int pos) ;
// 给 pos 位置的元素设为 value
public void set(int pos, int value) ;
//删除第一次出现的关键字key
public void remove(int toRemove) ;
// 获取顺序表长度
public int size() ;
// 清空顺序表
public void clear() ;
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void display() ;
}
3. ArrayList简介
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
说明:
- ArrayList是以泛型方式实现的,使用时必须要先实例化
- ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
-
- ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
- ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
- 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者
CopyOnWriteArrayList - ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
4.ArrayList常见操作
public class MyArrayList implements IList {
public int[] elem;
public int usesize;
public static final int DEFAULT_CAPACITY = 5;
public MyArrayList() {
this.elem = new int[DEFAULT_CAPACITY];
}
public boolean isFull(){
return elem.length == usesize;
}
@Override
public void add(int data) {
if (isFull()){
elem =Arrays.copyOf(elem,2*elem.length);
}
elem[usesize] = data;
usesize++;
}
private void checkPos(int pos){
if (pos < 0 || pos > usesize){
throw new PosException("pos位置不合法"+pos);
}
}
@Override
public void add(int pos, int data) {
checkPos(pos);
if (isFull()){
elem =Arrays.copyOf(elem,2*elem.length);
}
for (int i = usesize - 1; i >= pos ; i--) {
elem[i+1] = elem[i];
}
elem[pos] = data;
usesize++;
}
@Override
public boolean contains(int toFind) {
for (int i = 0; i <usesize ; i++) {
if (elem[i] == toFind){
return true;
}
}
return false;
}
@Override
public int indexOf(int toFind) {
for (int i = 0; i <usesize ; i++) {
if (elem[i] == toFind){
return i;
}
}
return -1;
}
public boolean isEmpty(){
return usesize == 0;
}
@Override
public int get(int pos) {
checkPos(pos);
if (isEmpty()){
throw new EmptyException("顺序表为空");
}
for (int i = 0; i <usesize ; i++) {
return elem[pos];
}
return -1;
}
@Override
public void set(int pos, int value) {
checkPos(pos);
if (isEmpty()){
throw new EmptyException("顺序表为空");
}
elem[pos] = value;
}
@Override
public void remove(int toRemove) {
if (isEmpty()){
throw new EmptyException("顺序表为空");
}
int index = indexOf(toRemove);
for (int i = index; i <usesize - 1 ; i++) {
elem[i] = elem[i+1];
}
usesize--;
}
@Override
public int size() {
return this.usesize;
}
@Override
public void clear() {
usesize = 0;
}
@Override
public void display() {
for (int i = 0; i <usesize ; i++) {
System.out.println(elem[i]);
}
}
}
4.1ArrayList的遍历
//第一种遍历方式
System.out.println(arrayList);
//第2种遍历方式 for
for (int i = 0; i < arrayList.size(); i++) {
System.out.print(arrayList.get(i)+" ");
}
System.out.println();
//3、for-each
for(int x : arrayList) {
System.out.print(x+" ");
}
System.out.println();
//4.迭代器
Iterator<Integer> it = arrayList.iterator();
while(it.hasNext()){
System.out.println(it.next()+" ");
}
System.out.println();
//5.
ListIterator<Integer> it2 = arrayList.listIterator();
while (it2.hasNext()){
System.out.println(it2.next());
}
System.out.println();
//6.从后向前打印
ListIterator<Integer> it3 = arrayList.listIterator(arrayList.size());
while(it3.hasPrevious()){
System.out.println(it3.previous()+" ");
}
System.out.println();
}