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 }
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