1 集合
Java集合大致分为Set、List、Map、Queue。Set代表无序、不可重复的集合;List为有序、可重复集合;Map为有映射关系的集合;Queue代表队列关系集合。
集合类主要由两个接口派生而成:Collection和Map,关系树如图1.1与1.2所示:
图1.1
图1.2
有两种方式遍历集合元素:Iterator、foreach;但是迭代过程中,集合不能被修改。否则会抛出java.util.ConcurrentModificationException异常。Iterator可以通过iterator.remove()来删除元素(删除的是上一个迭代元素)
1.1 Set
Set的特征:元素不能重复,判断依据为equals方法
1.1.1 HashSet/LinkedHashSet
特征:采用hash算法存取元素,有较好的读取性能。
HashSet判断两个元素相等的依据是两个对象的hashcode与equals返回值均相等。因此重写对象的equals方法返回true时,一定要保证它们的hashcode值也相等。
LinkedHashSet维护了元素的位置信息。迭代访问时效果佳。
1.1.2 TreeSet
元素是排序的。如果放入的元素是对象,则该对象类需要实现Comparable接口指定排序依据。
注意:元素如果是可变对象,修改元素的属性将影响集合特性,如元素无法删除等。所以放入的元素最好是不可变对象。
定制排序:默认TreeSet为自然排序;通过传入Comparator改变排序规则:
- TreeSet ts = new TreeSet(new Comparator(){
- @Override
- public int compare(Object arg0, Object arg1) {
- //compare
- }});
1.1.3 EnumSet
枚举集合,元素必须来自枚举类。
1.2 List
判断元素相同的依据是equals返回值
- class A {
- public boolean equals(Object o) {
- return true;
- }
- }
- ArrayList<String> list = new ArrayList<String>();
- list.add(“android”);
- list.remove(new A());// first element was deleted
结果第一个元素被删除!
1.2.1 实现类
实现均是基于数组,封装了可再分配的数组Object[],默认大小10,大数据量时,最好一次性赋予较大容量以提高性能。
void trimToSize(): 将List的容量调整为实际使用大小,可节省空间。
Vector是线程安全的(现已不推荐使用)
1.3 Queue
1.3.1 LinkedList
实现List和Deque接口,即是一个双向列表。内部以链表实现,增、删效率高。
1.3.2 PriorityQueue
按元素大小排序的队列。
1.4 Collection类使用建议
对于经常增加、删除的操作,采用linkedList效果佳
对于访问频繁的,数组类型集合效率高
遍历集合时,ArrayList、Vector等数组实现的结构采用随机访问get(i)方式效率较高,而LinkedList采用Iterator
1.5 HashMap与Hashtable
他们的区别类似于ArrayList与Vector:
1.HashMap是非线程安全,而Hashtable是线程安全
2,HashMap可以null作为key或value,hashtable反之
如果以对象作为key,需重写对象的equals和hashcode方法
1.5.1 LinkedHashMap
保持了插入时的顺序。
1.5.2 Properties
将属性文件与map关联,由于文件的键值均为字符串,因此properties的key和value为字符串类型。
1.5.3 TreeMap
即map的key是以TreeSet实现的,key相同的判断依据是equals和compareTo都相同
1.5.4 WeakHashMap
HashMap的value做成了弱引用
1.5.5 IdentityHashMap
如名字所述,key的要求是必须”==”相同,即要求是同一对象或值
1.6 工具类
Collections中有大量帮助方法,可以分为排序、查找、同步控制等,例举比较实用的:
void sort(List list); 排序
int binarySearch(List list,Object obj);查找指定元素的下标,要求list已排序。
synchronizedXXX(XXX xxx); 创建同步集合。XXX可以是List、Set、Map
转载于:https://blog.51cto.com/rookie1000/973795