补充上一日:HashCode方法默认返回的是内存地址,String类已经重写了对象的HashCode方法
方法细节:取出数组中的值或字符串的值按照规定计算返回一个值,如果两个字符串内容一致就会返回相同的HashCode码
TreeSet
treeSet添加自定义元素注意事项
1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素
的比较规则定义在compareTo(T o)方法上。
3. 如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加.(注意:TreeSet与HashCode、equals方法是没有任何关系。)
4. 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个
比较器,
//自定义比较器的格式 : class 类名 implements Comparator{ public int compare(To o1, To o2) {
return o1.id-o2.id;
}
}
5. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口, 在创建TreeSet对象的时候也传入了比较器
那么是以比较器的比较规则优先使用。
推荐使用:使用比较器(Comparator)。,使得其他类也可以用,提高复用性
import java.util.Comparator; import java.util.TreeSet; class gongzitiao implements Comparable<gongzitiao>{ int id; String name; int salary; public gongzitiao(int id, String name, int salary) { super(); this.id = id; this.name = name; this.salary = salary; } @Override public String toString() { return "{ 编号:"+ this.id+" 姓名:"+ this.name+" 薪水:"+ this.salary+"}"; } public int compareTo(gongzitiao o) { return this.salary- o.salary; } } //自定义比较器 class MyComparator implements Comparator<gongzitiao>{ @Override public int compare(gongzitiao o1, gongzitiao o2) { return o1.id-o2.id; } } public class Demo1 { public static void main(String[] args) { MyComparator comparator = new MyComparator(); TreeSet tree = new TreeSet(comparator); tree.add(new gongzitiao(114, "李杰", 520)); tree.add(new gongzitiao(117, "嘻嘻", 250)); tree.add(new gongzitiao(141, "李英", 258)); tree.add(new gongzitiao(120, "李汉三", 2580)); System.out.println(tree); } }
TreeSet存储原理
底层是使用红黑树(二叉树)数据结构实现的
存储规则:左小右大
当重复元素加入时 treeSet调用compareTo方法,返回值如果是零就视为重复元素,就无法加入二叉树中。
注意:如果加入三组数据无法形成二叉树结构就会发生下面变化
目的:减少比较次数
TreeSet对字符串进行排序
原因:因为字符串已经实现了Comparable接口所以可以排序
字符串的比较规则:
一、 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。
二、对应位置上 的字符都一样,比较的就是字符串的长度。
public class Demo2 { public static void main(String[] args) { /*TreeSet tree = new TreeSet(); tree.add("abcccccccccccccccccc"); tree.add("abc"); System.out.println(tree);*/ System.out.println("abw".compareTo("abcccccccccccc")); } }
作业:将字符串中的数值进行排序。
例如String str="8 10 15 5 2 7"; ----> "2 5 7 8 10 15"
import java.util.Iterator; import java.util.TreeSet; public class Demo3 { public static void main(String[] args) { String str="8 10 15 5 2 7"; String[] data = str.split(" "); TreeSet tree = new TreeSet(); for(int i = 0 ; i<data.length ; i++){ tree.add(Integer.parseInt( data[i])); } Iterator it = tree.iterator(); while(it.hasNext()){ System.out.print(it.next()+" "); } } }