集合框架(3)
Set子接口
特点:无序、无下标、元素不可重复。
方法:全部继承自Collection中的方法。
package United;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
//测试Set接口的使用
public class Demo08 {
public static void main(String[] args) {
//创建集合
Set<String> a = new HashSet<>();
//添加数据
a.add("华为");
a.add("魅族");
a.add("小米");
System.out.println("数据个数:"+a.size());
System.out.println(a);
//删除数据
//a.remove("华为");
//System.out.println(a);
//遍历
for (String s:a) {
System.out.println(s);
}
System.out.println("==================");
Iterator<String> b = a.iterator();
while (b.hasNext()){
System.out.println(b.next());
}
//判断
System.out.println(a.contains("华为"));
System.out.println(a.isEmpty());
}
}
HashSet【重点】
基于HashCode计算元素存放位置。
当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
存储结构:哈希表(数组+链表+红黑树)
存储过程:
- 根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
- 再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表
package United;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Person[name="+name+",age="+age+"]";
}
@Override
public int hashCode() {
int n1 = this.name.hashCode();
int n2 = this.age;
return n1+n2;
}
@Override
public boolean equals(Object obj) {
if (this==obj){
return true;
}
if (obj==null){
return false;
}
if (obj instanceof Person){
Person p = (Person) obj;
if (this.name.equals(p.getName())&&this.age==p.getAge()){
return true;
}
}
return false;
}
}
package United;
import java.util.HashSet;
import java.util.Iterator;
//HashSet集合的使用(2)
/*
存储过程:
1. 根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
2. 再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表
*/
public class Demo0902 {
public static void main(String[] args) {
//创建集合
HashSet<Person> a = new HashSet<>();
//添加数据
Person p1 = new Person("邱淑贞",45);
Person p2 = new Person("张柏芝",43);
Person p3 = new Person("章子怡",42);
a.add(p1);
a.add(p3);
a.add(new Person("张柏芝",43));//这里重写了Person中的HashCode方法,所以能添加进来(在没有重写equals方法的时候),重写了equals后不能加进来equals判断比HashCode高层级
a.add(p2);//重复元素不能添加
System.out.println("元素的个数:"+a.size());
System.out.println(a.toString());
//删除数据
//a.remove("张柏芝");
//System.out.println("删除之后:"+a.size());
//遍历
for (Person p:a) {
System.out.println(p);
}
System.out.println("=======================");
Iterator<Person> b = a.iterator();
while (b.hasNext()){
System.out.println(b.next());
}
//判断
System.out.println(a.contains("张柏芝"));
System.out.println(a.isEmpty());
}
}
TreeSet
基于排列顺序实现元素不重复。
实现了SortedSet接口,对集合元素自动排序。
元素对象的类型必须实现Comparable接口,指定排序规则。
通过CompareTo方法确定是否为重复元素。
package United;
import java.util.Iterator;
import java.util.TreeSet;
//TreeSet的使用
public class Demo10 {
public static void main(String[] args) {
//创建集合
TreeSet<String> a = new TreeSet<>();
//添加元素
a.add("xyz");
a.add("def");
a.add("abc");
System.out.println("元素个数:"+a.size());
System.out.println(a);
//删除数据
//a.remove("xyz");
//遍历
for (String s:a) {
System.out.println(s);
}
System.out.println("====================");
Iterator<String> b = a.iterator();
while (b.hasNext()){
System.out.println(b.next());
}
//判断
System.out.println(a.contains("xyz"));
System.out.println(a.isEmpty());
}
}
package United;
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Person[name="+name+",age="+age+"]";
}
//先按姓名比再按年龄比
@Override
public int compareTo(Person o) {
int n1 = this.getName().compareTo(o.getName());
int n2 = this.age-o.getAge();
return n1 == 0?n2:n1;
}
}
package United;
import java.util.Iterator;
import java.util.TreeSet;
//使用TreeSet保存数据
//要求:元素必须实现Comparable接口,compareTo();方法返回值为0,认为是重复元素
public class Demo11 {
public static void main(String[] args) {
//创建集合
TreeSet<Person> a = new TreeSet<>();
//添加元素
Person p1 = new Person("邱淑贞",45);
Person p2 = new Person("张柏芝",43);
Person p3 = new Person("章子怡",42);
a.add(p1);
a.add(p2);
a.add(p3);
System.out.println("元素个数:"+a.size());
System.out.println(a);
//删除
//a.remove(p1);
//遍历
for (Person p:a) {
System.out.println(p);
}
System.out.println("=====================");
Iterator<Person> b = a.iterator();
while (b.hasNext()){
System.out.println(b.next());
}
//判断
System.out.println(a.contains(new Person("章子怡",42)));
System.out.println(a.isEmpty());
}
}
package United;
import java.util.Comparator;
import java.util.TreeSet;
//TreeSet集合的使用
//Comparator:实现定制比较(比较器)
public class Demo12 {
public static void main(String[] args) {
//创建集合并指定规则
TreeSet<Person> a = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int n1 = o1.getAge()- o2.getAge();
int n2 = o1.getName().compareTo(o2.getName());
return n1==0?n2:n1;
}
});
Person p1 = new Person("邱淑贞",45);
Person p2 = new Person("张柏芝",43);
Person p3 = new Person("章子怡",42);
a.add(p1);
a.add(p2);
a.add(p3);
System.out.println("元素的个数:"+a.size());
System.out.println(a);
}
}
TreeSet案例
package United;
import java.util.Comparator;
import java.util.TreeSet;
//TreeSet案例
//要求:实现字符串按照长度进行排序
//helloworld zhang lisi wangwu beijing xian nanjing
public class Demo13 {
public static void main(String[] args) {
//创建集合,并指定比较规则
TreeSet<String> a = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int n1 = o1.length()-o2.length();
int n2 = o1.compareTo(o2);
return n1==0?n2:n1;
}
});
a.add("helloworld");
a.add("zhang");
a.add("lisi");
a.add("wangwu");
a.add("beijing");
a.add("xian");
a.add("nanjing");
System.out.println(a);
}
}