集合
1.List:继承Collection接口,实现类有ArrayList LinkedList Vector ;有序,值可重复,可以存储空值;
①List遍历方法:
1 public static void main(String[] args) { 2 List<String> list = new ArrayList<String>(); 3 //插入数据 4 list.add(null);list.add("a");list.add("b");list.add("a"); 5 6 //遍历方法1 7 Iterator<String> iterator = list.iterator(); 8 while(iterator.hasNext()){ 9 System.out.print(iterator.next()+","); 10 } 11 12 System.out.println(); 13 14 //遍历方法2 15 /* 16 * listIterator()是List独有遍历方法,不仅可以从前往后遍历, 也可以逆向遍历。iterator()只能从前往后遍历; 17 * 有add set remove方法,也可以获得遍历的位置; 18 */ 19 ListIterator<String> listIterator = list.listIterator(); 20 //从前往后遍历 21 while(listIterator.hasNext()){ 22 System.out.print(listIterator.next()+","); 23 } 24 System.out.println(); 25 //从后往前遍历 26 while(listIterator.hasPrevious()){ 27 System.out.print(listIterator.previous()+","); 28 } 29 System.out.println(); 30 //add方法 31 listIterator.add("c"); 32 listIterator = list.listIterator(); 33 while(listIterator.hasNext()){ 34 System.out.print(listIterator.next()+","); 35 } 36 System.out.println(); 37 //remove方法,iterator也有remove方法 38 listIterator.remove(); 39 listIterator = list.listIterator(); 40 while(listIterator.hasNext()){ 41 System.out.print(listIterator.next()+","); 42 } 43 System.out.println(); 44 //set方法 45 listIterator.set("change"); 46 listIterator = list.listIterator(); 47 while(listIterator.hasNext()){ 48 System.out.print(listIterator.next()+","); 49 } 50 51 System.out.println(); 52 //遍历方法3 53 for(String str:list){ 54 System.out.print(str+","); 55 } 56 57 System.out.println(); 58 //遍历方法4 java8新特性 59 list.forEach(e->{ 60 System.out.print(e+","); 61 }); 62 63 }
List接口的实现类ArrayList LinkedList Vector都适用以上遍历方法。
②ArrayList LinkedList Vector之间的区别
ArrayList和LinkedList都是非同步的,线程不安全,当多线程时list改变会报错ConcurrentModificationException
1 public class ListSynchronizationTest { 2 3 public static void main(String[] args) { 4 List<String> list = new LinkedList<>(); 5 list.add("a"); 6 list.add("b"); 7 8 Thread thread1 = new Thread(new Runnable() { 9 public void run() { 10 itertor(list); 11 } 12 }); 13 thread1.start(); 14 15 Thread thread2 = new Thread(new Runnable() { 16 public void run() { 17 list.add("c"); 18 } 19 }); 20 thread2.start(); 21 } 22 23 public static void itertor(List<String> list){ 24 for(String str:list){ 25 System.out.print(str+","); 26 } 27 } 28 }
但是可以自己写同步方法Collections.synchronizedList(list);
ArrayList:非同步,实现了可变大小的数组(默认大小是10),ArrayList随机查询性能高(因为数组可以直接用索引查找),增加删除性能低(数组会移动,所以慢。但如果是一个数据的操作,反而LinkList性能不如ArrayList);
LinkList:非同步,链表式结构,对于增加删除性能高。
Vector:类似ArrayList,但是Vector是同步的,当遍历时改变集合,会抛出异常ConcurrentModificationException。当不考虑线程安全的情况时,ArrayList性能高。当当前集合的元素数量大于集合的长度时,Vector性能高,因为Vector增长是100%,ArrayList是50%;
Stack:继承于Vector;
Set: 实现了Collection接口。不可重复,无序;HashSet,TreeSet,EnumSet三个类实现了Set接口;
HashSet:无序,不可重复,非同步,可存储空值。
LinkedHashSet:继承HashSet,有序,可存储空值。
TreeSet:SortedSet接口的唯一实现,有序,不可重复,不能存储空值。
EnumSet:EnumSet是一个专门为枚举类设计的集合,内部以向量的方式存储,占用内存很少,运行效率很高,不能存储空值。
Map: 并不是继承Collection接口,是以键值对形式存储数据的。
HashTable:同步的,线程安全的。无序,key和value都不能是空,当自己定义的类作为key时,需要实现hashCode和equals方法。
HashMap:不是同步的,无序,空值可以作为key和value;
WeakHashMap:HashMap的改进,当key不被外部引用时可以被GC回收。
TreeMap:是实现的SortedMap接口,是有序的。空值不能作为key和value;