您的位置:首页 > 职场人生

黑马程序员---java集合框架之类集图与TreeSet排序

2013-05-26 19:58 316 查看
------- android培训java培训、期待与您交流! ----------

学习一个体系,首先从最顶层开始学起。例如集合框架,整个框架体系,应该先学习Collection的共性操作。集合类的特点是,可以用来存储对象并且是长度可变的容器,可以存储不同的对象。而数组是初始化即固定长度的。

先看看集合框架的整个框架图:



由上图可以看出来,Collection下有两个子接口,一个是List,另外一个是Set。

其中List是有序的序列,允许元素的重复。

Set是无序序列,不允许有元素相同。她们都实现了Collection接口。

ArrayList:底层是数组结构,查询快,增删慢,不同步。

 LinkedList:底层是链表结构,增删快,查询慢,不同步

 

Collection中的共性方法主要有:

1.添加:

add方法的参数类型是Object。以便于接收任意类型对象。

集合中存储的都是对象的引用(地址)

boolean add(Object obj);

boolean addAll(Collection coll);

 

2.删除://会改变集合的长度。

boolean remove(Object obj);

boolean removeAll(Collection coll);//将两个集合中的相同元素从调用removeAll的集合中删除。

void clear();//将集合清空。注意:集合还在。

 

3.判断:

boolean contains(Object obj);

boolean containsAll(Collection coll);

boolean isEmpty();//判断集合是否为空

 

4.获取:

int size();

Iterator iterator();//取出元素的方式:迭代器。

迭代器:专门用于取出集合中元素的方式。

 

5.其他:

boolean retainAll(Collection coll);//取交集。

Object[] toArray();//将集合转成数组。

HashSet:

底层是哈希表,线程不同步,无序、高效。HashSet是通过元素的hashcode和eauals方法来保证元素的唯一性的。如果hashcode值相同,则继续判断equals方法的结果。如若hashcode值不同,则不会调用euqals方法。

 TreeSet:底层是二叉树,可对元素进行排序,默认是自然顺序。通过Comparable接口的compareTo方法return
0来保证元素的唯一性。

 

TreeSet有两种排序方式:

第一种:使要排序的元素具备比较性,这时需要被比较的元素实现comparable接口。并复写其中的compareTo方法。这种方式也成为元素的自然顺序排序。

第二种:使集合在初始化后,集合自身具备比较性。即通过TreeSet的构造方法传入一个比较器。该比较器实现Comparator接口,并实现其中的compare方法。

分别使用两种不同的排序方式的TreeSetzonghe代码示例:

package com.itheima;
/**
* 使用TreeSet排序方式中的使元素自身具备比较性。
* Student实现Comparable接口,并实现其中的compareTo方法。
*
* @author wu
* */
public class Student implements Comparable<Student>
{
private String name;
private int age ;
public Student(String name, int age)
{
// TODO Auto-generated constructor stub
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@Override public int compareTo(Student o)
{
// TODO Auto-generated method stub
//定义一个num接受判断年龄后返回的数值。
//方便于双重判断,当年龄一样时,再判断姓名是否相同。
//当都相同时,确定为同一个元素。
int num = new Integer(this.getAge()).compareTo(new Integer(o.getAge()));
if (num == 0)
{
return this.getName().compareTo(o.getName());
}
return num;
}

}

package com.itheima;

import java.util.Comparator;

/**
* 使用TreeSet排序方式中的 试集合自身具备比较性,通过TreeSet的构造方法
* 接收一个比较器对象。 该比较器实现Comparator接口。
* 并实现其中的compare方法。
*
* @author wu*/
public class MyComp implements Comparator<Student>
{

@Override public int compare(Student stu1, Student stu2)
{
// TODO Auto-generated method stub
//定义一个num接受判断年龄后返回的数值。
//方便于双重判断,当年龄一样时,再判断姓名是否相同。
//当都相同时,确定为同一个元素。
int num = new Integer(stu1.getAge()).compareTo(new Integer(stu2.getAge()));
if (num == 0)
{
return stu1.getName().compareTo(stu2.getName());
}
return num;
}

}


 

package com.itheima;

import java.util.Comparator;

/**
* 使用TreeSet排序方式中的 试集合自身具备比较性,通过TreeSet的构造方法
* 接收一个比较器对象。 该比较器实现Comparator接口。
* 并实现其中的compare方法。
*
* @author wu*/
public class MyComp implements Comparator<Student>
{

@Override public int compare(Student stu1, Student stu2)
{
// TODO Auto-generated method stub
//定义一个num接受判断年龄后返回的数值。
//方便于双重判断,当年龄一样时,再判断姓名是否相同。
//当都相同时,确定为同一个元素。
int num = new Integer(stu1.getAge()).compareTo(new Integer(stu2.getAge()));
if (num == 0)
{
return stu1.getName().compareTo(stu2.getName());
}
return num;
}

}


 

package com.itheima;

import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetTest
{

/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
//使集合自身具备比较性的TreeSet排序方式
TreeSet<Student> ts = new TreeSet<Student>(new MyComp());

ts.add(new Student("lisi03...Comp... ",35));
ts.add(new Student("lisi12...Comp... ",23));
ts.add(new Student("lisie...Comp... ",78));
ts.add(new Student("lisigy...Comp... ",12));
ts.add(new Student("lisity...Comp... ",23));
ts.add(new Student("lisii2...Comp... ",23));

Iterator<Student> it = ts.iterator();
System.out.println("使集合自身具备比较性:");
while (it.hasNext())
{
Student student = it.next();
System.out.println(student.getName()+"..."+student.getAge());
}
//-----------------------------------------------------------------------
//使元素自身具备比较性的TreeSet排序方式
TreeSet<Student> ts1 = new TreeSet<Student>();

ts1.add(new Student("lisi03 ",35));
ts1.add(new Student("lisi12 ",23));
ts1.add(new Student("lisie ",78));
ts1.add(new Student("lisigy ",12));
ts1.add(new Student("lisity ",23));
ts1.add(new Student("lisii2 ",23));

Iterator<Student> it1 = ts1.iterator();
System.out.println("使要比较的元素自身具备比较性:");
while (it1.hasNext())
{
Student student = it1.next();
System.out.println(student.getName()+"..."+student.getAge());
}
}

}


如果两种比较方式都存在的话,以比较器的比较方式为主。

 

Map集合

Map集合下主要有HashMap和TreeMap。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: