19
2018
12

JAVA学习-java集合之HashSet、TreeSet使用

java集合之HashSet、TreeSet使用

Set容器的特点

Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序。

最常用的两个Set接口的实现类是HashSet和TreeSet

HashSet及常用方法

HashSet扩展AbstractSet并且实现Set接口,底层封装HashSet,使用了HashSet的Key

HashSet使用散列表进行存储

构造方法:

HashSet()

HashSet(Collection m)

HashSet(int capacity)

HashSet(int capacity,float fillRato)//fillRato为填充因子,默认0.75

散列集合没有确保其元素的顺序,因为散列处理通常不参与排序

TreeSet及常用方法

TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储,访问和检索很快

在存储了大量需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择

构造方法:

TreeSet()

TreeSet(Collection c)

TreeSet(Comparator comp) //可参考TreeMap的使用

TreeSet(SortedSet ss)

TreeSet底层使用的是TreeMap,只是使用了TreeMap的Key


demo:

package pkg1.set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
public class HashSetDemo {
public static void main(String[] args) {
test1();
test2();
}
public static void test1(){
HashSet<String> data=new HashSet<String>();
data.add("jack");
data.add("john");
data.add("rose");
System.out.println(data.add("john"));//重复对象添加失败,返回false
System.out.println(data);
HashSet<Student> stuSet=new HashSet<Student>();
stuSet.add(new Student("张三",12));
stuSet.add(new Student("李四",18));
System.out.println(stuSet.add(new Student("张三",12)));//重复对象添加失败,返回false
//用迭代器和增强for循环输出都行
Iterator<Student> it = stuSet.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("---------------------------");
}
public static void test2(){
TreeSet<Person> pset=new TreeSet<Person>(
/*
// 参数实现Comparator接口与对象中实现Comparable接口效果一样
new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int temp = o1.getAge() - o2.getAge();
if (temp > 0)
return 1;
else if (temp < 0)
return -1;
else
return o1.getName().compareTo(o2.getName());
}
}
*/
);
pset.add(new Person("person1",15));
pset.add(new Person("person2",15));
pset.add(new Person("person1",18));
pset.add(new Person("person2",15));//相同的项会添加失败
for(Person p:pset){//增强for循环输出信息
System.out.println(p);
}
}
}
class Student{
private String name;
private int age;
public Student(String name, int age) {
super();
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;
}
//重写 hashCode()和equals()方法,HashSet中处理才会当成同一对象
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public String toString(){
return name+" "+age;
}
}
//作为TreeSet的类型参数时,必须实现Comparable<T>接口或在定义TreeMap对象时传入比较方法的实现
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
super();
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;
}
public String toString() {
return name + " " + age;
}
@Override
public int compareTo(Person o) {// 自定义排序 ,按年龄从小到大
if (o == null)
return 1;
// 先按年龄比较,再按姓名比较
int temp = age - o.getAge();
if (temp > 0)
return 1;
else if (temp < 0)
return -1;
else
return name.compareTo(o.name);
}
}

效果:



版权声明:
作者:真爱无限 出处:http://www.pukuimin.top 本文为博主原创文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.
« 上一篇下一篇 »

相关文章:

评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。