【校招VIP】Set接口以及实现子类HashSet、LinkedHashSet、TreeSet

08月04日 收藏 0 评论 0 java开发

【校招VIP】Set接口以及实现子类HashSet、LinkedHashSet、TreeSet

转载声明:文章链接:https://blog.csdn.net/dagedeshu/article/details/86602515

Set接口是Collection的子接口,set接口没有提供额外的方法
Set集合不允许包含相同的元素,如果试把两个相同元素加入同一个 Set集合中,则添加操作失败。
Set判断两个对象是否相同不是使用==运算符,而是根据equals方法。
hashSet:
hashSet是Set接口的典型实现,大多数时候使用Set集合都使用这个实现类。
hashset按hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet特点:
不能保证元素的排列顺序
hashset不是线程安全的
集合元素可以是null
当像Hashset集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值来决定对该对象在HashSet中存储位置。
HashSet集合判断两个元素相等的标准:两个对象通过hashCode()方法比较相等,并且两个对象的equals方法返回值也相等。

package com.xatu.集合;

import java.util.HashSet;
import java.util.Set;


import org.junit.Test;

public class SetTest {
@Test
public void test() {
Set s = new HashSet();
s.add(new Integer(100));
System.out.println("tisnjis"+s.add(150));
System.out.println("tinajia2"+s.add(150));
s.add("dfd");
s.add(new String("dfd"));//判断对象是否相等equals
s.add(new String("xxx"));
s.add(new Object());

System.out.println("集合中有"+s.size());
System.out.println("是否含150"+s.contains(150));
System.out.println("---------------");
//遍历集合
for (Object object : s) {
System.out.println(object);
}

}

}

LinkedHashSet 是 HashSet 的子类
LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
LinkedHashSet 不允许集合元素重复。
TreeSet是SortSet接口的实现类,TreeSet可以确保集合元素处于排序状态。
TreeSet两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序

package com.xatu.集合;

import java.util.Set;
import java.util.TreeSet;

import org.junit.Test;

public class TreeSetTest {
@Test
public void testTerrSet() {
Set<Integer> set = new TreeSet<Integer>();//要实现自然排序,类型相同
set.add(200);
//set.add("100");
set.add(100);
set.add(20);
set.add(230);
System.out.println(set);

}
}

自然排序:TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序排列
如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。
实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。
Comparable 的典型实现:
BigDecimal、BigInteger 以及所有的数值型对应的包装类:按它们对应的数值大小进行比较
Character:按字符的 unicode值来进行比较
Boolean:true 对应的包装类实例大于 false 对应的包装类实例
向 TreeSet 中添加元素时,只有第一个元素无须比较compareTo()方法,后面添加的所有元素都会调用compareTo()方法进行比较。
因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同一个类的对象
对于 TreeSet 集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过 compareTo(Object obj) 方法比较返回值
当需要把一个对象放入 TreeSet 中,重写该对象对应的 equals() 方法时,应保证该方法与 compareTo(Object obj) 方法有一致的结果:如果两个对象通过 equals() 方法比较返回 true,则通过 compareTo(Object obj) 方法比较应返回 0
String:按字符串中字符的 unicode 值进行比较 Date、Time:后边的时间、日期比前面的时间、日期大
向 TreeSet 中添加元素时,只有第一个元素无须比较compareTo()方法,后面添加的所有元素都会调用compareTo()方法进行比较。
因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同一个类的对象
对于 TreeSet 集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过 compareTo(Object obj) 方法比较返回值
当需要把一个对象放入 TreeSet 中,重写该对象对应的 equals() 方法时,应保证该方法与 compareTo(Object obj) 方法有一致的结果:如果两个对象通过 equals() 方法比较返回 true,则通过 compareTo(Object obj) 方法比较应返回 0
定制排序:
TreeSet的自然排序是根据集合元素的大小,进行元素升序排列。如果需要定制排序,比如降序排列,可通过Comparator接口的帮助。需要重写compare(T o1,T o2)方法。
利用int compare(T o1,T o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。
此时,仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。
使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。

C 0条回复 评论

帖子还没人回复快来抢沙发