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

List Set ArrayList 区别详解

    博客分类:
  • Java
阅读更多

List是列表(接口),是可以允许出现重复值的,
Set是集合,不允许出现重复值
ArrayList(一般类)实现list接口
arraylist与vector是差不多的,只不过arraylist是不同步的

vector ArrayList同样是数组的封装
vector似乎是方法的同步?
ArrayList非同步
如果不涉及多线程 使用ArrayList应该会块些

List和Map都是接口
不能实例化的
以前这么写List list = new Vector();
现在这么写List list = new ArrayList();
用ArrayList 代替了Vector 因为前者的性能比后者好;
但是两个都是实现了List接口的
同理Map map = new HashTable();(以前)
Map map = new HashMap();(现在)

List接口
  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
   除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
  实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
ArrayList类
  ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
  和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Map接口
  请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
HashMap类
   HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

 

1.
List是接口,List特性就是有序,会确保以一定的顺序保存元素.
ArrayList是它的实现类,是一个用数组实现的List.
Map是接口,Map特性就是根据一个对象查找对象.
HashMap是它的实现类,HashMap用hash表实现的Map,就是利用对象的hashcode(hashcode()是Object的方法)进行快速散列查找.(关于散列查找,可以参看<<数据结构>>)
2.
一般情况下,如果没有必要,推荐代码只同List,Map接口打交道.
比如:List list = new ArrayList();
这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要:
List list = new LinkedList();//LinkedList也是List的实现类,也是ArrayList的兄弟类
这样,就不需要修改其它代码,这就是接口编程的优雅之处.
另外的例子就是,在类的方法中,如下声明:
private void doMyAction(List list){}
这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.
3.
如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.
可以参考The Art Of Computer Programming的Sorting and Searching部分

Vector类

Vector类中的所有方法都是线程同步的,两个线程并发访问Vector时对象是安全的。但只有一个线程访问Vector对象时,因为源程序仍调用了同步方法,需要额外的监视器检查,运行效率要低些。
ArrayList类中的所有方法都是同步的,所有在没有多线程安全问题的时候,最好用ArrayList,程序的效率会高些。
在有线程安全问题,且我们的程序又没有自己处理的时候,只能用Vector。

补充一下Vector只能容纳object freforences不能容纳基本类型
ArrayList有更高性能Verctors可多层套用
我比较喜欢ArrayList

Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

可能很多人都不知道ArrayList,但是肯定知道Vector,因为Vector比ArrayList早,所以用的
比较多。但是在java1.2之后的Collection框架中,Vector已经被淘汰了,因为要保持兼容型,
这个类会一直存在,但是确被建议不要使用,这就是软件的兼容性。

对于不熟悉Vector的人那最好了,直接用ArrayList就好了,不过习惯使用Vector的最好也转到
ArrayList(虽然Vector可能永远存在JDK中),但是我们没有理由放弃ArrayList使用Vector。

public class Vector extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable
可以看出和ArrayList的声明是一样的,这里不考虑它的实现,来看看主要区别:
1.Vector 有而ArrayList没有的方法:addElement,copyInto,elementAt,elements,firstElement,firstElement等等,这里就不一一列举,基本上都是多余的方法,而且还使用了Enumeration(一起被淘汰的)。

2.Vector的实现相对ArrayList稍微复杂,Vector功能并不比ArrayList强大,代码量确是两倍。

3.Vector中的大部分方法都是同步方法,不要认为这是它的优点!同步是要付出代价的,要不然在单例模式中很多人都希望用Double-Check Lock呢(虽然不可行)。因为方法都经过同步,效率自然下降不少。

 

分享到:
评论

