A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© luguoyuanf 中级黑马   /  2013-4-9 01:00  /  1163 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 luguoyuanf 于 2013-4-9 08:02 编辑

Set集合
特点:无顺序存储和取出,不存储重复的元素,包括对象和自定义对象,此接口只能通过迭代器取出.
自定义对象满足条件:
1) 构造函数
2) set
3)get
4)toString
5)hashCode
6)equals
7)compareTo
HashSet集合
特点:
1) 无顺序,不存储重复元素.
2) 判断重复元素的依据是对象中的hashCode和equals方法,线程不同步.
3)HashSet数据结构是哈希表,简称桶子结构.
步骤:
1)导包, 创建HashSet类型的集合.
import java.util.*; //类外面
class HashSetDemo1{
public static void main(String[] args){
HashSet hs = new HashSet();
...........
}
2) 使用add()方法向内部添加元素.
hs.add(newCarDemo("Audi",4);       //hs集合内添加自定义类CarDemo对象并赋值
3) 覆写hashCode()方法.
public int hashCode(){    //必须跟object类下的hashCode方法一样
int x = 3;  //定义一个常量,用来跟door的哈希值相乘
return name.hashCode()+door *x;
//返回int类型的哈希值
}
如果返回的哈希值跟集合内元素不同,则不执行equals方法,直接在集合内添加,反之equals判断.
4) 覆写equals方法.
public boolean equals(Object obj){      
CarDemo c = (CarDemo)obj;  //将要比较的元素强制转换成定义类的类型
return this.name.equals(c.name) && this.door == c.door;   //判断name和door是否相等
//this代表new CarDemo传的值,obj代表从集合中查找出来的一个元素
}
如果equals也判断跟集合内的元素相同,则示为相同不添加.
5) 覆写toString方法.
public String toString(){
return name+"..."+door;
}
HashSet集合迭代器取元素时自动调用,如果不覆写则打印对象的地址哈希值.
6) 创建构造器取元素.
Iterator i = hs.iterator();
while(i.hasNext()){
System.out.println(i.next());    //重写toString后可直接输出,
}


TreeSet集合
特点:
1) 有序,将对象进行自然排序(123,abc)
2) 存储到TreeSet集合中的对象,必须具备比较性
3) 存储到TreeSet集合中的对象必须实现Comparable,覆盖compareTo方法
4) TreeSet集合在排列中,只参考对象中compareTo方法的返回值
5) TreeSet底层是二叉树结构
第一种方式步骤:
1)导包, 创建HashSet类型的集合.
import java.util.*; //类外面
class TreeSetDemo1{
public static void main(String[] args){
TreeSet ts = new TreeSet();
...........
}
2) 使用add()方法向内部添加元素.
hs.add(newCarDemo("Audi",4);       //hs集合内添加自定义类CarDemo对象并赋值
3) 覆写hashCode()方法.
public int hashCode(){    //必须跟object类下的hashCode方法一样
int x = 3;  //定义一个常量,用来跟door的哈希值相乘
return name.hashCode()+door *x;
//返回int类型的哈希值
}
如果返回的哈希值跟集合内元素不同,则不执行equals方法,直接在集合内添加,反之equals判断.
4) 覆写equals方法.
public boolean equals(Object obj){      
CarDemo c = (CarDemo)obj;  //将要比较的元素强制转换成定义类的类型
return this.name.equals(c.name) && this.door == c.door;   //判断name和door是否相等
//this代表new CarDemo传的值,obj代表从集合中查找出来的一个元素
}
如果equals也判断跟集合内的元素相同,则示为相同不添加.
5) 覆写toString方法.
public String toString(){
return name+"..."+door;
}
HashSet集合迭代器取元素时自动调用,如果不覆写则打印对象的地址哈希值.
9) 自定义类实现Comparable接口并覆写
class CarDemo implements Comparable{
public int CompareTo(Object obj){
CarDemo c = (CarDemo)obj;
int num = this.age - c.age;
return num == 0?this.name.compareTo(c.name):num;
}
}
10) 创建构造器调用集合内的元素
Iterator i= ts.iterator();
while(i.hasNext()){
System.out.println(i.next());
}



1 个回复

正序浏览
第二种方式步骤:
1)导包, 创建HashSet类型的集合.
import java.util.*; //类外面
class TreeSetDemo1{
public static void main(String[] args){
TreeSet ts = new TreeSet(new MyPerson());
...........
}
2) 使用add()方法向内部添加元素.
hs.add(new CarDemo("Audi",4);       //hs集合内添加自定义类CarDemo对象并赋值
3) 自定义比较器比较器
class MyPerson implements Comparator{
public int compare(Object o1,Object o2){
Person p1 = (Person)o1;
Person p2 = (Person)o2;
//以名字主要条件升序排序(英文可以正常排序,中文的是对应asicII码表的数值,不准确),年龄为次要条件
/*int num = p1.getName().compareTo(p2.getName());
return num == 0?p1.getAge()-p2.getAge():num;*/
//以年龄为主要条件升序排序,,,名字为次要条件
int num = p1.getAge()-p2.getAge();
return num==0?p1.getName().compareTo(p2.getName()):num;

}
4) 创建构造器调用集合内的元素
Iterator i = ts.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马