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

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

二、认识和理解ArrayList

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

ArrayListDemo:

  1. public class ArrayListDemo {
  2. public static void main(String[] args) {
  3. List<String> userlist = new ArrayList<String>();
  4. userlist.add("yulon");
  5. userlist.add("xiaoyun");
  6. userlist.add("羽龙共舞");
  7. System.out.println("使用普通for循环:");
  8. for(int i=0; i<userlist.size(); i++){
  9. System.out.print(userlist.get(i)+" ");
  10. }
  11. System.out.println();
  12. System.out.println();
  13. System.out.println("使用Iterator迭代器:");
  14. Iterator it = userlist.iterator();
  15. while(it.hasNext()){
  16. System.out.print(it.next()+" ");
  17. }
  18. System.out.println();
  19. System.out.println();
  20. System.out.println("使用增强for循环:");
  21. for(String s : userlist){
  22. System.out.print(s+" ");
  23. }
  24. }
  25. }

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

三、认识和理解LinkedList

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

1、堆栈

  1. public class StringStack {
  2. private LinkedList<String> linkedList
  3. = new LinkedList<String>();
  4. /**
  5. * 将元素加入LinkedList容器
  6. * (即插入到链表的第一个位置)
  7. */
  8. public void push(String name){
  9. linkedList.addFirst(name);
  10. }
  11. /**
  12. * 取出堆栈中最上面的元素
  13. * (即取出链表linkedList的第一个元素)
  14. * @return
  15. */
  16. public String getTop(){
  17. return linkedList.getFirst();
  18. }
  19. /**
  20. * 取出并删除最上面的元素
  21. * (即移出linkedList的第一个元素)
  22. * @return
  23. */
  24. public String pop(){
  25. return linkedList.removeFirst();
  26. }
  27. /**
  28. * 获取元素个数
  29. * @return
  30. */
  31. public int size(){
  32. return linkedList.size();
  33. }
  34. /**
  35. * 判断堆栈是否为空
  36. * (即判断 linkedList是否为空)
  37. * @return
  38. */
  39. public boolean isEmpty(){
  40. return linkedList.isEmpty();
  41. }
  42. //测试
  43. public static void main(String[] args) {
  44. StringStack stack = new StringStack();
  45. stack.push("yulon");
  46. stack.push("xiaoyun");
  47. stack.push("羽龙共舞");
  48. System.out.print("第一个元素是:\t");
  49. System.out.println(stack.getTop());
  50. System.out.println();
  51. System.out.println("全部元素:");
  52. while(!stack.isEmpty()){
  53. System.out.println("\t"+stack.pop());
  54. }
  55. }
  56. }

输出结果是:

  1. 第一个元素是: 羽龙共舞
  2. 全部元素:
  3. 羽龙共舞
  4. xiaoyun
  5. yulon

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

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

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

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

输出顺序是:

  1. xiaoyun
  2. yulon
  3. 羽龙共舞

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

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

深入理解ArrayList与LinkedList的区别

理解ArrayList与LinkedList的区别的更多相关文章

  1. 深入理解ArrayList与LinkedList的区别

    一.先来看看ArrayList与LinkedList 在JDK中所在的位置 从图中可以看出,ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只 ...

  2. LintCode Reverse LinkedList (ArrayList 和 LinkedList 的区别)

    1. ArrayList 和 LinkedList 的区别 http://pengcqu.iteye.com/blog/502676 2. How to reverse LinkedList http ...

  3. 你真的说的清楚ArrayList和LinkedList的区别吗

    参见java面试的程序员,十有八九会遇到ArrayList和LinkedList的区别?相信很多看到这个问题的人,都能回答个一二.但是,真正搞清楚的话,还得花费一番功夫. 下面我从4个方面来谈谈这个问 ...

  4. java集合框架05——ArrayList和LinkedList的区别

    前面已经学习完了List部分的源码,主要是ArrayList和LinkedList两部分内容,这一节主要总结下List部分的内容. List概括 先来回顾一下List在Collection中的的框架图 ...

  5. Java中ArrayList与LinkedList的区别

    Java中ArrayList与LinkedList的区别 一般大家都知道ArrayList和LinkedList的区别: 1. ArrayList的实现是基于数组,LinkedList的实现是基于双向 ...

  6. Java进阶(十七)ArrayList与LinkedList的区别

    ArrayList与LinkedList的区别 ArrayList ArrayList其实是包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayLis ...

  7. 【转】ArrayList与LinkedList的区别和适用场景

    ArrayList 优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的). 缺点:因为地址连续,当要插入和删除时,Arra ...

  8. JAVA中ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题

    近期在做一个对接京东的电商平台,所以对各个地方的效率考虑的比较多,今天深挖了一下ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题,首先说一下两种 ...

  9. 从源代码来理解ArrayList和LinkedList差别

    从源代码理解ArrayList和LinkedList差别 ArrayList ArrayList默认容量为10,实质是一个数组用于存放元素,size表示ArrayList所包括的元素个数. Array ...

随机推荐

  1. groupby elasticsearch

    GET usertag/usertag/_search { "query": { "match": { "tagname": "春 ...

  2. tomcat启动时出现了Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]等错误

    tomcat 启动时报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]等错误 解决办法: 是 ...

  3. Django在Win7下安装与创建项目hello word示例

    Django在Win7下的安装及创建项目hello word的例子 有关python 的django 框架安装与开发的小例子.Django在Win7下的安装及创建项目hello word.1.安装:命 ...

  4. PostgreSQL PL/Python 和 PL/Postgres 函数互相调用

    create or replace function hello(name text) returns text as $$ # str = name+',你吃饭了吗?'; # return 'hel ...

  5. Cloud Resource

    Cloud Public Cloud Aliyun AWS Azure Cloud Stack SDN指南 DNS:Band Private Cloud DC/OS OpenStack Hybrid ...

  6. 使用Windows 10专业版 进行VS2017开发 遇到 HTTP Error 400. The request hostname is invalid

    使用IIS Express 支持非localhost访问 只要使用域名或者本机IP地址都无法进行 iisexpress 调试  公网ip,还是127.0.0.1都出现上面那个错误 主要是新的系统环境 ...

  7. KVM虚拟机安装报错 KVM is not available

    在linux系统上使用kvm安装系统时,如果你的cpu不支持虚拟化技术那么可能会报以下错误: Warning:KVM is not available. This may mean the KVM p ...

  8. git无法提交,存在未提交的修改,在重新合并前或者撤销更改

    其实我没有修改.但是却无法同步. 解决方法: 1.在vs里, 打开git的命令提示符 2.输入一下命令: git stashgit stash pop 3.然后再git checkout试试,然后提示 ...

  9. [Windows Azure] Create a Virtual Network for Site-to-Site Cross-Premises Connectivity

    Create a Virtual Network for Site-to-Site Cross-Premises Connectivity This tutorial walks you throug ...

  10. u3d中刚体与碰撞体的理解以及is Trigger属性的意义

    刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚体与碰撞体的关系:个人理解判断碰撞体就是需要计算力,如果碰撞的物体 ...