标签:自动生成 iter set tps 不同 logs 自定义 com 不一致
Set接口中没有定义额外的新的方法,使用的都是Collection中声明的方法
无序的,不可重复的数据
无序性
不可重复性
向Set中添加数据,其所在的类一定要重写hashCode()和equals()方法,两个方法可以自动生成
(如果没有重写hashCode()方法,相当于系统随机安排一个数字给该元素的hash值,即使两个元素相同,但是他们的hash值不同,还是会添加到数组中。重写hashCode(),两个元素的hash值根据同一个逻辑算出)
重写的hashCode()和equals()方法尽可能保持一致性
相等的对象必须具有相等的散列码(哈希值)
自动生成的hashCode()方法中会出现31这个系数的原因
(hashSet底层是一个数组,长度为16)
底层:数组 + 链表
如果此位置没有其他元素,则元素a添加成功
如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较a与元素b的哈希值
(存放位置相同的两个元素哈希值不一定相同)
两个元素的hash值不同或者equals返回false时,元素a与已经存在指定索引位置上的数据以链表的方式存储
注意:即使遍历出的数据顺序是按照添加顺序显示的,但是LinkedHashHashSet中的数据特点依旧是无序的,不可重复的
注意:向TreeSet中添加的数据,要求是相同类的对象
https://www.cnblogs.com/CrabDumplings/p/13339146.html
比较两个函数是否相同的标准为compareTo()方法返回0,不再是equals()方法
//Students类中的compareTo方法,按照名字进行排序
public int compareTo(Object o) {
if(o instanceof Students){
Students s = (Students)o;
return this.name.compareTo(s.name);
}else{
throw new RuntimeException("传入数据类型不一致");
}
}
//测试函数
public void test13(){
TreeSet set = new TreeSet();
set.add(new Students("Tom",18,90));
set.add(new Students("Ann",19,75));
set.add(new Students("Lisa",20,86));
set.add(new Students("Jack",21,50));
set.add(new Students("Jerry",19,60));
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
运行结果
排序的信息有相同的情况(名字相同,其他信息不相同)
利用二次排序
按照名字进行比较,如果名字相同,在compareTo中比较返回值为0(TreeSet中判断是否相同的标准不再是equals,而是compareTo)
//姓名从小到大排列,姓名相同的年龄从小到大排列
@Override
public int compareTo(Object o) {
if(o instanceof Students){
Students s = (Students)o;
// return this.name.compareTo(s.name);
int compare = this.name.compareTo(s.name);
//姓名不一样
if(compare != 0){
return compare;
}else {
//姓名一样
return Integer.compare(this.age,s.age);
}
}else{
throw new RuntimeException("传入数据类型不一致");
}
@Test
public void test13(){
TreeSet set = new TreeSet();
set.add(new Students("Tom",18,90));
set.add(new Students("Ann",19,75));
set.add(new Students("Lisa",20,86));
set.add(new Students("Jack",21,50));
set.add(new Students("Jerry",19,60));
set.add(new Students("Jerry",22,70));
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
运行结果
在定制排序中,比较两个对象是否相同的标准为compare(),是否返回0,不再是equals()方法
TreeSet set = new TreeSet();
构造器没有参数的时候直接为自然排序
TreeSet set = new TreeSet(com);
构造器有蚕食的时候,按照com的定制排序进行排序
//年龄从小到大进行排序
public void test14(){
Comparator com = new Comparator() {
//按照年龄从小到大排列
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Students || o2 instanceof Students){
Students s1 = (Students)o1;
Students s2 = (Students)o2;
return Integer.compare(s1.getAge(),s2.getAge());
}else{
throw new RuntimeException("传入数据类型不一致");
}
}
};
TreeSet set = new TreeSet(com);
set.add(new Students("Tom",18,90));
set.add(new Students("Ann",19,75));
set.add(new Students("Lisa",20,86));
set.add(new Students("Jack",21,50));
set.add(new Students("Jerry",19,60));
set.add(new Students("Jerry",22,70));
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
运行结果
public void test14(){
Comparator com = new Comparator() {
//按照年龄从小到大排列
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Students || o2 instanceof Students){
Students s1 = (Students)o1;
Students s2 = (Students)o2;
// return Integer.compare(s1.getAge(),s2.getAge());
int compare = Integer.compare(s1.getAge(), s2.getAge());
if(compare != 0){
return Integer.compare(s1.getAge(),s2.getAge());
}else{
return s1.getName().compareTo(s2.getName());
}
}else{
throw new RuntimeException("传入数据类型不一致");
}
}
};
TreeSet set = new TreeSet(com);
set.add(new Students("Tom",18,90));
set.add(new Students("Ann",19,75));
set.add(new Students("Lisa",20,86));
set.add(new Students("Jack",21,50));
set.add(new Students("Jerry",19,60));
set.add(new Students("Jerry",22,70));
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
运行截图
标签:自动生成 iter set tps 不同 logs 自定义 com 不一致
原文地址:https://www.cnblogs.com/CrabDumplings/p/13390443.html