Vector和Arraylist的区别

avatar 2017年10月20日19:05:31 4 2555 views
博主分享免费Java教学视频,B站账号:Java刘哥
最近上了 JSP 课程,其中有一个作业是实现一个简单的留言板,就是把留言内容加到 application 对象中。 部分代码如下
  1. <%! Vector v=new Vector();
  2.     int i=0;
  3.     ServletContext  application;
  4.     synchronized void leaveWord(String s) { //留言方法
  5.         application=getServletContext();
  6.         i++;
  7.         v.add("No."+i+","+s);
  8.         application.setAttribute("Mess",v);
  9.     }
  10. %>
瞪眼一看,Vector 是啥?为什么不用 ArrayList 。基础差是该的,应该补了。 然后百度查了一下,得知 Vector 是线程安全的,ArrayList 是不安全的(效率高)。
下面是 来自 清浅池塘 的一篇文章,该博主的文章都很不错。下面转载一下 前几篇文章我们重点说了ArrayLIst,是时候放出这张图了。 这张图里的内容对我们学习Java来说,非常的重要,白色的部分是需要去了解的,黄色部分是我们要去重点了解的,不但要知道怎么去用,至少还需要读一次源码。绿色部分内容已经很少用了,但在面试题中有可能会问到,我们来看一个经常出现的面试题:Arraylist与Vector的区别是什么? 首先我们给出标准答案: 1、Vector是线程安全的,ArrayList不是线程安全的。 2、ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。   1、看上图Vector和ArrayList一样,都继承自List,来看一下Vector的源码 实现了List接口,底层和ArrayList一样,都是数组来实现的。   2、分别看一下这两个类的add方法 首先来看ArrayList的add源码   再看Vector的add源码 方法实现都一样,就是加了一个synchronized的关键字,   3、再来看看两个类 remove 方法 先看ArrayList的remove方法   再看Vector的remove方法 方法实现上也一样,就是多了一个synchronized关键字   4、再看看两个类的get方法 ArrayList的get方法   Vector的get方法   5、再看看Vector的其它方法   无一例外,只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性。当执行synchronized修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。(多线程环境不允许用ArrayList,需要做处理)。 至于底层数组的扩容区别,这里就不带着大家读源码了,有兴趣的朋友大家自己读吧,底层代码几乎是一样的,不同的只是计算后的新数组长度不一致。 和ArrayList和Vector一样,同样的类似关系的类还有HashMap和HashTable,StringBuilder和StringBuffer,后者是前者线程安全版本的实现。希望以后大家在面试过程中,能说出个因为所以,而不是一味的去背面试题,唯有理解,无需再背。 注:关于线程安全性,后续文章会说,这里只是简单说这两个类不一样的地方。   原文地址:https://zhuanlan.zhihu.com/p/28241176
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0