- Set和Collection相比并没有提供更多处理数据的方法,Set中的对象是无序的,可以说Set就是Collection
- 需要指出的是Set中不允许有相同的元素(说明:Set中不是 == 来判断两个元素是否相等的(以前的博文有说明过 == 是比较物理地址的),Set是通过equals()方法和hashCode()来判断的,即equals()返回true,同时hashCode()返回值相同时将两个对象判定为同一个对象)
- HashSet是Set类的主要实现类,以下代码说明了Set如何判定两个对象是否相同
//当向HashSet中存入A,B对象时,只有这连个对象的equals返回为true // 和hashCode一样的时候,HashCode才会把它们当成一个对象 package Set; import java.util.HashSet; class A{ public boolean equals(Object obj){ return true; } } class B{ public int hashCode(){ return 2; } } class C{ public int hashCode(){ return 3; } public boolean equals(Object obj){ return true; } } public class HashSetTest { public static void main(String args[]){ HashSet books = new HashSet(); books.add(new A()); books.add(new A()); books.add(new B()); books.add(new B()); books.add(new C()); books.add(new C()); System.out.println(books); } } //输出结果为 // [Set.B@2, Set.B@2, Set.C@3, Set.A@13b6d03, Set.A@f5f2bb7]
-
介绍一下LinkedHashSet类,LinkedHashSet类就是使用链表来维护集合元素的顺序~~也没啥好特殊的
-
以下为代码实例
//LinkedHashSet就是普通的hashset加上链式结构存储 package Set; import java.util.LinkedHashSet; public class LinkedHashSetTest { public static void main(String args[]){ LinkedHashSet books = new LinkedHashSet(); books.add("java1"); books.add("java2"); System.out.println(books); // 输出 [java1, java2] books.remove("java1"); books.add("java1"); System.out.println(books); // 输出 [java2, java1] } }
-
接下来介绍TreeSet类,TreeSet类最大的特点就是TreeSet集合中的元素排列不是无序的,它将输入的元素按照从小到大的顺序排列(字符类型的按照其Unicode值排序,字符串类型的按照字符串中的字符的Unicode值排序,Boolean类型的按照True大于False,数值型的按照数值大小排序),所以,TreeSet中元素的类型必须是相同的,因为只有相同类型的变量才可以比较。
-
以下是TreeSet类一些方法使用的实例
package Set; import java.util.TreeSet; public class TreeSetTest { public static void main(String args[]){ TreeSet nums = new TreeSet(); nums.add(1); nums.add(2); nums.add(3); nums.add(4); // 这里需要特别指出的是,add()方法中的变量类型应该是一致的,具体的原因是: // TreeSet会对集合里面的每一个元素进行比较,以决定其顺序,这样子的话就需要 // 大部分类在时间comparedTo()(也就是比较的时候),都需要把被比较的对象 // 强制转换为相同的类型,因为只有相同的类的实例才可以比较大小 System.out.println(nums); // 这里需要特别指出:TreeSet并不是通过元素加入TreeSet的顺序来保存元素数据的 // 而是通过元素的大小来保存数据的 System.out.println(nums.first()); // first()方法返回TreeSet里的第一个元素 System.out.println(nums.last()); // last()方法返回TreeSet里的最后一个元素 System.out.println(nums.headSet(4)); // headSet()返回TreeSet中所有不大于参数里的数 System.out.println(nums.subSet(-3,4)); // subSet(arg1,arg2)返回TreeSet中大于大于等于arg1但小于arg2的数 } } //输出结果: // [1, 2, 3, 4] // 1 // 4 // [1, 2, 3] // [1, 2, 3]
-
TreeSet是可以定制排序的,实现方法是在实例化TreeSet的时候提供一个Comparator对象与其相关联,由该Cpmparator管理TreeSet的排列顺序,以下为代码实例
package Set; import java.util.Comparator; import java.util.TreeSet; class M{ int age; public M(int age){ this.age = age; } public String toString(){ return "M[age:" + age + "]"; } } public class TreeSetTest4 { public static void main(String args[]){ TreeSet treeSet = new TreeSet(new Comparator() { @Override public int compare(Object o1, Object o2) { M m1 = (M)o1; M m2 = (M)o2; return m1.age > m2.age ? -1 :m1.age < m2.age ? 1 : 0; // 相当于下面的语句(来自幕后大佬) // if(m1.age > m2.age){ // return -1; // }else if (m1.age < m2.age){ // return 1; // }else { // return 0; // } } }); treeSet.add(new M(5)); treeSet.add(new M(-3)); treeSet.add(new M(9)); System.out.println(treeSet); } }
java集合(3) Set
猜你喜欢
转载自blog.csdn.net/weixin_39452731/article/details/81332009
今日推荐
周排行