list与Set、Map区别 ArrayList与LinkedList的区别

您所在的位置:网站首页 arraylist和linkedlist有哪些区别 list与Set、Map区别 ArrayList与LinkedList的区别

list与Set、Map区别 ArrayList与LinkedList的区别

2023-07-13 20:00| 来源: 网络整理| 查看: 265

5.线程安全集合类与非线程安全集合类 

LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;

StringBuilder是非线程安全的,StringBuffer是线程安全的。

ArrayList与LinkedList的区别 ArrayList和LinkedList的大致区别如下: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。  2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。  3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

首先一点关键的是,ArrayList的内部实现是基于基础的对象数组的,因此,它使用get方法访问列表中的任意一个元素时(random access),它的速度要比LinkedList快。LinkedList中的get方法是按照顺序从列表的一端开始检查,直到另外一端。对LinkedList而言,访问列表中的某个指定元素没有更快的方法了。 假设我们有一个很大的列表,它里面的元素已经排好序了,这个列表可能是ArrayList类型的也可能是LinkedList类型的,现在我们对这个列表来进行二分查找(binary search),比较列表是ArrayList和LinkedList时的查询速度,看下面的程序: 

public static final int N = 50000;

public static List values;

static {

Integer vals[] = new Integer[N];

Random r = new Random();

for (int i = 0, currval = 0; i < N; i++) {

vals[i] = new Integer(currval);

currval += r.nextInt(100) + 1;

}

values = Arrays.asList(vals);

}

static long timeList(List lst) {

long start = System.currentTimeMillis();

for (int i = 0; i < N; i++) {

int index = Collections.binarySearch(lst, values.get(i));

if (index != i)

System.out.println("***错误***");

}

return System.currentTimeMillis() - start;

}

public static void main(String args[]) {

System.out.println("ArrayList消耗时间:" + timeList(new ArrayList(values)));

System.out.println("LinkedList消耗时间:" + timeList(new LinkedList(values)));

}

ArrayList消耗时间:16

LinkedList消耗时间:5875

这个结果不是固定的,但是基本上ArrayList的时间要明显小于LinkedList的时间。因此在这种情况下不宜用LinkedList。二分查找法使用的随机访问(random access)策略,而LinkedList是不支持快速的随机访问的。对一个LinkedList做随机访问所消耗的时间与这个list的大小是成比例的。而相应的,在ArrayList中进行随机访问所消耗的时间是固定的。  这是否表明ArrayList总是比LinkedList性能要好呢?这并不一定,在某些情况下LinkedList的表现要优于ArrayList,有些算法在LinkedList中实现时效率更高。比方说,利用Collections.reverse方法对列表进行反转时,其性能就要好些。  看这样一个例子,加入我们有一个列表,要对其进行大量的插入和删除操作,在这种情况下LinkedList就是一个较好的选择。请看如下一个极端的例子,我们重复的在一个列表的开端插入一个元素:  static long timeAddList(List list) { long start = System.currentTimeMillis(); Object o = new Object(); for (int i = 0; i < N; i++) list.add(0, o); return System.currentTimeMillis() - start; } public static void main(String[] args) { System.out.println("ArrayList耗时:" + timeAddList(new ArrayList())); System.out.println("LinkedList耗时:" + timeAddList(new LinkedList())); } ArrayList耗时:190 LinkedList耗时:12

这和前面一个例子的结果截然相反,当一个元素被加到ArrayList的最开端时,所有已经存在的元素都会后移,这就意味着数据移动和复制上的开销。相反的,将一个元素加到LinkedList的最开端只是简单的未这个元素分配一个记录,然后调整两个连接。在LinkedList的开端增加一个元素的开销是固定的,而在ArrayList的开端增加一个元素的开销是与ArrayList的大小成比例的。

ArrayList与Vector的区别

ArrayList和Vector都是用数组实现的,主要有这么四个区别:

1.Vector是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果。而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;

 

2.两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同。

 

3.Vector可以设置增长因子,而ArrayList不可以。

4.Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。

适用场景分析:

1.Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArrayList效率比较高。2.如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。

            HashMap 与TreeMap、HashTable的区别

HashMap 非线程安全  

HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。 

 

TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。 

适用场景分析:

HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。

HashMap:适用于Map中插入、删除和定位元素。 

Treemap:适用于按自然顺序或自定义顺序遍历键(key)。 

        HashMap 与HashSet的区别

 

*HashMap**HashSet*HashMap实现了Map接口HashSet实现了Set接口HashMap储存键值对HashSet仅仅存储对象使用put()方法将元素放入map中使用add()方法将元素放入set中HashMap中使用键对象来计算hashcode值HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回falseHashMap比较快,因为是使用唯一的键来获取对象HashSet较HashMap来说比较慢



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3