相关推荐

    java集合类详解(set list ArrayList等java集合类详述)

    Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...

    java基础--list(ArrayList、LinkedList、匿名类).docx

    【Java基础——List接口详解(ArrayList、LinkedList、匿名类)】 在Java编程中,List接口是集合框架的重要组成部分,提供了有序存储元素的功能。ArrayList和LinkedList是List接口的两种主要实现,它们各有优缺点,...

    java关键字ArrayList详解

    ArrayList是Java集合框架中的一种重要实现,它是List接口的一个具体类,主要特点是基于数组实现,提供了灵活的元素存储和操作。ArrayList支持动态扩容,可以根据需要自动增加数组的大小,这使得在不知道确切元素数量...

    Java集合Collection、List、Set、Map使用详解

    ### Java集合Collection、List、Set、Map使用详解 #### 1. 集合框架概述 集合框架是Java编程语言中最基本且最重要的组成部分之一。它提供了处理数据集合的强大工具,这些工具不仅支持基本操作(如添加、删除和查找...

    java各种集合的详解Set,List,Vector

    java各种集合的详解Set,List,Vector,arrayList,linkList,HashSet

    Java集合Collection、List、Set、Map使用详解.pdf

    "Java集合Collection、List、Set、Map使用详解" Java集合是Java编程语言中最基本也是最重要的一部分。能够正确地使用集合类和理解集合的实现原理对于Java程序的开发具有无比的好处。本文将详细解释Java集合的实现...

    Dart 集合类型List Set Map详解 以及循环语句 forEach map where any every.zip

    此外,Dart还提供了多种List的子类,如ArrayList和LinkedList,用于不同性能需求。 2. **Set**: Set是无序且不允许重复元素的集合。创建Set的方式是使用{},例如`Set&lt;String&gt; names = {'Alice', 'Bob'};`。Set...

    Java集合:Collection、List、Set、Map使用详解

    本文将深入探讨Java集合框架中的四个主要接口:Collection、List、Set和Map,以及它们的实现原理。 ### 集合框架概述 集合框架是Java API中用于存储和管理对象的统一框架。它为数据结构提供了抽象接口,使得程序员...

    Java应用:两种Java容器类List和Set分析

    本文将深入探讨Java中的两种重要容器类——`List`和`Set`,并分析它们之间的区别以及各自的适用场景。 #### 二、Java容器类List详解 **1. List接口简介** - `List`接口是`Collection`接口的一个子接口,主要特点...

    List Set Map以及子类的比较 .docx

    Collection 集合框架详解 Collection 集合框架是 Java 语言中最基础的集合类库,它提供了一些常用的数据结构和算法,使得开发者可以更加方便地进行数据存储和处理。Collection 集合框架的顶级接口是 Collection,...

    Java集合Collection、List、Set、Map使用详解.doc

    ArrayList 是一个常用的 List 实现类,它使用数组来存储元素。 1.4 Map Map 是一个接口,用于存储键值对。它提供了键值对的操作。 1.4.1 概述 Map 是一个无序的键值对集合,它的键是惟一的。 Map 中的键可以是...

    多用多学之Java中的Set,List,Map详解

    Java中的Set、List和Map是三个重要的集合框架接口,它们分别代表不同的数据结构,具有各自的特点和用途。 1. **List(列表)** List 是一个有序的集合,允许重复元素,可以按照索引访问。它主要有两个常用的实现类...

    java中List的用法和实例详解

    三、List实例详解 以下是一些关于List接口使用的基本示例: ```java import java.util.ArrayList; import java.util.List; public class ListExample { public static void main(String[] args) { // 创建一个...

    Java集合排序及java集合类详解(Collection、List、Map、Set).pdf

    Java集合排序及Java集合类详解 Java集合框架是Java语言中最重要、最常用的部分之一,它能够使开发者更方便地处理数据结构。Java集合框架主要包括Collection、List、Set、Map四个接口,它们分别实现了不同的数据结构...

    java list,set,map,数组间的相互转换详解

    List&lt;String&gt; list = new ArrayList(set); ``` 3. **数组转List** 可以使用`Arrays.asList()`方法将数组转换为List。例如,对于字符串数组: ```java String[] arr = {"Larry", "Moe", "Curly"}; List...

    ArrayList详解和使用示例_动力节点Java学院整理

    "ArrayList详解和使用示例" ArrayList是Java中的一种动态数组,相比于传统数组,它的容量可以动态增长。在本文中,我们将对ArrayList进行详细的介绍,并提供相关的使用示例代码。 ArrayList简介 ArrayList是一个...

Global site tag (gtag.js) - Google Analytics