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两种集合的学习,让我又多掌握了两个集合的相关知识,让我对数组和数据结构方面
的知识理解更为透彻。相信后面还有很多更加复杂的数组和集合等着我去挑战,现在的基础是为了以后学习更加顺
利,加油,努力!~
- HashSet和TreeSet的相关总结和整理
- HashSet和TreeSet的区别
- HashSet和TreeSet的区别
- HashSet和TreeSet的区别
- HashSet和TreeSet的区别
- HashSet和TreeSet的区别
- HashSet和TreeSet的区别
- set的hashset和treeSet
- HashSet和TreeSet的区别
- HashSet和TreeSet的区别
- HashSet和TreeSet的分析
- hashset和treeset的比较
- HashSet,和TreeSet的区别
- HashSet 和 TreeSet 的区别
- HashSet和TreeSet的区别
- TreeSet和HashSet的问题
- HashSet和TreeSet的比较
- JAVA数据结构之HashSet和TreeSet总结
- 关于热血传奇actor绘制的分析与思考
- linux yum命令详解
- 五彩趣味运动会的起源与发展
- Struts2+Hibernate+Spring整合
- 无dll注入游戏拦截函数截取封包
- HashSet和TreeSet的相关总结和整理
- 项目启动时报错:Unsupported major.minor version 51.0
- Oracle获取系统时间及格式化
- Karp的21个NPC问题及其规约
- LA 3027 Corporative Network
- 关于Linq使用过程中遇见的一些小问题的总结
- java堆栈获取后缀表达式
- memcached完全剖析–1. memcached的基础
- 2 Xcode5(2)