一.JAVA集合整体框架结构:
Collection接口:
1.List接口:存入的对象是有序的,允许重复,只需要重写equals()方法;
1)ArrayList类:可添加null元素,依赖数组实现,随机访问较好,当需要大量插入、删除操作时性能较差,不真正存放对象,之存放对象引用;
2)LinkedList类:依赖双链表实现,插入、删除性能较好,随机访问性能较差;
3)Vector类:比较老的实现类,已被淘汰,线程安全;
2.Set接口:存入的对象是无序的,但无序并不等于随机,每次执行结果是相同的,不允许重复,添加进Set中的元素所在的类一定要重写equals()和hashCode()方法保证Set不可重复性;
1)HashSet类:元素存储不保证顺序,可添加null,但只能添加一次;
2)LinkedHashSet类:使用链表维护了添加进集合的顺序导致遍历LinkedHashSet元素集时是按照添加进的元素顺序遍历的;
3)SortedSet接口:
①TreeSet类:以下部分详讲;
Map接口:
1.HashMap类:通过哈希码存储,不保证顺序,允许键为null,但只能出现一次;
2. LinkedHashMap类:使用链表维护了添加进集合的顺序导致遍历LinkedHashMap元素集时是按照添加进的元素顺序遍历的;
3.Hashtable类:比较老的实现类,线程安全,不允许使用null作为key和value;
4.SortedMap接口:
①TreeMap类:以下部分详讲;
二.List接口:
1.数组和List之间的转换:
1)数组转集合:
Arrays类的asList(T... a)方法,返回由指定数组支持的固定大小的列表。如:List<String> strlist = Arrays.asList("zhangsan","lisi");
2)集合转数组,如下所示:
List lst = new ArrayList();
lst.add(123);
lst.add(456);
Object[] obj =lst.toArray();
for(Object o:obj){
System.out.println(o);
}
2.List的遍历,具体见下面实例:
① iterator()方法;
②增强for循环;
3.List的常用方法:
方法 | 描述 |
add(E e) | 在集合的后面添加元素 |
add(int index, E element) | 在集合的指定位置添加元素 |
remove(int index) | 删除指定索引的元素 |
remove(Object o) | 删除指定对象 |
clear() | 删除集合中的所有元素 |
set(int index, E element) | 在指定位置替换元素,返回对象 |
get(int index) | 返回指定集合位置的元素 |
indexOf(Object o) | 返回指定元素出现的第一个索引,如无返回-1 |
LastIndexOf(Object o) | 返回指定元素出现的第一个索引(从后向前查找),如无返回-1 |
isEmpty() | 若集合无元素返回true |
contains(Object o) | 查询是否包含指定元素,是则返回true |
equals(Object o) | 是否和制定集合相等,如是返回true |
iterator() | 返回集合的迭代方法 |
hashCode() | 返回列表中哈希表的值 |
size() | 返回列表的元素数量 |
toArray() | 返回一个数组,包含列表的所有元素 |
三.Set接口
1.Set数据存储过程:
当向Set中添加对象时首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了对象在Set中的存储位置,若此对象之前没有对象存储,则这个对象直接存储到该位置,若此位置已有对象存储再通过equals()方法比较两个对象是否相同,若相同则此对象就不能添加进来,若不相同则两个对象存储在同一位置,此方案不建议使用,需保证hashCode()和equals()方法一致性;
2.TreeSet类
存储对象要求:
1)只能添加同一个类的对象;
2)可按照添加进集合中的元素的指定顺序遍历;
排序方法:
1)自然排序(添加类时要实现Comparable接口):
要求自定义类实现java.lang. Comparable接口并重写其compareTo(T o)方法,在其中指明按照哪个属性进行排序,向TreeSet中添加元素时首先按照compareTo(T o)进行比较,一旦返回0,虽然仅仅是两个对象 的此属性值相同,但程序会认为这连个对象是相同的,后一个对象不能添加进来;PS: compareTo(T o)与hashCode()和equals()方法保持一致,当返回为0是认为属性值是一样的;
2)定制排序要求:
①创建一个实现了Comparator接口的类对象;
②将此对象作为形参传递给TreeSet构造器中;
③向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象;
四.Map接口(key和value均为引用数据类型,key用set存放,不允许重复,常用String):
1.HashMap类:
1)Key是用Set来存放的,不可重复,values是用Collection来存放的,可重复,一个key-value对是一个Entry,所有的Entry是用Set来存放的,也不可重复;
2)向HashMap中添加元素时会调用key所在类的equals()方法判断两个key是否相同,若相同则不能添加进后添加的元素。
3)如何遍历Map?详细见下面实例;
①Set KeySet():遍历key
②Collection Values():遍历values
③Set entrySet():遍历key-value
4)HashSet是一个特殊的HashMap,当values为NULL时,此时HashMap就为HashSet;
2.TreeMap:按照添加进Map中的元素的Key的指定顺序进行排序;
要求:key必须是同一个类的对象,也有自然排序和定制排序两种;
3.Properties类:继承Hashtable,常用来处理属性文件,键和值均为String类型;
五.常用操作类:
操作集合工具类:Collections,可操作Collection以及Map的工具类;操作数组工具类:Arrays
六.应用实例:
1.List集合遍历的三种方法比较:
package com.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
public class test {
public static void main(String[] args) {
List alist = new ArrayList();
alist.add(123);
alist.add(456);
alist.add(245);
//三种迭代方法比较
//内部不锁定,效率最高,但在多线程要考虑并发操作的问题;
for(int i=0;i<alist.size();i++){
System.out.println(alist.get(i));
}
//其内部还是调用了迭代器遍历的方式,这种循环方式有限制,不建议使用;
for(Object j : alist){
System.out.println(j);
}
//执行过程中会执行数据锁定,性能较差,若要去掉元素必须用iter.remove()方法;
Iterator iter = alist.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
2.Map的遍历实例:
package com.test;
import java.util.*;
public class test {
public static void main(String[] args) {
Map map = new HashMap();
map.put(001, "zhangsan");
map.put(002, "lisi");
map.put(003, "wangmazi");
//1.遍历key集
Set keyset = map.keySet();
for(Object keys:keyset){
System.out.println(keys);
}
//2.遍历value集
Collection coll = map.values();
Iterator i = coll.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
//3.遍历key-value对
//方式1:
Set set1 = map.keySet();
for(Object keys:set1){
System.out.println(keys+"->"+map.get(keys));
}
//方式2:
Set set2 = map.entrySet();
for(Object ss:set2){
Map.Entry s = (Map.Entry)ss;
System.out.println(s.getKey()+"->"+s.getValue());
}
}
}