集合
- Collection接口:List、Set、Queue接口
List接口的类中的元素是有序的,可重复的,允许多个null值。
List的已知实现类:ArrayList,LinkedList,vector
Set接口的类中的set方法存储一组无序的,不重复对象,可以存一个null。 Set的已知实现类:TreeSet、HashSet
- Map接口:
HashMap (父:AbstractMap)–> LinkedHashMap
TreeMap (父:AbstractMap)
ConcurrentMap
Hashtable(父:Dictionary)–> Propertice
- ArrayList,LinkedList,vector的区别
相同点:
ArrayList,LinkedList,vector都实现了List接口,都存储的是有序且可重复的元素
不同点:
1)ArrayList,vector底层都是用数组实现的List接口,查询速度快,增删速度慢。
LinkedList底层是用双向链表实现的,增删速度快,查询慢。2)ArrayList的默认大小为0,当它第一次调用add()时,判断数组的默认大小为0则赋给它10,默认大小就为10.是以1.5倍的方式进行扩容的。
Vector是以2倍的方式扩容。 LinkedList是双向链表,不需要进行扩容。
3)ArrayList,LinkedList是非线程安全的,Vector是线程安全的
- HashMap和Hashtable的区别:
相同点:
HashMap和Hashtable都用于存放键值对,都实现了Map接口,HashMap和Hashtable的Key都是唯一的
不同点:
1)HashMap的父类是AbstractMap类,在java1.8前HashMap的底层是由数组+链表组成的,java1.8之后由数组+链表+红黑树组成的;当数组的长度>64且链表的阈值>> 8时,由链表转换成红黑树,当数组的长度>64且红黑树<6时,由红黑树转换成链表。
Hashtable的父类是Dictionary类,底层是由数组+链表组成的2)HashMap支持键和值都可以为null,Hashtable不支持即键和值都不能为null。
3)HashMap的初始容量为16,以2倍的方式进行扩容。 Hashtable的初始容量为11,以2倍+1的方式进行扩容。
4)HashMap是非线程安全的,Hashtable是线程安全的,在方法上使用了Synchronized关键字修饰;
- Map的3种迭代
迭代也叫遍历,是指将集合或数组中所有的元素一一访问一遍。
1) Keyset迭代
Map map=new HashMap();
map.put("m1",1);
map.put("m2",2);
Set set=map.KeySet();
for (Object obj: set) {
Object key=obj;
Object value=map.get(key);
}
- 2)EntrySet 迭代(只能用于map)
Map map=new HashMap();
map.put("1",2);
Set entry=map.entrySet();
for (Object obj:entry) {
Map.Entry e=(Map.Entry)obj;
Object key=e.getKey();
Object value=e.getValue();
}
- 3) Iterator 迭代器迭代
Map map=new HashMap();
map.put("m1",1);
map.put("m2",2);
Iterator iterator=keySet.iterator();
// iterator.hasNext()表示是否还有未迭代完的元素
while (iterator.hasNext()){
// iterator.next()表示从集合中迭代出一个集合元素
Object key=iterator.next();
Object value=map.get(key);
}