java集合中hashSet与TreeSet学习总结
来源:互联网 发布:linux 查看java版本 编辑:程序博客网 时间:2024/05/22 02:30
集合hashSet与TreeSet(仅就成员元素为自定义类型)总结如下:
1、hashSet
为保证hashSet集合中的自定义成员元素的唯一性(或不可重复性),自定义成员元素所属的类一定要重写Object类中hashCode()方法及equals()方法。
为什么要这么作呢?
我们试想:怎么判断两个元素相等呢?答案是利用equals方法。可是,假如我们集合中的元素已经有1000个了,那么当地1001个元素加入集合中时,它就要与前面的1000个元素利用equals方法比较。这样显然不好,效率太低。
我们再想:为什么要重写hashCode方法呢? 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。 这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。 所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了。
hashCode方法返回值如何定义?
一般来讲就是根据成员元素所属类的属性的hash值来确定。
2、TreeSet
TreeSet类型的集合有两中排序的方法:一个是自然的排序方法,另一个是自定义的排序方法。
在使用自然排序方法时要注意,成员元素所属的类一定要实现java.lang.comparable接口,并覆盖compareTo方法。compareTo方法的返回值类型为int型。
import java.util.*;
class Person implements Comparable
{
private int age;
private String name;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
//重写java.lang.comparable接口中compareTo方法
public int compareTo(Object obj)
{
if (!(obj instanceof Person))
{
throw new RuntimeException("对象加入错误!");
}
Person p = (Person)obj;
if(this.getAge()>p.getAge())
{
return 1;
}
else if (this.getAge()<p.getAge())
{
return -1;
}
else if (this.getAge()==p.getAge())//如果年龄相同则比较姓名。
{
return this.getName().compareTo(p.getName());
}
return -1;
}
//重写toString方法
public String toString()
{
return this.getName()+"---"+this.getAge();
}
}
class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();//创建TreeSet类型集合ts
ts.add(.......);//添加元素
...................;//添加元素
....................;//添加元素
sop(ts);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
在使用自定义排序方法时要注意,在创建TreeSet类型的集合时需指定其排序方法对象。(该对象属于一个实现了java.util.comparator接口的类,该类中有覆盖comparator接口中compare方法的方法)
//利用自定义方法排序
java.util.*;
class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new MyComp());//指定排序方法对象。
//添加对象
ts.add(....);
................;
sop(ts);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class Person
{
private int age;
private String name;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
..............................
.....................................
................................
}
//MyComp 实现Comparator接口
class MyComp implements Comparator
{
//覆盖Comparator接口中compare方法
public int compare(Object obj1,Object obj2)
{
Person p1 = (Person)obj1;
Person p2 = (Person)obj2;
if (p1.getAge()-p2.getAge()=0)
{
return p1.getName().compareTo(p2.getName());
}
return -(p1.getAge()-p2.getAge());
}
}
- java集合中hashSet与TreeSet学习总结
- Java集合深入学习--HashSet与TreeSet
- java 集合学习笔记3-HashSet TreeSet
- Java中TreeSet与HashSet的对比
- java HashSet / TreeSet 学习
- Java--集合(Set:HashSet,TreeSet)
- JAVA学习.JAVA集合类型Collection.Set.HashSet&TreeSet
- java集合类(五)HashSet与TreeSet应用实例
- Java笔记之HashSet与TreeSet集合的运用
- Java中HashSet和TreeSet集合的本质
- java集合HashSet,TreeSet知识点集合
- Java 之 HashSet与TreeSet
- 集合类的学习--HashSet vs TreeSet
- 集合源码学习(八):HashSet和TreeSet
- Set集合接口 HashSet与TreeSet理解
- 集合框架中HashSet和TreeSet
- 【Java总结-集合】Java集合的Collection接口,ArrayList,LinkedList,HashSet,TreeSet
- Java集合框架-2.【Set】【HashSet】【TreeSet】
- hdu2602 Bone Collector(01背包+入门)
- [小技巧] Linux 里快速安装缺少的库
- 完美运动框架(可以改变元素的透明度,宽,高,top,left,字体大小等)
- sql存储过程的加密和解密(适用于SQLSERVER2000存储过程)
- android 截图
- java集合中hashSet与TreeSet学习总结
- Object Property 参数使用
- 面试笔试杂项积累-leetcode 241-245
- Light OJ 1169 - Monkeys on Twin Tower (简单DP)
- Android批量图片加载经典系列——Volley框架实现多布局的新闻列表
- 1031. Hello World for U (20)
- 【第一天】初步接触jQuery
- 为什么Float类型不能直接相等
- 表格布局TableLayout ——实现商品浏览页面