在Java中ArrayList、LinkedList、HashMap的区别是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Java中ArrayList、LinkedList、HashMap的区别是啥相关的知识,希望对你有一定的参考价值。

参考技术A Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
LinkedList类
  LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
  注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
    List
list
=
Collections.synchronizedList(new
LinkedList(...));
ArrayList类
  ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
  和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
HashMap类
  HashMap继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
总结
  如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。

警告在 Java 中克隆 ArrayList

【中文标题】警告在 Java 中克隆 ArrayList【英文标题】:Warning cloning ArrayList in Java 【发布时间】:2013-12-07 11:37:30 【问题描述】:
public void addProductList(ArrayList<ViewOrderProduct> globalOrderProductList) 

    this.productOrderList =  (ArrayList<ViewOrderProduct>)globalOrderProductList.clone();

这给了我警告:

类型安全:从 Object 到 ArrayList 的未经检查的强制转换

我知道我可以简单地添加@SuppressWarnings("unchecked")来解决问题。

但我想了解问题所在。如果我添加了 suppressWarnings,我可以确定一切顺利?此警告是否有其他解决方案?

【问题讨论】:

这只是对您的警告,因为他无法在运行时验证您的克隆列表中只有 ViewOrderProduct 对象。 你真的不想使用clone方法... @ThomasJungblut 不,clone() 返回一个Object,因此警告是正确的,与类型擦除等无关。 @Neet 你最好重新阅读Unchecked cast 的定义;) clone 方法和克隆/复制相关:***.com/q/2326758/1065197、***.com/q/2156120/1065197。现在,您的问题与警告有关:***.com/q/9499908/1065197 【参考方案1】:

clone() 默认返回Object,克隆ArrayList 的正确方法是使用适当的构造函数:

this.productOrderList =  new ArrayList<ViewOrderProduct>(globalOrderProductList);

编辑:首选方法是使用适当的构造函数,而且这两种方法都只返回一个浅拷贝。

编辑:我知道没有其他方法可以使用 clone() 删除警告而不使用 SuppressWarning

【讨论】:

这会给你一个浅拷贝,而不是一个深度拷贝。当然,这取决于 OP 的需求。 @LuiggiMendoza clone() on ArrayList 也返回浅拷贝。 请参阅我在 OP 的问题中发布的关于clone 方法用法的链接。 @LuiggiMendoza 好吧,OP 应该跳过整个克隆的事情。无论如何,使用 ctor 是首选方式。 简而言之,是的。但问题本身是关于使用@SuppressWarnings("unchecked")【参考方案2】:

arraylist 是 Object[] 的封装,里面的任何东西都存储为 Object,不管用什么构造函数,结果都是一样的。

如上所述,为避免警告您应该使用构造函数 public ArrayList(Collection c)

例如 new ArrayList(globalOrderProductList);

这将返回没有警告的内容副本。

【讨论】:

以上是关于在Java中ArrayList、LinkedList、HashMap的区别是啥的主要内容,如果未能解决你的问题,请参考以下文章

java LinkedLis t的26种使用方法

Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

ArrayList和LinkedList

如何快速从 List 中查找一条数据

集合系列—HashMap源码分析

增强for循环