来说说Vector和list 听人说,Vector比List(ArrayList)的效率要低得多,现在基本上没人用Vector了,是这样吗?为什么?我觉得Vector还是蛮好用的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谁说效率低很多的?没人用的原因是因为它与ArrayList基本雷同(除了方法同步之外),JAVA把它废了 既然基本雷同,那就是说都可以用啊,为什么说现在基本没人用Vector,大家都用ArrayList了呢?至少应该一半一半吧 2个基本一样的东西,实现的功能也一样,你说JAVA留它干吗?因此把它废了 Vector 没有作废,即使在 JDK 1.5 里,Vector 也是名正言顺存在的。Vector 比之于 ArrayList,虽然功能形式差不多,但它是“同步的”,所以是“线程安全”的。Vector 之所以用得少,是因为绝大多数情况下使用 List 类的容器的时候,并不需要考虑“线程安全”,此时用 ArrayList 运行效率要高一些。 maquan('ma:kju) 同意,vector是线性安全的,所以会比arrylist多占点资源 就是说,不同的线程访问同一个Vector时,会自动保护,而访问同一个ArrayList时就会产生冲突吗? 在多线程的环境中,存在一个问题,就是多个线程同时访问一个资源(比如一个ArrayList),这会引起“共享冲突”假设一个场景:某线程往某元素特别多的ArrayList追加元素(add),此时ArrayList正好到了它数组的边界,那么它需要扩大数组,采用的方法你可以去看源代码,会有一个拷贝数组的操作。这个动作可能非常慢,那么它有可能正好执行到一半的时候,被JVM调度到休息状态。而此时如果正好又有一个线程来删除某元素(remove)。结果是2个线程对这个ArrayList的操作将使得它变得乱七八糟。这就是“共享冲突”。为了克服“共享冲突”,引入了“同步”机制,也就是“锁”机制,某线程要操作对象的时候,给它加把锁,告诉其他线程,“我正在动它,你们等着”。这样,即使它被调度到休息状态,也不会有其他线程来动这个对象,直到它解锁。这就是“线程安全”。 除了因为“同步”而影响了一定的效率外,之所以不用Vector的原因在于List更好的反应了面向对象的设计原则之一:面向接口编程,List是接口,可以有不同的实现( ArrayList就是其中的一个实现 ),这样用List的好处在于可以屏蔽具体的实现而降低耦合度。而sun之所以要引入 List的原因我个人认为就是在于Vector在设计上没有体现出这个面向对象的原则。包括现在基本都用Map而不用HashTable也是如此。 基础的问题,,看看我错在哪里 在Linux下java如何通过jni获取IE的句柄,或者火狐浏览器的句柄 一个String对象,定义时初始化和通过构造函数初始化有什么差异 JBOSS 启动服务时警告问题 关于字符串的比较和结果保存的问题 Integer.parseInt()的用途?? 为什么是NullPointerException啊? throws 和throw在抛出异常时有什么区别????? 在线等待:使用SOCKET传送数据的问题。 用jbuilder开发CMP类型的EJB时, 请教一个关于打印命令行参数的程序 prt("")和println("")有什么區別
没人用的原因是因为它与ArrayList基本雷同(除了方法同步之外),JAVA把它废了
至少应该一半一半吧
同意,vector是线性安全的,所以会比arrylist多占点资源
假设一个场景:
某线程往某元素特别多的ArrayList追加元素(add),此时ArrayList正好到了它数组的边界,那么它需要扩大数组,采用的方法你可以去看源代码,会有一个拷贝数组的操作。这个动作可能非常慢,那么它有可能正好执行到一半的时候,被JVM调度到休息状态。而此时如果正好又有一个线程来删除某元素(remove)。结果是2个线程对这个ArrayList的操作将使得它变得乱七八糟。
这就是“共享冲突”。
为了克服“共享冲突”,引入了“同步”机制,也就是“锁”机制,某线程要操作对象的时候,给它加把锁,告诉其他线程,“我正在动它,你们等着”。这样,即使它被调度到休息状态,也不会有其他线程来动这个对象,直到它解锁。
这就是“线程安全”。