java.util.Collection集合接口,其中list,set继承collection,map没有继承接口
Iterator接口:遍历集合和map
* (1)使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
* 注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
*
* (2) 使用next()获得序列中的下一个元素。
*
* (3) 使用hasNext()检查序列中是否还有元素。
*
* (4) 使用remove()将迭代器新返回的元素删除。 ListIterator只能迭代list,增加了add,set等方法
List:有序,可以重复,允许为空的列表
add():添加元素
get():取出元素
addAll(Object obj):添加集合对象中的所有元素
实现类:
ArrayList:底层以数组为基本结构,所以查找元素很快,但插入,删除元素很慢
LinkedList:底层以双向链表为基本结构,所以插入,删除元素很快,但查找元素很慢
set:无序,不可以重复,允许有一个null
add():添加元素
没有get()方法,不能取出单独的元素
addAll(Object obj):添加集合对象中的所有元素
实现类:
HashSet():add()底层利用了hashmap的put()方法,所以每次用hashcode与equal()方法判断值是否重复,如果重复则返回false
底层代码:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
TreeSet():因为set集合是无序的,所以在iterator迭代的时候,不能正元素的顺序,所以出现了TreeSet();可以默认排序,也可以通现java.util.Comparator<Type>接口来自定义排序方式。
(set可以有序吗,利用treeSet()实现类)
LinkHashSet():跟hashset很相似,继承了父类hashset,但是可以维护顺序
map:键值对形式,键不能为重复,值可以重复;hashmap允许键值为null,但hashtable不允许为键值为null(底层利用散列算法查找,所以在集合中查找元素最快)
put():添加元素;
get():取出元素;
keyValue():取出所有的键;
Value():取出所有的值;
实现类:hashmap():hashmap可以接收空值,HashMap是非synchronized(同步)的,意味着是线程非安全的,多个线程不能共享hashmap
hashtable():hashtable不能接收null值(键值都不为空),hashtable是同步的,意味着是线程安全的,多个线程能共享hashtable
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。
* 所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,
* 但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,
* 要看JVM。这条同样也是Enumeration和Iterator的区别。
总结:由于hashtable是线程安全的,所以在单线程下它比hashmap慢,如果不需要同步,只是单一线程,那么使用hashmap性能要好些
如何让hashmap同步:Map m = Collections.synchronizeMap(hashMap);