目录
初识TreeSet:
一、深入了解TreeSet的“有序”
1.1 排序的分类:?
1.1.1? 利用系统定义的类的存储原理如下:
1.1.2? 自定义类“排序”原理如下:
?二、关于输出(Iterator()方法返回的迭代器)
2.1?迭代器分类与工作原理
四、自定义类的完整代码:
初识TreeSet:
- 是一种基于TreeMap,使用的自然存储方式来进行数据存储(前提:是系统自带的类)而有序的类。
- 而其底层实现是有序的二叉树。
- 属于Set接口的实现类(继承了一些特性),但是有别于他的兄弟(HashSet-的无序存储)
一、深入了解TreeSet的“有序”
Q1:"TreeSet"的“有序”底层逻辑是什么?有什么特别的地方吗?
1.1 排序的分类:?
- 使用的系统定义的类:根据首字符(汉字,字符)ASCII码来存储
- 自定义的类:自己在“自定义类”中重写的CompareTo()方法来排序?
????????1.1.1? 利用系统定义的类的存储原理如下:
?主要是通过Comparable接口来实现(底层会自动排序)
?上代码:
public static void main(String[] args) {
//先创建一个 TreeSetText的对象 此示范将泛型指定为String
TreeSet<String> treeSet = new TreeSet<>();
//往treeSet集合中添加数据
treeSet.add("世俗的许多东西,虽耀眼却无价值");
treeSet.add("没有人比我更爱学习");
treeSet.add("好事多磨");
//为了方便体会其有序,我们使用英文进行测试
treeSet.add("D");
treeSet.add("A");
treeSet.add("C");
treeSet.add("B");
//接着使用forEach循环进行遍历输出
for (String s:treeSet) {
System.out.println(s);
}
}
结果:
总结:
????????1.可以看出,字母,汉字的顺序都变了。
????????2.这因为在存储的过程中,他会根据首字符(英文,汉字)的ASCII码进行排序然后才是存储
(2条消息) Ascii完整码表(256个)_ttmice的专栏-CSDN博客_aiisc码表
1.1.2? 自定义类“排序”原理如下:
// 通过自定义的Person调用compareTo()方法,然后把另一个需要比较的Person传过来
// --Person会自动调用compareTo()方法,将每一个录入的新传入的对象,都与旧的对象进行比较
实现如图:o(* ̄▽ ̄*)o (别忘了敲一下哦,注意返回的数据)(完整代码在最后,自己敲不出来才看)
@Override
public int compareTo(Person o) {
// 其实就是在拿 this和 o对象 进行比较 -比较的规则是自定义的
//---返回的数据:负数代表this小,零代表一样大,正数代表this大
//-在此方法中,根据age属性来进行比较
if (this.age>o.age){
return 1;
}else if (this.age==o.age){
//一样大,不存。 因为set是不存储重复的数据的
return 0;
}
return -1 ;
}
大佬不用??注意:
????????1.? //---返回的数据:负数代表this小,零代表一样大,正数代表this大
? ? ? ? 2.在调用时 泛型里面应该是,自定义类的类名。
? ? ? ? ? ? ? ? ① 格式:? ?TreeSet<自定义的类> treeSet = new TreeSet<>();?
? ? ? ? ? ? ? ? ② 接下来就是创建对象,然后添加数据。输出的结果就是自定义的了。
? ? ? ? 3. 自定义类应当继承Comparable,并指定泛型类型。
? ? ? ? ? ? ? ? ① 格式:? ?static class Person implements Comparable<Person>{
?二、关于输出(Iterator()方法返回的迭代器)
首先,我们要知道Iterator()方法返回的迭代器是快速失败的。?
2.1?迭代器分类与工作原理
关于失败:在Java中,只要集合的大小在遍历时发生了改变,我们就称其为失败 。
1、快速失败:
? ????????迭代器在遍历的时候,遍历的是集合本身。且有一个记录遍历到哪一个数据的变量
??????????在遍历时有其他的操作导致-集合大小-发生了变化,而此时的迭代器无法做出正确反映,就会抛出异常。 这抛出异常的过程就是快速失败。
2、安全失败 :
??????????指的是这个失败不会出错(即不会抛出异常)。
? ? ? ? ? 原理:在遍历前先把集合复制了一份,安全失败遍历的复制的那份。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ps:感谢您看到了这里。如果文章有错,或者其他的建议,欢迎私信或者评论,作者会认真听取的!
“耐心和坚持总是奇迹般地扫除一切困难和障碍”,一起加油吧(′v`)
最后,如果觉得这篇文章有用,希望您能点个赞鼓励一下萌新作者,如果有评论、收藏和关注就更好了(o???),灰常感谢~~
四、自定义类的完整代码:
import java.util.Objects;
import java.util.TreeSet;
public class TreeSetText2 {
//TreeSetText 使用的是自然排序,来进行数据的存储时的排序
//--有序,指的不是根据数据存储的顺序进行的排列,而是根据的 -数据的顺序进行排序
// -排列的依据(系统定义的类)是ask码(通过Comparable来实现,即转成Comparable类),(自定义的类)根据自己重写的Comparable()方法进行排序
public static void main(String[] args) {
//先创建一个 TreeSetText的对象 并将泛型指定为String
TreeSet<Person> treeSet = new TreeSet<>();
//在使用自定义的类时,如何进行排序?
// -----排序测试开始
//1.先给自定义类创建对象以及给对象里的属性赋值
Person p1 = new Person("张三",19);
Person p2 = new Person("李四",20);
Person p3 = new Person("王二五",21);
//2.创建的对象添加到集合中 需要注意的误区,因为add()方法是Collection接口自带的,因此,只有其子类可以使用 -自定义类的对象无法调用
treeSet.add(p1);
treeSet.add(p2);
treeSet.add(p3);
}
static class Person implements Comparable<Person>{
private String name;
private int age;
// 通过自定义的Person调用compareTo()方法,然后把另一个需要比较的Person传过来
// --Person会自动调用compareTo()方法,将每一个录入的新传入的对象,都与旧的对象进行比较
// -Q 假如旧的数据很多呢?
@Override
public int compareTo(Person o) {
// 其实就是在拿 this和o对象 进行比较 -比较规则自定义
// 返回的数据:负数this小/零一样大/正数this大
//--在此方法中,根据age属性来进行比较
if (this.age>o.age){
return 1;
}else if (this.age==o.age){
//一样大,不存。 因为set是不存储重复的数据的
return 0;
}
return -1 ;
}
//设置一个两参的构造方法,让我们可以更好的去创建对象
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//用于打印,可以准确的描述对象的内容
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
|