`
yulon
  • 浏览: 118718 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

深入理解ArrayList与LinkedList的区别

阅读更多

 一、先来看看ArrayList与LinkedList 在JDK中所在的位置

 

 

从图中可以看出,ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同,(编程思想: 从中可以看出面向接口的好处, 对于不同的需求就有不同的实现!),而List接口继承了Collection接口,Collection接口又继承了Iterable接口,因此可以看出List同时拥有了Collection与Iterable接口的特性.

 

二、认识和理解ArrayList

 

ArrayList实现了List接口,它是以数组的方式来实现的,数组的特性是可以使用索引的方式来快速定位对象的位置,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好. 

 

ArrayListDemo:

public class ArrayListDemo {

	public static void main(String[] args) {
		
		List<String> userlist = new ArrayList<String>();
		userlist.add("yulon");
		userlist.add("xiaoyun");
		userlist.add("羽龙共舞");
		System.out.println("使用普通for循环:");
		for(int i=0; i<userlist.size(); i++){
			System.out.print(userlist.get(i)+" ");
		}
		System.out.println();
		System.out.println();
		System.out.println("使用Iterator迭代器:");
		Iterator it = userlist.iterator();
		while(it.hasNext()){
			System.out.print(it.next()+" ");
		}
		System.out.println();
		System.out.println();
		System.out.println("使用增强for循环:");
		
		for(String s : userlist){
			System.out.print(s+" ");
		}
	}
}

 这里列举出了循环List列表的三种方式: 使用普通for循环,用get方法获取; 使用Iterator迭代器,使用next方法遍历;使用增强for循环,直接输出!  由此可见第三种方法是最方便,最简洁的!

 

三、认识和理解LinkedList

 

LinkedList是采用链表的方式来实现List接口的,它本身有自己特定的方法,如: addFirst(),addLast(),getFirst(),removeFirst()等. 由于是采用链表实现的,因此在进行insert和remove动作时在效率上要比ArrayList要好得多!适合用来实现Stack(堆栈)与Queue(队列),前者先进后出,后者是先进先出.

 1、堆栈

public class StringStack {
	private LinkedList<String> linkedList 
	= new LinkedList<String>();

	/**
	 * 将元素加入LinkedList容器
	 * (即插入到链表的第一个位置)
	 */
	public void push(String name){
		linkedList.addFirst(name);
	}
	/**
	 * 取出堆栈中最上面的元素
	 * (即取出链表linkedList的第一个元素)
	 * @return
	 */
	public String getTop(){
		return linkedList.getFirst();
	}
	/**
	 * 取出并删除最上面的元素
	 * (即移出linkedList的第一个元素)
	 * @return
	 */
	public String pop(){
		return linkedList.removeFirst();
	}
	/**
	 * 获取元素个数
	 * @return
	 */
	public int size(){
		return linkedList.size();
	}
	
	/**
	 * 判断堆栈是否为空
	 * (即判断 linkedList是否为空)
	 * @return
	 */
	public boolean isEmpty(){
		return linkedList.isEmpty();
	}
	//测试
	public static void main(String[] args) {
		StringStack stack = new StringStack();
		stack.push("yulon");
		stack.push("xiaoyun");
		stack.push("羽龙共舞");
		System.out.print("第一个元素是:\t");
	    System.out.println(stack.getTop());
	    System.out.println();
	    System.out.println("全部元素:");
	    while(!stack.isEmpty()){
	    	System.out.println("\t"+stack.pop());
	    }
	}
}

输出结果是:

 

第一个元素是:	羽龙共舞

全部元素:
	羽龙共舞
	xiaoyun
	yulon

 

 

知识提示: LinkedList的特有方法(本身定义的方法)如:addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等

  2、实现队列类似,在此不再举例

 

  3、如果要使用队列的功能,由于LinkedList也实现了java.util.Queue接口,所以可以直接使用LinkedList的实例来实现.

 

public class QueueDemo {
	public static void main(String[] args) {
		//父类引用queue指向子类对象
		Queue<String> queue = new LinkedList<String>();
		//offer()方法是往队列加入元素
		queue.offer("xiaoyun");
		queue.offer("yulon");
		queue.offer("羽龙共舞");
		String element = null;
		while((element=queue.poll())!=null){
			System.out.println(element+"\t");
		}
	}
}

 

输出顺序是:

xiaoyun	
yulon	
羽龙共舞	

 

四、在删除可插入对象的动作时,为什么ArrayList的效率会比较低呢?

 

解析: 因为ArrayList是使用数组实现的,若要从数组中删除或插入某一个对象,需要移动后段的数组元素,从而会重新调整索引顺序,调整索引顺序会消耗一定的时间,所以速度上就会比LinkedList要慢许多. 相反,LinkedList是使用链表实现的,若要从链表中删除或插入某一个对象,只需要改变前后对象的引用即可!

  • 大小: 6.2 KB
3
0
分享到:
评论
1 楼 iuf6853 2010-11-26  
谢谢知识分享

相关推荐

    ArrayList和Linkedlist1

    总的来说,理解ArrayList和LinkedList的基本特性和应用场景,以及如何处理与之相关的安全性问题,是Java程序员必备的知识。通过深入学习和实践,可以更好地利用这些数据结构提升程序效率和质量。

    ArrayList Vector LinkedList 区别与用法.

    本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解它们之间的差异。 #### 一、ArrayList与Vector **1. 存储方式** - **ArrayList** 和 **Vector** 都采用动态数组的...

    ArrayList LinkedList Vector性能对比

    总之,理解ArrayList、LinkedList和Vector的内部工作原理和性能特征,可以帮助我们做出更明智的选择,优化代码性能,并避免不必要的资源消耗。在深入源码阅读和实践过程中,我们可以更深入地理解这些类的设计思想和...

    ArrayList-LinkedList-源码.rar

    《ArrayList与LinkedList源码解析》 在Java编程中,ArrayList和LinkedList是两种常见的动态数组,它们都是Java集合框架的一部分,提供了对元素存储和操作的功能。本篇将深入探讨ArrayList和LinkedList的内部实现...

    深入arraylist,linkedlist,hashmap,hashset源码(2012/3/18)

    总结来说,深入理解ArrayList、LinkedList、HashMap和HashSet的源码,有助于我们更好地利用它们的特性,优化代码性能,并在面临并发问题时做出正确的选择。对于开发人员来说,掌握这些基础数据结构的实现原理是提高...

    list集合案例增、删、改、查,ArrayList与LinkedList的区别,LinkedList堆栈/队列的开发

    本篇文章将深入探讨`List`集合的各种操作,包括增、删、改、查,以及`ArrayList`和`LinkedList`两种实现`List`接口的类之间的区别。同时,我们还将讨论如何利用`LinkedList`实现堆栈和队列的功能,并了解`List`集合...

    Java 各种集合的区别ArrayList Vector LinkedList map区别

    今天,我们将深入了解 Java 中的集合类别,包括 ArrayList、Vector、LinkedList 和 Map 等。 ArrayList ArrayList 是一种基于数组的集合类别,它可以存储大量的数据。ArrayList 的特点是:它可以动态地增加或减少...

    对比Vector、ArrayList、LinkedList1

    此外,深入理解Java集合框架还包括对整个框架设计的理解,如接口层次结构、实现类的内部机制以及不同容器(集合和Map)的性能特征。在并发领域,需要了解不同容器在多线程环境下的表现,如ConcurrentHashMap相对于...

    Map+List+ArrayList+LinkedList Java源码

    了解它们的源码对于深入理解Java集合框架的内部工作原理至关重要,尤其是对初学者而言,这有助于提高编程技能和优化代码性能。 **Map接口** Map是Java集合框架中的一个接口,它定义了键值对存储的方法。Map接口不...

    ArrayList 和LinkedList各自的特点是什么

    ### ArrayList与LinkedList的特点详解 #### 一、ArrayList的特点 **1.... - **基于数组实现**:`...通过对这两种数据结构特点的深入理解,可以帮助开发者更好地选择适合特定场景的集合类型,从而提高程序的性能和效率。

    ArrayList-LinkedList:ArrayList和LinkedList的完整演示

    本文将深入探讨ArrayList和LinkedList的内部实现、性能差异以及如何在实际应用中进行操作。 首先,ArrayList是一个动态数组,它在内存中开辟一段连续的空间来存储元素。它的优点在于随机访问速度快,因为数组可以...

    ArrayList-LinkedList--Vector-Map.zip_vector

    总结来说,理解并熟练掌握`ArrayList`、`LinkedList`、`Vector`和`Map`各自的特性,能够帮助我们根据具体的应用场景选择最适合的数据结构,从而优化代码性能和效率。在实际编程中,灵活运用这些集合类可以极大地提高...

    深入理解Java中的ArrayList和LinkedList

    杂谈基本数据结构–线性表: ...  ArrayList和LinkedList是顺序存储结构和链式存储结构的表在java语言中的实现.  ArrayList提供了一种可增长数组的实现,使用ArrayList,因为内部使用数组实现,所以,它

    benchmark-lists:ArrayList 与 LinkedList

    本篇将深入探讨`ArrayList`和`LinkedList`的基本概念、工作原理以及性能对比。 首先,`ArrayList`是一个基于数组实现的动态列表。它内部维护了一个Object类型的数组,可以存储任何类型的数据。由于数组的特性,`...

    JDK1.6中Arraylist,Vector,LinkedList源码

    在Java编程语言中,ArrayList、Vector和LinkedList是三种常见的动态数组实现,它们都属于集合框架中的List接口。这里我们将深入探讨这三种数据结构的源码,理解它们的内部实现、性能特性和适用场景。 首先,...

    java毕业设计之ArrayList,LinkList链表接口实现源码.zip

    该项目中,可能包含了这两个数据结构的实现源码,通过阅读和分析源码,可以深入理解ArrayList和LinkedList的工作机制,这对于提升编程技巧和解决问题的能力大有裨益。此外,源码分析也是Java面试中常见的题目,因此...

    毕业设计源码之ArrayList,LinkList链表接口实现.zip

    1. **集合框架理解**:深入理解Java集合框架,包括List接口、Set接口和Map接口,以及它们的实现类如ArrayList、LinkedList、HashSet、HashMap等。 2. **ArrayList与LinkedList的区别**:对比分析ArrayList和...

    ArrayList,LinkList链表接口实现.zip

    ArrayList和LinkedList是Java集合框架中的两种重要数据结构,它们都实现了List接口,但各自有其独特的特性和使用场景。在本教程中,我们将深入探讨这两种数据结构的实现,并结合Eclipse IDE进行实践。 首先,...

    jni操作arraylist对象

    在这个主题中,我们将深入探讨如何在JNI中操作ArrayList对象并添加一个int类型的数据。 首先,我们需要理解ArrayList在Java中的本质。ArrayList是Java集合框架中的一个重要类,它实现了List接口,用于存储可变大小...

Global site tag (gtag.js) - Google Analytics