java集合框架中主要包含Collection接口和Map接口。
【概览】
Collection接口
|-------------------List子接口(元素存储有序、可重复的集合,可看做动态数组。其底层仍旧是由数组实现的)
|-------------------------ArrayList、LinkedList、Vector
|-------------------Set子接口(元素存储无序、可重复的集合)
|-------------------------HashSet、LinkedHashSet、TreeSet
Map接口:存储 “ 键 --值 ”对,即key- value
|-------------------------HashMap、LinkeHashMap、TressMap、Hashtable(主要子类:Properties 配置文件类)
【List】
1.ArrayList(主要的实现类)
//底层采用数组实现
相对于Collection接口,List新增加的方法如下:
void add(int dex, Object ele)
boolean addAll(int index,Collection eles)
Object get(int index)
int indexof(Object obj)
int lastIndexOf(Object obj)
remove(int index) set(int index) subList()
//主要方法:
增 add(int dex, Object ele) // 相当于增加,其他位置的元素会向后移动。
删 remove(int index) 插入 add(int index,Object obj)
查 get(int index) 长度 size()
改 set(int index) // 调用该方法需要本来位置上存在元素,否则会报错。
// 相当于“替换”,其他元素位置不发生改变
2.LinkedList
//底层采用链表实现
//常在有频繁的插如、删除等操作时候采用
3.Vector
//较为古老、效率较低、线程安全、但不推荐实现
-------------
【遍历方法】
//一般采用增强for循环或者iterator迭代器
eg:
Collection coll=new ArrayList();
coll.add(123);
coll.add(234);
coll.add(345);
coll.add(new Date());
coll.add(“aa”);
//增强for循环:
for(Object asd : coll){
System.out.println(asd);
}
//Iterator迭代器
Iterator i =coll.iterator();
While(i.hasNext){
System.out.println(i.next());
}
【Set】
1.HashSet
//主要实现类
//Set中常用的方法都是Collection下定义的
//存储无序的,不可重复的元素
eg:
Set set=new HashSet();
set.add(123);
set.add(345);
set.add(456);
set.add(“AA”);
set.add(“BB”);
set.add(null);
总结:
Set接口:
* 1. 存储无序的,不可重复的 常用方法一般是Collection下定义的
* 2..无序!=随机。 第一次是随机排列,但再运行时顺序不变。即存储无序。
* 3..不可重复性。 向set中添加相同的元素时,之后的不能添加进去。当加入的对象相同时。要重写对象所在类的equals和hashcode方法。
* 不同于list。
* 因为其无序性,不同于list的有序性。
* 解释:Set中的元素如何存储。
* 因为使用了哈希算法。故即使对象内容,但每个对象的哈希值不同。所以可以存入Set中
* 存储是先调用hascode 计算对象的哈希值。然后存储到指定位置。若该位置已有,再调用equals方法。比较两个对象的内容是否相同。
2.LinkedHashSet
* 使用链表维护了添加顺序,导致遍历LinkedHashSet集合元素时,是按照添加顺序进行遍历的。
* 性能略低于HashSet,但在迭代访问set中的全部元素时有很好的性能。
* 不允许对象重复,对于对象仍旧需要重写hashcode和equals方法
3.TreeSet
Set set=new TressSet();
set.add(new Person(“CC”,24);
set.add(new Person(“BB”,25);
set.add(new Person(“AA”,23);
set.add(new Person(“DD”,21);
set.add(new Person(“EE”,22);
/*1.向TreeSet中添加的元素必须是同一个类的。
2.可以按照添加进集合中的元素的指定的顺序遍历。像String包装类就按照从小到大的顺序遍历。
3.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序。
4.自然排序:要求自定义类实现Comparable接口并重写CompareTo方法,在此方法中知名按照属性的哪个属性进行排列,以下的例子是按照name属性排列。
5.定制排序:①创建一个实现Comparator接口的对象,注意此处是comparator。与Comparable不一样。
②将此对象作为形参传递给TreeSet的构造器中。
③向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象。
当自定义类(Person类)添加进TreeSet中时,依据此方法(CompareTo方法)确定按照哪个属性排列。向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序认为这两个对象时相同的,进而后一个对象不能添加进TreeSet。
compareTo与hashCode以及equals三者需要保持一致。
Comparator com=new Comparator(){
Public int compare(Object o1,Object o2){
If(o1 instance of 自定义类 && o2 instance of 自定义类)
自定义类 a1= (自定义类)o1;
自定义类 a2= (自定义类)o2;
return a1.getId().compareTo(c2.getId());
}
return 0;
}
Public int CompareTo(Object o){
If(o instanceof Person){
Person p= (Person)o;
return this.name.CompareTo(p.name)
}
return 0;//返回0意味着两个属性一样,也就填不进去
}
故重写方法修改为以下:
Public int CompareTo(Object o){
If(o instanceof Person){
Person p= (Person)o;
int i=this.age.compareTo(p.age);
if(i=0){
return this.name.compareTo(p.name)
}else{
return i;
}
}
return 0;//返回0意味着两个属性一样,也就填不进去
}
【Map】
- Map与Collection并列存在。用于保存具有映射关系的数据:key-value
- Key用set来存放。不允许重复。Value相当于Collection。
Map
|----------HashMap: Map的主要实现类
|----------LinkedHashMap:使用链表维护添加进Map中的顺序,按照添加的顺序遍历,类似HashSet与LinkedHashSet的关系
|----------TreeMap 按照添加进Map中的元素的key的指定属性进行排列。要求:Key必须是同一个类对象。自然排序、定制排序。同HashSet一样。Comparable 和Comparator。
|----------Hashtable
|----------Properties(配置文件类)
1、HashMap
//一个键值对是一个Entry ,所有的Entry是用Set存放的,也是不可重复的。
若存的是自定义类,其一定要重写equls方法。判断两个key是否相同,若相同则只能添加进后添加的那个元素。
【遍历】
//遍历key集
Set set=map.keySet();
For(Object asd: set){
System.out.println(asd);
}
//遍历value集
Collection values=map.values();
Iterator i= values.iterator();
While(i.havaNext()){
System.out.println(i.next());
}
//遍历key-value集
方式一:即根据obj的get方法结合遍历set一起成组合输出
Set set=map.keySet();
for(Object asd: set){
System.out.println(obj+”----”+map.get(obj));
}
方法二:使用EntrySet
Set set=map.entrySet();
For(Object obj: set){
Map.Entry entry=(Map.Entry)obj;
System.out.println(entry.getKey()+entry.getValue());
}
2.LinkedHashMap
//使用链表维护添加进入的顺序,类似于HashSet和LinkedHashSet的关系
3.TreeMap:同上