Java中的HashMap和ArrayList之间的区别?
在Java中, ArrayList
和HashMap
被用作集合。 但我不明白在哪种情况下我们应该使用ArrayList
和哪些时间使用HashMap
。 他们之间的主要区别是什么?
你正在问关于ArrayList和HashMap的具体问题,但是我想完全理解你正在理解的是什么。 所以一个ArrayList实现了List接口,而一个HashMap实现了Map接口。 所以真正的问题是什么时候你想使用一个列表,什么时候你想使用一个地图。 这是Java API文档帮助很大的地方。
列表:
有序集合(也称为序列)。 这个接口的用户可以精确地控制每个元素插入到列表中的哪个位置。 用户可以通过整数索引(列表中的位置)来访问元素,并search列表中的元素。
地图:
将键映射到值的对象。 地图不能包含重复的键; 每个键可以映射到最多一个值。
正如其他答案所讨论的那样,列表接口(ArrayList)是使用索引访问的对象的有序集合,非常类似于数组(就ArrayList而言,顾名思义,它只是一个数组背景,但是很多处理数组的细节都是为你处理的)。 当你想保持sorting的顺序时,你可以使用一个ArrayList(添加顺序,或者添加对象时指定的列表中的位置)。
另一方面,地图占用一个对象,并将其用作另一个对象(值)的键(索引)。 所以,假设你有一些具有唯一ID的对象,并且你知道在某个时候你想通过ID来访问这些对象,那么Map会使你很容易(而且更快/更有效率)。 HashMap实现使用密钥对象的散列值来定位它的存储位置,因此不再需要保证值的顺序。 然而,在Java API中还有其他的类可以提供这个类,例如LinkedHashMap,它也使用散列表来存储键/值对,还按照它们被添加的顺序维护一个List(LinkedList)所以您可以随时按照添加的顺序再次访问这些项目(如果需要)。
如果使用ArrayList
,则必须使用索引( int
types)访问元素。 使用HashMap
,您可以通过另一种types的索引(例如,一个String
)来访问它们,
HashMap<String, Book> books = new HashMap<String, Book>(); // String is the type of the index (the key) // and Book is the type of the elements (the values) // Like with an arraylist: ArrayList<Book> books = ...; // Now you have to store the elements with a string key: books.put("Harry Potter III", new Book("JK Rownling", 456, "Harry Potter")); // Now you can access the elements by using a String index Book book = books.get("Harry Potter III");
用ArrayList
这是不可能的(或者更困难)。 访问ArrayList
元素的唯一好方法是通过索引号获取元素。
所以,这意味着使用HashMap
你可以使用你想要的每种types的键。
另一个有用的例子是在一个游戏中:你有一组图像,你想要翻转它们。 所以,你写一个图像翻转的方法,然后存储翻转的结果:
HashMap<BufferedImage, BufferedImage> flipped = new HashMap<BufferedImage, BufferedImage>(); BufferedImage player = ...; // On this image the player walks to the left. BufferedImage flippedPlayer = flip(player); // On this image the player walks to the right. flipped.put(player, flippedPlayer); // Now you can access the flipped instance by doing this: flipped.get(player);
你翻了一下球员,然后储存起来。 您可以使用BufferedImage
作为HashMap
的键入types来访问BufferedImage
。
我希望你能理解我的第二个例子。
不是一个真正的Java特定的问题。 看来你需要在数据结构上有一个“引子”。 尝试使用Googlesearch“您应该使用哪种数据结构”
试试这个链接http://www.devx.com/tips/Tip/14639
从链接:
以下是将最常用的数据结构与特定需求进行匹配的一些技巧。
- 何时使用Hashtable?
如果要以键值对的forms访问存储的数据,散列表或类似的数据结构是很好的候选。 例如,如果你正在提取一个雇员的名字,结果可以作为(姓名,价值)对以散列表的forms返回。 但是,如果要返回多个员工的姓名,则直接返回散列表不是一个好主意。 请记住,密钥必须是唯一的,否则之前的值将被覆盖。
- 何时使用列表或向量?
当你需要顺序甚至随机访问时,这是一个很好的select。 而且,如果数据大小最初是未知的,并且/或者将要dynamic增长,则使用列表或向量将是适当的。 例如,要存储JDBC ResultSet的结果,可以使用java.util.LinkedList。 而如果你正在寻找一个可resize的数组,使用java.util.ArrayList类。
- 何时使用arrays?
永远不要低估arrays。 大多数情况下,当我们必须使用对象列表时,我们倾向于考虑使用向量或列表。 但是,如果集合的大小已经知道并且不会改变,则可以将数组视为潜在的数据结构。 访问数组元素比vector或列表更快。 这很明显,因为你需要的只是一个索引。 没有额外的get方法调用的开销。
4.Combinations
有时,最好使用上述方法的组合。 例如,您可以使用哈希表列表来满足特定的需求。
- 设置类
而从JDK 1.2开始,你也可以设置java.util.TreeSet这样的类,这对于没有重复的sorting集是很有用的。 关于这些类的最好的事情之一是他们都遵守一定的接口,所以你不必担心具体情况。 例如,看看下面的代码。
// ... List list = new ArrayList(); list.add(
使用一个有序的值集合的列表。 例如,您可能有一个要处理的文件列表。
使用映射(通常是无序)从键到值的映射。 例如,您可能有一个从用户标识到该用户的详细信息的地图,因此您可以高效地查找仅提供该标识的详细信息。 (你可以通过存储一个键列表和一个值列表来实现Map
接口,但是通常会有一个更高效的实现 – 例如, HashMap
在内部使用一个哈希表来获得分期的O(1)键查找。 )
地图vs列表。
在地图中,您有键/值对。 要访问一个值,你需要知道密钥。 关键和价值之间存在着一种持续的关系,而不是任意的。 他们有某种关系。 例如:一个人的DNA是唯一的(关键)和一个人的名字(价值)或一个人的SSN(关键)和一个人的名字(价值)有很强的关系。
在列表中,你所拥有的只是值(一个人的名字),要访问它,你需要知道它在列表(索引)中的位置来访问它。 但是名单中的价值的位置与其指数之间没有永久的关系,这是任意的。