Java ArrayList和HashMap的区别
ArrayList 是集合框架的一部分,存在于java.util包中。它为我们提供了Java中的动态数组。虽然它可能比标准数组慢,但在需要对数组进行大量操作的程序中是很有帮助的。 HashMap 是Java 1.2以来集合的一部分。它提供了Java的Map接口的基本实现。它以(Key, Value)对的形式存储数据,为了访问一个值,人们必须知道它的键。HashMap之所以被称为HashMap,是因为它使用了一种叫做Hashing的技术。
散列是一种将大的字符串转换为代表同一字符串的小字符串的技术。一个较短的值有助于索引和快速搜索。HashSet也在内部使用HashMap。它在内部使用一个链接列表来存储键值对,在HashSet中已经有详细的解释和进一步的文章。
在这里,我们将继续讨论它们之间共享的共同特征。然后,我们将通过在一个Java程序中对它们进行一系列的操作,来讨论它们之间的差异,并感知输出的差异。
首先,让我们讨论 Java中ArrayList和HashMap的相似之处
- ArrayList和HashMap,都是不同步的。所以为了在多线程环境中使用它们,首先需要同步化。
- ArrayList和HashMap都允许空值。ArrayList允许空值,HashMap允许空键和值。
- ArrayList和HashMap都允许重复,ArrayList允许重复的元素,而HashMap允许重复的值
- ArrayList和HashMap都可以通过Java中的Iterator进行遍历。
- 这两个地方都使用数组,ArrayList是由数组支持的,而HashMap内部也是由数组实现的。
- 两者都使用 _ get()方法_ ,ArrayList.get()方法基于索引工作,而HashMap.get()方法需要一个对象类型的参数key_element,指的是要获取其相关值的键,所以两者都提供了恒定的时间性能。
到目前为止,我们从上面提供的媒体中得到了一些明确的信息,现在我们将对它们进行一系列的操作,以便通过总结同一操作的输出差异来感知真正的差异,这增加了我们理解ArrayList和HashMap之间差异的智力。
- 语法旁边的层次结构
- 插入顺序的维护
- 内存消耗
- 重复元素的处理
- 获取元素的便利性
- 空元素的存储
Java中ArrayList和HashMap的区别
1. 语法上的层次性
实现的接口: ArrayList实现了List接口,而HashMap是Map接口的实现。
语法: ArrayList类的声明
public class ArrayList
extends AbstractList
implements List, RandomAccess, Cloneable, Serializable
语法: HashMap类的声明
public class HashMap
extends AbstractMap
implements Map, Cloneable, Serializable
2.插入顺序的维护
ArrayList维护插入顺序,而HashMap不维护插入顺序,这意味着ArrayList以相同的顺序返回列表项,而HashMap不维护任何顺序,因此返回的键值对任何种类的顺序。
例子
// Java Program to illustrate Maintenance of Insertion Order
// in ArrayList vs HashMap
// Importing all utility classes
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Creating ArrayList of string type
ArrayList<String> list = new ArrayList<String>();
// Adding object in ArrayList
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// Invoking ArrayList object
System.out.println("ArrayList: " + list);
// Creating HashMap
HashMap<Integer, String> hm
= new HashMap<Integer, String>();
// Adding object in HashMap object created above
// using put() method
hm.put(1, "A");
hm.put(2, "B");
hm.put(3, "C");
hm.put(4, "D");
// Invoking HashMap object
// It might or might not display elements
// in the insertion order
System.out.print("Hash
Map: " + hm);
}
}
输出
ArrayList: [A, B, C, D]
HashMap: {1=A, 2=B, 3=C, 4=D}
3.内存消耗
ArrayList只将元素存储为值,并在内部维护每个元素的索引。而HashMap用键和值对来存储元素,也就是两个对象。所以相对来说,HashMap需要更多的内存。
语法: ArrayList
list.add("A");
// String value is stored in ArrayList
语法: HashMap
hm.put(1, "A");
// Two String values stored
// as the key value pair in HashMap
4.重复元素的处理
ArrayList允许重复的元素,而HashMap不允许重复的键,但允许重复的值。
例子
// Java Program to Illustrate Duplicate Elements Insertion
// in ArrayList vs HashMap
// Importing utility classes
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Creating ArrayList of string type
ArrayList<String> list = new ArrayList<String>();
// Adding object in ArrayList
list.add("A");
list.add("B");
// Add duplicates
list.add("A");
list.add("A");
// Invoking ArrayList object
System.out.println("ArrayList: " + list);
// Creating HashMap
HashMap<Integer, String> hm
= new HashMap<Integer, String>();
// Adding object in HashMap
hm.put(1, "A");
hm.put(2, "B");
// Add duplicates key
// Change value if index exist
hm.put(3, "A");
hm.put(3, "A");
// Add duplicates values
// allow duplicates value
hm.put(4, "A");
hm.put(5, "A");
// Invoking HashMap object
System.out.print("HashMap: " + hm);
}
}
输出
ArrayList: [A, B, A, A]
HashMap: {1=A, 2=B, 3=A, 4=A, 5=A}
5.取出一个元素的方便性
在ArrayList中,一个元素可以通过指定它的索引来轻松获取。但是在HashMap中,元素是通过其相应的键来获取的。这意味着必须始终记住键。
注意: ArrayList get(index)方法总是给出O(1)的时间复杂度,而HashMap get(key)在最好的情况下是O(1),在最坏的情况下是O(n)的时间复杂度。
例子
// Java Program to Illustrate Ease of fetching an Element
// in ArrayList vs HashMap
// Importing all utility classes
import java.util.*;
// Main class
class GFG {
// main driver method
public static void main(String args[])
{
// Creating ArrayList of string type
ArrayList<String> list = new ArrayList<String>();
// Adding object in ArrayList
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// Invoking ArrayList object
System.out.println("First Element of ArrayList: "
+ list.get(0));
System.out.println("Third Element of ArrayList: "
+ list.get(2));
// Creating HashMap
// Declaring object of integer and string type
HashMap<Integer, String> hm
= new HashMap<Integer, String>();
// Adding object in HashMap
hm.put(1, "A");
hm.put(2, "B");
hm.put(3, "C");
hm.put(4, "D");
// Invoking HashMap object
System.out.println("HashMap value at Key 1: "
+ hm.get(1));
System.out.println("HashMap value at Key 3: "
+ hm.get(3));
}
}
输出
First Element of ArrayList: A
Third Element of ArrayList: C
HashMap value at Key 1: A
HashMap value at Key 3: C
6.空元素的存储
在ArrayList中,任何数量的空元素都可以被存储。而在HashMap中,只允许一个空键,但值可以是任何数量。
例子
// Java Program to Illustrate Null Element Storage in
// Arraylist vs HashMap
// Importing all utility classes
import java.util.*;
// Main class
class GFG {
// main driver method
public static void main(String args[])
{
// Creating ArrayList of string type
ArrayList<String> list = new ArrayList<String>();
// Adding object in ArrayList
// using standard add() method
list.add("A");
// Adding first null value
list.add(null);
list.add("C");
// Adding two null value again
list.add(null);
list.add(null);
// Invoking ArrayList object
System.out.println("ArrayList: " + list);
// Creating HashMap
// Declaring object of integer and string type
HashMap<Integer, String> hm
= new HashMap<Integer, String>();
// Adding object in HashMap
hm.put(1, "A");
hm.put(2, "B");
// add null key
hm.put(null, "C");
// Again adding null key
// which replace value of first
// insert null key value
hm.put(null, null);
// Adding second null value
hm.put(3, null);
// Printing the elements of Hashmap
System.out.println("HashMap: " + hm);
}
}
输出
ArrayList: [A, null, C, null, null]
HashMap: {null=null, 1=A, 2=B, 3=null}
所以,让我们弄清楚 ArrayList和HashMap 在表格中的 区别 。
ArrayList | HashMap |
---|---|
java ArrayList实现了List接口 | java HashMap实现了Map接口 |
ArrayList总是保持元素的插入顺序 | HashMap不保持插入的顺序。 |
ArrayList只存储值或元素 | HashMap存储键和值对 |
ArrayList可以包含重复的元素 | HashMap不包含重复的键,但包含重复的值。 |
我们可以在ArrayList中拥有任意数量的空元素 | 在HashMap中我们只能有一个空键和任意数量的空值 |
ArrayList get()方法总是给出一个O(1)的性能 | HashMap get()方法在最好的情况下可以是O(1),在最坏的情况下是O(n) |