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;
}
}

浙公网安备 33010602011771号