1.集合与数组的区别
(1).数组不可变长度,集合可变长度
(2).数组里可放基本数据类型和对象,集合只能放对象
2.集合框架顶层接口Collection的共性方法
增:add(Object obj); addAll(Collection c);
删:clear(); remove(Object obj); removeAll(Collection c);
判断是否为空:isEmpty();
判断长度:size();
判断是否包含:contains(Object obj); containsAll(Collection c);
集合转数组:toArray();
A集合中去除和B集合有交集的部分:A.removeAll(B);
A集合中取得和B集合的交集部分:A.retainAll(B);
迭代器遍历集合:
for(Iterator it = coll.iterator(); it.hasNext();){
it.next();
}
3.Collection下一层
List:有索引,有序
Set:不重复
4.List的特有方法
增:add(index,element);
删:remove(index);
改:set(index,element);
查:get(index); indexOf(element);
遍历:
for(int i = 0; i<list.size();i++){
list.get(i);
}
注:list遍历一般不用迭代器,如果用的话,迭代器类型要用LinkedIterator,不然如果做增删会报错,因为没有同步。
5.List子类
Vector:数组,线程同步。查询、增删都慢(用得少)
ArrayList:数组,线程不同步。查询快、增删慢
LinkedList:链表,线程不同步。查询慢,增删快
ArrayList的实例:将ArrayList重复的部分去除
方法一:
for(int i = 0;i<list.size()-1;i++){
Object obj1 = list.get(i);
for(int j = i+1;j<list.size();j++){
Object obj2 = list.get(j);
if(obj1 == obj2){
list.remove(j);
j--;
}
}
}
方法二:
ArrayList temp = new ArrayList();
for(int i = 0;i<list.size();i++){
Object obj = list.get(i);
if(!temp.contains(obj)){
temp.add(obj);
}
}
LinkedList有几个特有的方法:
addFirst(), getFirst(), removeFirst(); (Last同First)
6.Set子类
HashSet:哈希表结构,查询极快。
TreeSet:二叉树结构,线程不同步。可通过构造器对元素排序。
HashSet在做add时需要重写hashcode()和equal()方法。
TreeSet在做add时,如果返回值为0,不插入。写构造器的方法有两种:
(1).实现Comparable接口,覆盖compareTo()方法
(2).实现Comparator接口,覆盖compare()方法。
HashSet重写方法示例:
public int hashCode(){
final int num = 31;
return name.hashcode + age * num;
}
public boolean equals(Object obj){
if(this == obj) return true;
if(!(obj instanceOf Student)) throw new ClassCastException("类型错误");
Student stu = (Student)obj;
return this.name.equals(stu.name) && this.age == stu.age;
}
class Student implements Comparable{
public int compareTo(Object obj){
Student stu = (Student)obj;
int temp = this.age - stu.age;
return temp == 0?this.name.compareTo(stu.name) : temp;
}
}
class compareStringByLength implements Comparator{
public int compare(String str1,String str2){
int temp = str1.length - str2.length;
return temp == 0?str1.compareTo(str2) : temp;
}
}
7.Map:双列集合,键值对,键不可以相同。
共性功能:
增:put(key,value); putAll(Map map); (注:put()方法返回的是key的旧值)
删:clear(); remove(key);
判断长度:size();
判断是非为空:isEmpty();
判断是否包含:containsKey(); containsValue();
查:get(key);
遍历(两种方法):keySet,entrySet
keySet:
Map<String,String> map = new Map<String,String>();
map.put("a","aaa");
map.put("b","bbb");
Set<String> keys = map.keySet();
for(Iterator<String> it = keys.iterator(); it.hasNext();){
String key = it.next();
String value = map.get(key);
}
entrySet:
Map<String,String> map = new Map<String,String>();
map.put("a","aaa");
map.put("b","bbb");
Set<Map.Entry<String,String>> entry = map.entrySet();
for(Iterator<Map.Entry<String,String>> it = entry.iterator(); it.hasNext();){
Map.Entry<String,String> me = it.next();
String key = me.getKey();
String value = me.getValue();
}
8.Map子类
HashTable:哈希表,线程同步,不允许null键
HashMap:哈希表,线程不同步,允许null键
LinkedHashMap:在HashMap的基础上加了排序
TreeMap:二叉树,不同步,可对key排序
实例:一个字符串(str)统计每个字符出现的次数
TreeMap<String,Integer> map = new TreeMap<String,Integer>();
Char[] chars = str.toCharArray();.
for(int i = 0;i<chars.length;i++){
Integer vaue = map.get(chars[i]);
int count = 0;
if(value != null) count = value;
count++;
map.put(chars[i],count);
}
StringBuffer sb = new StringBuffer();
Set<String> keys = map.keySet();
for(Iterator<String> it = keys.iterator();it.hasNext();){
String key = it.next();
Integer value = map.get(key);
sb.append(key+"..."+value+"\n");
}
9.集合框架总结
数组:查询快,增删慢。(Array)
链表:查询慢,增删快。(Linked)
List:有序
Set:不能重复
排序:Collections.sort(list,new compareStringByLength()); //自己定义的过滤器,参考上面
逆序:Collections.sort(list,Collection.reverseOrder(new compareStringByLength()));
最大(小)值:Collections.max(list,new compareStringByLength());
二分查找:Collections.binarySearch(list,key);
非同步变成同步:Collections.synchronizedCollection(coll);
集合变数组:list.toArray(new String[list.size()]);
数组变集合:Arrays.toList(array);