JAVA笔记5之集合

1、所有集合类都位于java.util包下。

2、集合中只能保存对象,实际上是对象的引用变量,但通常习惯上认为集合里保存的是对象。

3、Java的集合主要是由两个接口派生而来:Collection和Map,这两个接口是Java集合框架的根接口

4、Map里的key是不可重复的,但是value是可重复的。

5、Collection接口是List、Set、Queue接口的父接口,该接口定义的方法既可以操作Set集合,也可以用于操作List和Queue集合。。

6、当使用Iterator和foreach对集合元素进行迭代时,Iterator和foreach并不是把集合元素本身传给了迭代变量,而是把集合元素的值传递给了迭代变量,所以在迭代过程中修改迭代变量的值对元素本身没有任何改变,否则引发ConcurrentModificationException异常。

7、Set集合中不允许包含相同元素,如果试图将两个相同的元素加入同一个Set集合中,则添加失败,add方法将返回false,且新元素不会被加入。

8、HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。

9、HashSet的特点:
①不能保证元素的排列顺序,顺序有可能会发生变化;
②HashSet不是同步的,如果多个线程同时访问一个Set集合,如果多个线程同时访问一个HashSet,如果有两条或者两条以上线程同时修改了HashSet集合时,必须通过代码来保证其同步;
③集合元素可以是null。

10、当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来决定该对象在HashSet中的存储位置。

11、简单地说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值也相等。

12、HashSet采用每个元素的hashCode作为索引,从而可以自由增加HashSet的长度,并且可以根据元素的hashCode值来访问元素,因此当HashSet中访问元素时,HashSet先计算该元素的hashCode值(也就是调用该对象的hashCode()方法的返回值),然后直接到该hashCode对应的位置去取出该元素,这就是HashSet速度很快的原因。

13、当向HashSet中添加可变对象时,需要小心,如果修改HashSet集合中的对象,有可能导致该对象与集合中其他对象相等,从而导致HashSet无法准确访问该对象。

14、LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入顺序保存的,即遍历LinkedHashSet时,HashSet将会按元素的添加顺序来访问集合里的元素。

15、TreeSet是SortedSet接口的唯一实现,可以确保集合元素的排序状态。TreeSet采用红黑树的数据结构对元素进行排序。TreeSet有两种排序,自然排序和定制排序。其中自然排序调用结婚元素的compareTo(Object obj)方法来比较元素之间的大小,然后将集合元素按升序排列。

16、如果试图将一个对象添加进TreeSet时,该对象必须实现Comparable接口,否则程序将会抛出ClassCastException异常。此外,想TreeSet中添加的应该是同一个类的对象(因为只有相同的类的两个实例才会比较大小),否则也会引发ClassCastException异常。

17、TreeSet集合判断两个对象不相等的标准是:两个对象通过equals方法比较返回false,或通过compareTo(Object obj)比较没有返回0。

18、EnumSet中的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序。

19、EnumSet不允许加入null值。

20、EnumSet类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的static方法来创建EnumSet对象。

21、当试图复制一个Collection集合里的元素来创建EnumSet集合时,必须保证Collection集合里的所有元素都是同一个枚举类的枚举值,否则抛出ClassCastException异常。

22、Set总结:
①HashSet性能比TreeSet好(因为TreeSet需要额外的红黑树算法来维护集合元素的次序,只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet);
②对于普通插入、删除操作,LinkedHashSet比HashSet要略慢一点(因为要维护链表所带来的额外开销所造成),有了链表,遍历LinkedHashSet会更快。
③EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。

④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的线程安全实现版本。








你可能感兴趣的:(JAVA笔记5之集合)