-----------android培训、java培训、java学习型技术博客、期待与您交流! ------------
Collection 集合的意思
他是这个接口类型的,类所以不能直接创建实例化对象,要用其子类来完成.
Collection 最常用到的子类是,List 和 Set 这两大子类
那么我们现在就分别说一下 这两个集合中常见子类的特点.
在 List 集合中常见的子类 是,主要有三大集合 Vector LinkedList ArrayList
Vector 集合中,具有一种特殊的取值的方式那就是枚举.这个集合是线程同步的,效率较慢.底层也是,数组结构
main(){
Vector v= new Vector();
v.add("zhangsan");
v.add("zhangsan");
v.add("zhangsan");
/*Enumeration e=v.elements();
while(e.hasMoreElements()){这是枚举取值
System.out.println(e.nextElement());
}*/
for(int i=0; i<v.size();i++){这是索引取值
System.out.println(v.get(i));
}
}
LinkedList 集合中,底层实现的方式是链表式结构.在对大量数据进行增删操作的时候用会比较合适增,速度较快.是线程不同步的,
ArrayList 集合中,底层实现的方式,是数组结构,ArrayList 取代了 Vector 在用法上基本上一样的,ArrayList是线程不同步的
对数据的增删操作较慢,没有LinkedList 快.
这里面重点要说一下 set 集合.
在Set 集合中主要是有 两大 子类集合 ,
1,HashSet
HashSet 底层数据结构方式是哈希表结构,是线程不同步的.
放在这个集合中的元素是不可以重复的,为什么这样说呢?
在HashSet 底层实现的的时候,其中里面有两个方法
一个是HashCode 一个是equals 而HashCode 是用来算出他们在堆内存中
内存地址值,假设我们在判断人对象的时候,建立好他们的对象,如果是
放在,HashSet 集合中的话,每new出来一个对象,只要一new 那么就会在
内存中产生对象,产生对象的同时他们就,具备了内存地址值,这是每产生
一个对象,他们的内存地址值都是不相同的(就是HashCode 的值) 那么他们
都会被存放到,集合中,这个时候只有保证他们的 内存地址值是一样的,我们才有
办法进行比较,那么 就要覆盖 其中的方法 HashCode(); 如果两个对象的HashCode值
是相同的,那么才会用,equals去比较他们的内容是否相同.如果说他们连
HashCode 的值都是不相同的话,那么就像我们上面说到的那样,他们就是不同的对象了,无需比较
2,TreeSet
TreeSet 集合 底层数据结构是,二叉树的结构
这个集合他本身就是一个可以用来排序的集合,当我们只是单纯的向往这个集合
中存入元素的话,当这些元素有一定的,比较关系的时候,这个集合是会自动给
排序的,假如当我们在写一个类的时候,这个类是不具备任何比较性的怎么办呢?
那么我们可以让这个类具有比较的功能,可以让类实现 Comparable接口,
并复写其中的compareTo方法。 还有另外一种方式就是,让集合本身就具备比较的功能.
你只要是存进来的元素,我都给你比较一下,这就是比较器 写一个类实现 Comparator接口
复写 其中 Compare(Object obj1 , Object obj2)在把实现了Comparator接口子类对象
传到集合中就可以了 ,当这两种方式同时存在的时候,那么优先使用比较器的比较方式
public class Person implements Comparable<Person> {//让这个类 具有比较性
private String name;
private int age;
Person(String name,int age){
this.name= name;
this.age= age;
}
@Override
public int compareTo(Person s) {//这是覆盖比较器的方法
int num = new Integer(this.age).compareTo(new Integer(s.age));
if(num == 0)
return s.name.compareTo(this.name);
return num;
}
public int hashCode(){ //对于存放到 HashSet 集合中的时候.覆盖了 HashCode方法
return 60;
}
public boolean equals(Object obj){//对于存放到 HashSet 集合中的时候.覆盖了equals方法
if(!(obj instanceof Person))
throw new RuntimeException("不是人对象");
Person p = (Person)obj;
return this.name.equals(p.name)&& this.age==p.age ;
}
public String toString(){
return name+"..."+age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
class BJQ implements Comparator{//这是比较器
@Override
public int compare(Object o1, Object o2) {//这是覆盖比较器的方法.
// TODO Auto-generated method stub
if(!(o1 instanceof Person && o2 instanceof Person))
throw new RuntimeException("bushi ren lei de dui xiang ");
Person p1= (Person)o1;
Person p2 = (Person)o2;
int unm = p1.getName().compareTo(p2.getName());
if(unm==0)
return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
return unm;
}
}
----------- android培训 、 java培训 、java学习型技术博客、期待与您交流! ------------