④Set的三个实现类HashSet、TreeSet和EnumSet都是线程不安全的,要手动保证Set集合的同步性,通常可用Collection工具类的synchronizedSortSet方法来“包装”该Set集合,最好在创建时使用:SortedSet s=Collections.synchronizedSortedSet(new TreeSet(...));。
23、ArrayList和Vector都是基于数组是实现的List类,所以ArrayList和Vector类都封装了一个动态再分配的Object[]数组,每个ArrayList或Vector都有一个capacity属性,这个capacity表示它们所封装的Object[]数组的长度,当向它们添加元素时,它们的capacity会自动增加。如果不指定capacity,则该属性默认为10。
24、ArrayList是线程不安全的,但是Vector是线程安全的,因而Vector的性能比ArrayList性能低。
25、Vector提供了一个Stack子类,其方法:
Object peek()返回“栈”的第一个元素,但是并不将该元素“pop”出栈。
Object pop():返回“栈”中的第一个元素,并将钙元素“pop”出栈。
void push(Object item):将一个元素“push”进栈,最后一个进“栈”的元素总是位于“栈”顶。
26、Arrays,固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。
27、Queue用于模拟队列这种数据结构,方法如下:
void add(Object e):将指定元素加入此队列的尾部;
Object element():获取队列头部的元素,但是不删除该元素;
boolean offer(Object e):将指定元素加入次队列的尾部,当使用有容量限制的队列时,此方法通常比add(Object e)方法更好;
Object peek():获取队列头部的元素,但是不删除元素,如果此队列为空,则返回null;
Object poll():获取队列头部的元素,并删除该元素,如果此队列为空,则返回null;
Object remove():获取队列头部的元素,并删除该元素。
28、Queue有两个实现类:LinkedList和PriorityQueue。
LinkedList代表一个双向队列,功能强大。
PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按杜一列元素的大小进行重新排序。因此当调用peek方法或者poll方法来取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。
PriorityQueue不允许插入null值。
29、Map中key和value可以是任何引用类型的数据。Map中的key不可重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。
30、Map中有一个keySet()方法,用于返回Map中所有key组成Set集合,没有顺序而言。
31、Map中的put(Object key,Object value)方法要注意,如果当前Map中有一个与该key相等的key-value对,则新的key-value对会覆盖原来的key-value对。
32、Map中的putAll(Map m)方法可以实现将指定的Map中的key-value对赋值到本Map中。
33、HashMap和Hashtable的区别:
①Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable性能高一点,但是如果有多条线程访问同一个Map对象时,使用Hashtable实现类会更好。
②Hashtable不允许使用null作为key和value,如果试图将null值存入Hashtable中,将会引发NullPointerException异常,但是HashMap可以使用null作为key或者value(由于HashMap里的key不能重复,所以HashMap中最多只有一项key-value对的key为null,但是可以无数多项key-value对的value为null)。
34、HashMap和Hashtable判断两个key相等的标准是:两个key通过equals方法返回true,两个key的hashCode值也相等。
35、HashMap和Hashtable判断两个value相等的标准是:只要两个对象通过equals比较返回true即可。
36、TreeMap的全部key则以TreeSet的形式存储;TreeMap对key的要求与TreeSet对元素的要求基本一致。
37、IdentityHashMap要求两个key严格相等时才认为两个key相等,即通过==比较返回true。
例如以下程序:
public class IdentityHashMapTest {
public static void main(String[] args){
IdentityHashMap ihm=new IdentityHashMap();
//下面两行代码将会向IdentityHashMap对象中添加两个key-value对
ihm.put(new String("语文"),89);
ihm.put(new String("语文"),78);
//下面两行代码只会向IdentityHashMap对象中添加一个key-value对
ihm.put("java",93);
ihm.put("java",98);
System.out.println(ihm);
}
}
//输出:{java=98,语文=78,语文=89}
38、EnumMap中所有key都必须是单个枚举类的枚举值,创建EnumMap时必须显示或隐式指定它对应的枚举类。EnumMap在内部是以数组形式保存的。
EnumMap不允许使用null作为key值,但是允许使用null作为value。
39、集合类中的同步控制,Collections类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题。
例如:创建四个同步集合对象
public class SynchronizedTest{
public static void main(String[] args){
//下面程序创建了四个同步的集合元素
Collection c=Collections.synchronizedCollection(new ArrayList());
List list=Collections.synchronizedList(new ArrayList());
Set s=Collections.synchronizedSet(new HashSet());
Map m=Collections.synchronizedMap(new HashMap());
}
}
上面例子中,直接将新创建的集合对象传给了Collections的synchronizedXxx方法,这样直接获取的List、Set和Map的线程安全实现版本。