HashSet和TreeSet的相关总结和整理

来源:互联网 发布:matlab bp算法 编辑:程序博客网 时间:2024/06/05 04:57


今天来写一下关于HashSet和TreeSet的相关知识,总结下自己最近的思路。温故而知新嘛。那么首先来写一下

HashSet。


HashSet的底层数据结构是哈希表,那么HashSet是如何来保证元素的唯一性呢?

HashSet其实是通过元素的两个方法hashCode()和equals()来完成。如果元素的hashCode()值相同,则会判断

equals()是否为true;如果元素的 hashCode()值不同,则不会调用equals()方法。以下是代码示例。


package Test;import java.util.*;/** * 往hashSet集合中存入自定义对象,姓名和年龄相同为同一个人,重复元素 * @author 淼淇 * */public class Test025 {public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {// TODO Auto-generated method stub HashSet hs = new HashSet(); hs.add(new Person("a1", 11)); hs.add(new Person("a2", 12)); hs.add(new Person("a3", 13)); hs.add(new Person("a4", 14)); hs.add(new Person("a4", 14));  Iterator it = hs.iterator();//获取迭代器 while(it.hasNext()) { Person p = (Person)it.next(); sop(p.getName()+"----"+p.getAge()); }}}class Person{private String name;private int age;Person(String name, int age){this.name = name;this.age = age;}public String getName(){return name;}public int getAge(){return age;}public int hashCode()//复写hashCode()方法{return name.hashCode()+age*39;//每个字符串都有自己的hashCode()方法,为了保证哈希值的唯一性,所以让age乘以一个参数}public boolean equals(Object obj)//复写 euqals()方法{if(!(obj instanceof Person))return false;Person p = (Person)obj;return this.name.equals(p.name) && this.age == p.age;}}

那么需要注意的一个问题就是,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode()和

equals()方法,这点与ArrayList()不同,ArrayList()对于判断元素的一些相关依赖的是equals()方法,这点在实际开发过

程中要注意。

现在说完了HashSet,再来总结下关于TreeSet的相关。TreeSet可以对Set集合中的元素进行排序,并且底层的

数据结构是二叉树。那么何为二叉树结构呢?我们通过以下的图来进行演示。



每一个进来的元素都会与之进行比较,如果大于该元素,则放置到后面,反之则放置到前面,就形成了这种独特

的数据结构,也就是二叉树结构。以下是对于TreeSet的一个代码的演示。

package Test;/** * 往TreeSet集合中存储自定义对象学生,想按照学生的年龄进行排序。 */import java.util.*;public class TreeSetExercise {public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {// TODO Auto-generated method stubTreeSet ts = new TreeSet();ts.add(new Student("lisi01", 10));ts.add(new Student("lisi02", 11));ts.add(new Student("lisi03", 12));ts.add(new Student("lisi03", 9));Iterator it = ts.iterator();while(it.hasNext()){Student s = (Student)it.next();sop(s.getName()+"----"+s.getAge());}}}class Student implements Comparable//该接口强制让学生具备比较性{private String name;private int age;Student(String name, int age){this.name = name;this.age = age;}public String getName(){return name;}public int compareTo(Object obj)//覆盖接口中的compareTo()方法{if(!(obj instanceof Student))throw new RuntimeException("不是学生对象");Student s = (Student)obj;if(this.age > s.age)return 1;if(this.age == s.age){return this.name.compareTo(s.name);}return -1;}public int getAge(){return age;}}

之前尝试过存储一个自定义对象并用迭代器取出,没有发现问题,但是当存储多个自定义对象时,却发现程序有

问题无法运行。原来TreeSet会对每一个存储进去的元素进行自然排序。所以为了让后存入的元素具备可比性,必须

要实现Comparable接口,然后去覆写compareTo()方法之后,程序才正常运行。

需要注意的是,在排序过程中, 如果主要条件相同,一定要再去判断下次要条件,否则就会出现主要条件相同

次要条件不同的元素无法存入的bug。


通过对HashSet和TreeSet两种集合的学习,让我又多掌握了两个集合的相关知识,让我对数组和数据结构方面

的知识理解更为透彻。相信后面还有很多更加复杂的数组和集合等着我去挑战,现在的基础是为了以后学习更加顺

利,加油,努力!~




0 0
原创粉丝点击