其他分享
首页 > 其他分享> > ArrayList,LinkedLIst,HashMap

ArrayList,LinkedLIst,HashMap

作者:互联网

一、概述

ArrayList:数组集合。与数组不同,数组一旦创建,长度固定,但是ArrayList的长度是动态的,不受限制,可以存储任意多的对象,但是只能存储对象。

     查询、修改、新增(新增的位置在尾部)快,删除、新增(新怎的位置在中间)慢。适用于查询、修改较多的场景。

LinkedList:双向链表集合。元素有序且可以重复。

     查询、修改(需要遍历集合),新增‘删除(只需要修改前后节点的链接)快,适用于新增、删除较多的场景。

HashMap:结合数组和链表的优势,期望做到增删改查都快速,时间复杂度接近于O(1)。当哈希算法较好时,Hash冲突较低。适用于增删改查所有场景。

二、分述

ArrayList

贴一个简单的案例:

 1 import java.util.ArrayList;
 2 public class TestArrayList {
 3     public static void main(String[] args) {
 4         // Create a list to store cities
 5         ArrayList<String> cityList = new ArrayList<String>();
 6         
 7         // Add some cities in the list
 8         cityList.add("London");
 9         // cityList now contains [London]
10         
11         cityList.add("Denver");
12         // cityList now contains [London, Denver]
13         
14         cityList.add("Paris");
15         // cityList now contains [London, Denver, Paris]
16         
17         cityList.add("Miami");
18         // cityList now contains [London, Denver, Paris, Miami]
19         
20         cityList.add("Seoul");
21         // Contains [London, Denver, Paris, Miami, Seoul]
22         
23         cityList.add("Tokyo");
24         // Contains [London, Denver, Paris, Miami, Seoul, Tokyo]
25 
26         System.out.println("List size? " + cityList.size());  // 6
27         System.out.println("Is Miami in the list? " + cityList.contains("Miami"));  // true
28         System.out.println("The location of Denver in the list? " + cityList.indexOf("Denver")); // 1 返回索引,如果不在list中,返回-1
29         System.out.println("Is the list empty? " + cityList.isEmpty()); // Print false
30 
31         // Insert a new city at index 2
32         cityList.add(2, "Xian");
33         // Contains [London, Denver, Xian, Paris, Miami, Seoul, Tokyo]
34 
35         // Remove a city from the list
36         cityList.remove("Miami");
37         // Contains [London, Denver, Xian, Paris, Seoul, Tokyo]
38 
39         // Remove a city at index 1
40         cityList.remove(1);
41         // Contains [London, Xian, Paris, Seoul, Tokyo]
42 
43         // Display the contents in the list
44         System.out.println(cityList.toString());
45 
46         // Display the contents in the list in reverse order
47         for (int i = cityList.size() - 1; i >= 0; i--)
48             System.out.print(cityList.get(i) + " ");
49         System.out.println();
50 
51         // Create a list to store two circles
52         ArrayList<CircleFromSimpleGeometricObject> list = new ArrayList<CircleFromSimpleGeometricObject>();
53 
54         // Add two circles
55         list.add(new CircleFromSimpleGeometricObject(2));
56         list.add(new CircleFromSimpleGeometricObject(3));
57 
58         // Display the area of the first circle in the list
59         System.out.println("The area of the circle? " + list.get(0).getArea());
60     }
61 }

 

LinkedList

LinkedList中的属性:

1 //链表的节点个数
2 transient int size = 0;
3 //指向头节点的指针
4 transient Node<E> first;
5 //指向尾节点的指针
6 transient Node<E> last;

Node节点结构

 1 private static class Node<E> {
 2  E item;
 3  Node<E> next;
 4  Node<E> prev;
 5  Node(Node<E> prev, E element, Node<E> next) {
 6  this.item = element;
 7  this.next = next;
 8  this.prev = prev;
 9  }
10 }

HashMap

 1 //生成hash码的函数
 2 final int hash(Object k) {
 3   int h = hashSeed;
 4   //key是String类型的就使用另外的哈希算法
 5   if (0 != h && k instanceof String) {
 6       return sun.misc.Hashing.stringHash32((String) k);
 7   }
 8   h ^= k.hashCode();
 9   //扰动函数
10   h ^= (h >>> 20) ^ (h >>> 12);
11   return h ^ (h >>> 7) ^ (h >>> 4);
12 }

而还有与HashMap相似但又很容易混淆的HashTable和ConcurrentHasgMap在我的另一篇博客中有介绍到。

三、总结

  概述中已经描述各个集合的适用场景,这里重点说一下HashMap。HashMap可以通过hash值快速定位到数组下标,执行新增、修改、删除操作。当hash算法较好(hash冲突较少)时,增删改查的时间复杂度都是O(1)。但是如果链表较长,则会增加增删改查的时间复杂度O(链表长度)。原则就是尽量减少hash冲突,并预先估算hashmap长度,减少扩容操作。

标签:LinkedLIst,ArrayList,list,Denver,链表,数组,HashMap,cityList
来源: https://www.cnblogs.com/wudidamowang666/p/11353488.html