java集合框架(set)
Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。 如果元素的HashCode值相同,才会判断equals是否为true。 如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
Set集合的功能和Collection是一致的。
下面代码演示了hashset的使用方法:
1 package com.itheima.day14; 2 3 import java.util.*; 4 5 public class HashSetDemo { 6 7 /** 8 * hashset的存储是不重复了 9 */ 10 public static void sop(Object obj){ 11 System.out.println(obj); 12 } 13 14 public static void main(String[] args) { 15 HashSet hs=new HashSet(); 16 hs.add("java1"); 17 hs.add("java2"); 18 hs.add("java1"); 19 hs.add("java2"); 20 21 Iterator it=hs.iterator(); 22 23 while(it.hasNext()){ 24 sop(it.next()); 25 } 26 27 } 28 29 }
实例二:传入类 保证类的唯一性
package com.itheima.day14; import java.util.HashSet; import java.util.Iterator; public class HashSetTest { /** * 往hashSet集合中存入自定对像 * 姓名和年龄相同为同一个人,重复元素。 */ public static void sop(Object obj){ System.out.println(obj); } public static void main(String[] args) { HashSet hs=new HashSet(); hs.add(new person("zhangsan",25)); hs.add(new person("lisi",26)); hs.add(new person("whangwu",27)); hs.add(new person("zhangsan",25)); Iterator it=hs.iterator(); while(it.hasNext()){ person p=(person)it.next(); sop(p.getName()+p.getAge()); } } } class person{ private String name; private int age; person(String name, int age){ this.name=name; this.age=age; } //重写object的equals方法 public boolean equals(Object obj){ if(!(obj instanceof person)){ return false; } person p=(person)obj; System.out.println(this.name+"...equals.."+p.name); return this.name.equals(p.name)&& this.age==p.age ; } //重写hashcode方法 public int hashCode() { System.out.println(this.name+"....hashCode"); return name.hashCode()+age*37; } 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; } }
TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。 保证元素唯一性的依据: compareTo方法return 0.
TreeSet排序的第一种方式:
让元素自身具备比较性。 元素需要实现Comparable接口,覆盖compareTo方法。 也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。 这时就需要让集合自身具备比较性。 在集合初始化时,就有了比较方式。
package com.itheima.day15; import java.util.Iterator; import java.util.TreeSet; public class TerrSetDemo { /** * 需求: * 往TreeSet集合中存储自定义对象学生。 * 想按照学生的年龄进行排序 */ public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.add(new student("lisi02",22)); ts.add(new student("lisi007",20)); ts.add(new student("lisi09",19)); ts.add(new student("lisi08",19)); ts.add(new student("lisi007",20)); ts.add(new student("lisi01",40)); Iterator<student> it = ts.iterator(); while(it.hasNext()) { student stu = (student)it.next(); System.out.println(stu.getName()+"..."+stu.getAge()); } } } class student implements Comparable{ private String name; private int age; student (String name ,int age){ this.name=name; this.age=age; } public int compareTo(Object obj){ if(!(obj instanceof student)){ return 0; } student s = (student)obj; System.out.println(this.name+"....compareto....."+s.name); if(this.age>s.age) return 1; if(this.age==s.age) { return this.name.compareTo(s.name); } return -1; } 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; } }