java vector arraylist linkedlist用法与区别
首先,它们是list的实现类,大致说一下vector arraylist linkedlist的区别。
1、线程安全来讲,
vector是线程安全,arraylist linkedlist线程不安全。
2、底层实现来讲,
vector arraylist是数组,linkedlist是双向链表。
3、效率上讲,
vector比arraylist慢。
由于vector和arraylist底层是数组,所以查找起来很快,
而linkedlist是通过指针查找,所以查找起来相对较慢。
而数组的增、删元素,会引起移动数据,而链表则不会。
例如linkedlist删除某一元素,是将这个元素前后两个元素连接在一起,然后将移出的元素置空,
而如果是往arraylist中增加一个元素,比如add(3,"aaa")是把原来第3这个元素移到第4位,第4位移到第5位,依此类推,空出一个位置用来放加进去的元素。
由此可见,arraylist在增删元素时效率会比linkedlist要慢。
linkedlist有头尾指针,于是它可以addFirst("第一个")和addLast("最后一个"),以及getFirst()和getLast()。
是不是arraylist一定就比linkedlist在增删数据慢呢?
未必!
如果已经找到位置的情况下,确实linkedlist要快一点。但实际上,很多时候都需要先找位置,然后插入。
如果找得太久,arraylist就占优势了。
例如,我们往90000这个位置插入一个元素,arraylist很快就能找到这个位置,然后插入,
而linkedlist需要将指针一个个移到这个位置,再插入。
同样是完成往90000这个位置插入一个元素的任务,谁更快,可想而知。
当然,如果linkedlist一直addFirst或addLast,这样也可以省去查找的时间。
另外,假如有100000个元素,如果是arraylist,往第一个位置增加一个元素,和住第50000个增加元素,和往第100000个增加元素,效果是有很大区别的。
主要是区别在于,移动数据的多少。
4、vector和arraylist的扩容问题,
由于底层是数组,它们在初始化时,都是有长度的。
arraylist初始化的三种方式:
1)不初始化起容量 ArrayList al = new ArrayList();//默认容量为10
2)初始化容量ArrayList al = new ArrayList(3);//初始容量为3
3)以一个集合或数组初始化ArrayList al = new ArrayList(a);//a为集合或数组
当一个长度为10的arraylist在添加第11个元素时,它会以当前长度的1.5倍在堆内存中重新创建一个数组对象,然后把原数组内的数据复制过来,放弃原数组,指向新数组。
vector是同样的道理,只不过,它是以2倍的速度扩容,也就是如果原数组长度是10,那么新数组的长度就是20。
下面是用法例子:
package wzq.j2se.obj;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
public class ListDemo {
public static void main(String[] args) {
System.out.println("-------vector--------");
Vector v = new Vector(4);
v.add("Test0");
v.add("Test1");
v.add("Test0");
v.add("Test2");
v.add("Test2");
v.remove("Test0"); //删除指定内容的元素
v.remove(0); //按照索引号删除元素
int size = v.size();
System.out.println("size:" + size);
for(int i = 0;i < v.size();i++){
System.out.println(v.get(i));
}
System.out.println("-------arraylist--------");
List list = new ArrayList();
list.add("test0");
list.add("test1");
list.add("test2");
//list.addAll(v);
list.add("test3");
list.remove("test1");
list.remove(2);//注意这儿,是指重新排序后的元素,也就是test3成了第二个元素:test0,test2,test3
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
System.out.println("---------------");
/*ArrayList与数组之间的转换:
*/
List list1 = new ArrayList();
list1.add("1");
list1.add("2");
final int size1 = list1.size();
String[] arr = (String[])list1.toArray(new String[size1]);
System.out.println("arr=="+arr[0]);
System.out.println("arr=="+arr[1]);
String[] arr2 = new String[] {"4", "5"};
List list2 = Arrays.asList(arr2);
for(int i=0;i<list2.size();i++){
System.out.println(list2.get(i));
}
System.out.println("-------linkedlist--------");
//初使化一个链表
LinkedList head = new LinkedList();
head.add(new String("小狗"));
head.add(new String("美国"));
head.add(new String("Japanese!"));
head.add(2, "小猪");
//链表会自动用遍历的方式打印所有內容
System.out.println(head);
//利用Vector或者是ArrayList等Collection往链表中加数据
Vector v1 = new Vector();
//向Vector中加入东西
v1.add("大狗");
v1.add("老美");
v1.add("JAPAN");
v1.add("老猪");
//将当前Vector加在当前链表的最后
head.addAll(v1);
System.out.println(head);
//将当前Vector加在当前链表的指定位置
head.addAll(2, v1);
System.out.println(head);
//打印指定位置的內容
System.out.println(head.get(2));
head.addFirst("第一个");
System.out.println(head);
head.addLast("最后一个");
System.out.println(head);
//刪除第一个
head.remove(head.getFirst());
System.out.println(head);
//再刪除第一个,采用下标的方式,下标是从0开始的
head.remove(0);
System.out.println(head);
head.remove(head.getLast());
System.out.println(head);
}
}
java vector arraylist linkedlist用法与区别相关推荐
- 读List源码之Vector,ArrayList,LinkedList
List ,LinkedList,ArrayList,Vector ArrayList与LinkedList(间接),Vector均直接或间接继承自AbstractList,AbstractList实 ...
- 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- java vector实现的接口_java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析...
java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...
- 1.3 List集合:ArrayList和LinkedList类的用法及区别
List集合: List 是一个有序.可重复的集合,集合中每个元素都有其对应的顺序索引. List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素. List 集合默认按元素的添加顺序设置 ...
- ArrayList和LinkedList类的用法及区别
List 是一个有序.可重复的集合,集合中每个元素都有其对应的顺序索引.List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素.List 集合默认按元素的添加顺序设置元素的索引,第一个添 ...
- ArrayList、Vector、LinkedList的特点和区别
ArrayList.Vector.LinkedList类均在java.util包中,均为可伸缩数组. 1)ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会 ...
- Java中ArrayList和LinkedList区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机 ...
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机 ...
- java中ArrayList和LinkedList的区别
首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...
最新文章
- UNIX系统编程(2)
- Spring Boot——[java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration]解决方案
- Spark Streaming(三)zookeepe搭建
- QQ聊天文字背影图片拉伸方法
- GB28181平台介绍
- 菜鸟的学习之路(6) — 设计模式之单例模式(Singleton)
- python网盘系统_Python最新全套视频教程百度网盘资源
- python3入门与进阶 网盘_python3入门与进阶(二)
- Asp.net(C#)年月日时分秒毫秒
- Nginx_PHP缓存设置的整理对比
- 关于WIN10显示“未安装任何音频输出设备” 英特尔(R)智音系统OED启动错误(代号10)解决办法
- mysql报错1194_MYSQL ERROR 1194 (HY000)
- Linux指令部分(一)
- MySQL数据库安全配置规范操作
- “大自然的印钞机”农夫山泉如何借数藏冲破自己的“天花板”?
- 一种NET软件加壳技术的设计与实现
- C/C++的灵魂—指针实现冒泡排序、选择排序和插入排序
- SpringBoot普通参数与基本注解(@PathVariable、@RequestHeader、@RequestParam、@RequestBody)
- PS制作水火相溶特效文字图片
- SAP_PS常用增强