java知识4-----数据结构 List

本文详细探讨了ArrayList与LinkedList这两种线性表数据结构的特点及应用场景。对比了它们的存储方式、查询、插入与删除操作的效率,并分析了各自的继承结构。

数据结构概念

数据结构:数据之间相互存在着一种或多种特定的关系的元素的集合。

逻辑结构:

数据对象中数据元素之间的相互关系分为:

  1. 集合结构
  2. 线性结构
  3. 属性结构
  4. 图形结构

物理结构

物理结构即存储结构。

  1. 顺序存储结构
  2. 链式存储结构

经典数据结构

线性表(List):

顺序存储方式线性表(ArrayList):

存储位置连续,可以方便计算各个元素的地址。
优点:查询块;
缺点:插入和删除慢;

链式存储方式线性表(LinkedList):

线性表的链式存储结构的特点是,用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
优点:删除和插入快;
缺点:查询慢;

链表的插入:
在p节点和p的next节点中间插入s节点:
s->next = p->next ;
p->next = s ;
链表的删除:
将p节点和p的next的next节点中间的p的next节点删除:
p->next = p->next->next ;

循环链表

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相连的单链表称为单循环链表,简称循环链表。

双向循环链表

双向循环链表是单向循环链表的每个结点中,再设置一个指向其前驱结点的指针域。

双向循环链表的插入
P节点和p的next节点中间插入s节点:
s->prior = p; // 把p赋值给s的前驱
s->next = p->next; //把p->next 赋值给s的后继
p->next->prior = s; //把s赋值给p->next的前驱
p->next = s; // 把s赋值给p的后继
双向循环链表的删除
p的前驱,p节点,p的后继中,删除p节点:
p->prior->next = p->next; //把p-next 赋值给 p-prior 的后继
p->next->prior = p->prior; //把p-prior 赋值给p->next 的前驱

ArrayList

ArrayList内部使用的了一个Object数组来存储数据元素,所以ArrayList开辟的是一块连续的内存,是顺序存储的,有所有顺序存储的特性,查询快,插入删除慢。

LinkedList

LinkedList是链式存储的,具有链式存储的所有特性,查询慢,插入删除快。

继承结构

ArrayList

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}
        
	public abstract class AbstractList<E> extends java.util.AbstractCollection<E> 
			implements java.util.List<E> {}
	
		public abstract class AbstractCollection<E> implements Collection<E> {}
			public interface Collection<E> extends java.lang.Iterable<E> {}
			public interface Iterable<T> {}
		public interface List<E> extends Collection<E> {}
			public interface Collection<E> extends java.lang.Iterable<E> {}
			public interface Iterable<T> {}
	
	public interface List<E> extends Collection<E> {}	
	public interface RandomAccess {}
	public interface Cloneable {}
	public interface Serializable {}

LinkedList

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable {}

	public abstract class AbstractSequentialList<E> extends java.util.AbstractList<E> {}

		public abstract class AbstractList<E> extends java.util.AbstractCollection<E> 
				implements java.util.List<E> {}
		
			public abstract class AbstractCollection<E> implements Collection<E> {}
				public interface Collection<E> extends java.lang.Iterable<E> {}
				public interface Iterable<T> {}
			public interface List<E> extends Collection<E> {}
				public interface Collection<E> extends java.lang.Iterable<E> {}
				public interface Iterable<T> {}
				
	public interface List<E> extends Collection<E> {}	
	public interface Deque{}
		public interface Deque<E> extends java.util.Queue<E> {}
			public interface Queue<E> extends Collection<E> {}
				public interface Collection<E> extends java.lang.Iterable<E> {}
				public interface Iterable<T> {}
	public interface Cloneable {}
	public interface Serializable {}
«Class» AbstractList «Class» ArrayList «interface» List «Class» AbstractCollection «interface» Collection «interface» RandomAccess «interface» Cloneable «interface» Serializable «interface» Queue «interface» Deque Iterable «Class» AbstractSequentialList «Class» LinkedList extends implements extends extends implements implements implements implements implements extends extends extends extends extends implements implements implements implements

总结:
从继承结构看,ArrayList和LinkedList是基本一致的,毕竟他们都是List,区别就在他们的特性上,ArrayList特性是使用连续内存存储,内部是一个数组。
LinkedList可以认为是在ArrayList的基础上进行了改良,在非整块内存使用上体现优势,它是链式存储,内存可以是连续的,也可以是不连续的,大大提升了内存使用率,当然LinkedList在这种情况下是最优的。
LinkedList和ArrayList对比,它的特性
首先,是通过实现Deque这个队列,
其次:
1,是在ArrayList与父类AbstractList之间增加了AbstractSequentialList来增加其独有特性。
2,是增加AbstractCollection这一条父类,实现了直接挂钩到了List的父类Collection;同时也像ArrayList一样保留了List的这一条继承路线。

总结来说,LinkedList是ArrayList的增强改良版本,在特性情况下可以有比ArrayList更优良的表现,但是在一些情况下ArrayList也是比LinkedList表现更优秀,具体使用哪个线性表,需要根据实际情况来定。

调整一下图结构,以便显示的整齐一些,但是整齐了并不如上图杂乱的时候看的更一目了然。

«interface» Collection «interface» Queue «interface» Deque «interface» Iterable «interface» List «Class» AbstractCollection «Class» AbstractSequentialList «Class» LinkedList «Class» AbstractList «interface» Cloneable «interface» Serializable «Class» ArrayList «interface» RandomAccess extends extends extends extends implements extends extends implements implements implements implements extends implements implements implements implements implements extends
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值