Java——集合

1、ArrayList 、LinkedList 、Vector

  • ArrayList:    底层数组实现;方法不同步,非线程安全;查询快、增删慢
  • LinkedList    底层双向链表实现;方法不同步,非线程安全;查询慢、增删快
  • Vector        底层数组实现;方法同步,线程安全;

    总结:需要线程同步使用Vector,经常查询使用ArrayList,经常插入删除使用LinkedList

     1 import java.util.ArrayList;
     2 import java.util.LinkedList;
     3 import java.util.List;
     4 import java.util.Vector;
     5 
     6 public class ListDemo {
     7 
     8     public static void main(String[] args) {
     9         // ArrayList非线程安全
    10         List<String> list1;
    11         list1 = new ArrayList<String>();
    12         list1.add("a");
    13         list1.add("b");
    14         list1.add("c");
    15         list1.remove(0);
    16         for (int i = 0; i < list1.size(); i++) {
    17             System.out.println(list1.get(i));
    18         }
    19         System.out.println("集合是否为空:" + list1.isEmpty());
    20 
    21         // Vector是线程安全的
    22         List<String> list2;
    23         list2 = new Vector<String>();
    24         list2.add("f");
    25         list2.add("g");
    26         list2.add("h");
    27         list2.remove(0);
    28         for (int i = 0; i < list2.size(); i++) {
    29             System.out.println(list2.get(i));
    30         }
    31         System.out.println("集合是否为空:" + list2.isEmpty());
    32 
    33         // LinkedList 线程不安全
    34         List<String> list3;
    35         list3 = new LinkedList<String>();
    36         list3.add("c");
    37         list3.add("v");
    38         list3.add("b");
    39         list3.remove(0);
    40         for (int i = 0; i < list3.size(); i++) {
    41             System.out.println(list3.get(i));
    42         }
    43         System.out.println("集合是否为空:" + list3.isEmpty());
    44     }
    45 
    46 }

2、Set 的HashSet和TreeSet

 1 import java.util.HashSet;
 2 import java.util.Set;
 3 import java.util.TreeSet;
 4 
 5 public class SetDemo {
 6 
 7     public static void main(String[] args) {
 8         // HashSet是无序、不重复
 9         Set<String> set1;
10         set1 = new HashSet<String>();
11         set1.add("a");
12         set1.add("b");
13         set1.add("c");
14         set1.add("a");// 重复了,不会放进去
15         System.out.println(set1);
16         System.out.println(set1.size());
17 
18         // TreeSet是有序、不重复
19         Set<String> set2;
20         set2 = new TreeSet<String>();
21         set2.add("a");
22         set2.add("b");
23         set2.add("c");
24         set2.add("a");// 重复了,不会放进去
25         System.out.println(set2);
26         System.out.println(set2.size());
27     }
28 }

3、Iterator

有三个方法:

hasNext()、next()、remove()

当对集合进行迭代操作时,不能使用集合的remove()方法

 1 import java.util.ArrayList;
 2 import java.util.Iterator;
 3 import java.util.List;
 4 
 5 public class IteratorDemo {
 6 
 7     public static void main(String[] args) {
 8         List<String> list = new ArrayList<String>();
 9         list.add("a");
10         list.add("b");
11         list.add("c");
12         list.add("d");
13         list.add("e");
14 
15         Iterator<String> iter = list.iterator();
16         while (iter.hasNext()) {
17             String str = iter.next();
18             if ("a".equals(str)) {
19                 iter.remove();//这里不可以用list.remove()
20             } else {
21                 System.out.println(str);
22             }
23         }
24     }
25 
26 }

4、hashcode和equal

  • 如果两个对象的hashcode值不相等——>必定是两个不同的对象

  • 如果两个对象的hashcode值相等,是同一个对象,但是内容可能相同,也不能不同,就还要进行equals()判断,如果为true 表示两个对象相同,如果为false 则表示是两个不同对象

当使用hashmap时,首先调用加入对象的hashCode方法得到hashCode值,判断已经存在的对象的hashCode值是否与加入对象的HashCode值相等,如果不相等,说明是不同的对象,直接加进去,如果hashcode值相等,再进行equals判断,如果为true ,说明对象已经加进去,就不会在增加新的对象,如果为false 则直接加进去。

String类已经重写了Object类的hashcode()和equals(),所以两个不同的字符串对象,内容相同,那么hashcode值就相同

5、Map

 1 import java.util.Collection;
 2 import java.util.HashMap;
 3 import java.util.Iterator;
 4 import java.util.Map;
 5 import java.util.Set;
 6 
 7 public class MapDemo {
 8 
 9     public static void main(String[] args) {
10         Map<String, String> map = new HashMap<>();
11         // put()添加
12         map.put("key1", "value1");
13         map.put("key2", "value2");
14         map.put("key3", "value3");
15 
16         System.out.println(map.get("key1"));// get()方法取值
17 
18         System.out.println("key1是否存在:" + map.containsKey("key1"));
19         System.out.println("value1是否存在:" + map.containsValue("value1"));
20 
21         Set<String> set = map.keySet();// 把key保存在一个set集合中
22         // 便利set集合
23         Iterator<String> iter1 = set.iterator();
24         while (iter1.hasNext()) {
25             System.out.println(iter1.next());
26         }
27 
28         Collection<String> set2 = map.values();// 把value保存在一个Collection集合中
29         // 便利set集合
30         Iterator<String> iter2 = set2.iterator();
31         while (iter2.hasNext()) {
32             System.out.println(iter2.next());
33         }
34     }
35 }
View Code

6、HashMap、LinkedHashMap、CurrentHashMap

  • HashMap   基于hash算法的Map接口的非同步实现,非线程安全;通过put(key ,value)和get(key)存取对象,put时,对key的hashcode值进行hash计算(可以理解为得到一个index)得到这个元素在数组中的位置,并将元素存储到该位置上,get时,通过对key的hashcode值的hash计算得到在数组中的位置,然后将该位置的元素取出。HashMap是无序的,内部维护的是单链表

  • LinkedHashMap   底层使用哈希表与双向链表保存元素,非线程安全,LinkedHashMap是有序的,有插入顺序和访问顺序,内部维护的是一个双向链表

  • CurrentHashMap   基于双数组和链表的Map接口的同步实现,线程安全

    HashMap是非线程安全的,当只有一个线程使用HashMap时没有问题,如果涉及到多个线程,就不能使用HashMap了,这时可以使用currentHashMap

7、HashMap和HashTable

    • HashMap    方法是非同步的,非线程安全;基于AbstractMap类,而AbstractMap类是Map接口的实现;key value都可以为null
    • HashTable    方法同步,线程安全,基于Dictionary类,key value都不能为null
原文地址:https://www.cnblogs.com/gucl/p/8030482.html