一 Set类集合
Set集合中的对象不按特定的方式排序,只是简单的将对象加入到集合中,但是Set集合不能包括重复对象
Set接口继承了Collection接口,因此也包含Collection接口的所有方法
1 Hashset集合
HashSet扩展自AbstractSet并且实现Set接口。
boolean
add(E e)
如果此set中尚未包含指定元素,则添加指定元素。
void
clear( )
从此set中移除所有元素。
object
clone( )
返回此Hashset实例的浅表副本:并没有复制这些元素本身。
boolean
contains (object 0)
如果此set包含指定元素,则返回true。
isEmpty( )
如果此set不包含任何元素,则返回true。
iterator( )
返回对此set中元素进行迭代的迭代器。
remove (bject 0)
如果指定元素存在于此set中,则将其移除。
int
size( )
返回此set中的元素的数量(set 的容量)。
2 HashSet集合特点
public class myjavademo {
public static void main(String []args) {
HashSet<Integer> hs = new HashSet<>();
hs.add(1);
hs.add(2);
hs.add(3);
System.out.println(hs.add(6));
System.out.println(hs.add(6)); //检验HashSet是否允许重复元素加入
System.out.println(hs); //检验HashSet是否有序
}
}
3 放入自定义类型数据出现的问题
class Student{
private String name;
private int id;
public Student(){}
public Student(String name, int id)
{
super();
this.name = name;
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
@Override
public String toString()
{
return "Student [name=" + name + ", id=" + id + "]";
}
}
class Test{
public static void main(String []args) {
HashSet<Student> hs = new HashSet<>();
hs.add(new Student("zhangsan",1));
hs.add(new Student("lisi",2));
hs.add(new Student("wangwu",3));
System.out.println(hs.add(new Student("haha",4)));
System.out.println(hs.add(new Student("haha",4)));
System.out.println(hs);
}
}
结果
true
true
[Student [name=yiyi, id=1], Student [name=wawa, id=4], Student [name=wawa, id=4], Student [name=lili, id=3], Student [name=feifei, id=2]]
4 LinkedHashSet集合
LinkedHashSet继承自HashSet
数据结构 有两个 链表和哈希表
链表保证有序 哈希表保证元素唯一
5 Treeset集合
Itreable 接口 实现该接口可以使用增强for循环
Collection 描述所有集合共性的接口 |
Set接口 无序,不可以重复的集合
HashSet 线程不安全,存取速度快。底层是以hash表实现的。
TreeSet 红-黑树的数据结构,默认对元素进行自然排序(String)。
如果在比较的时候两个对象返回值为0,那么元素重复。
案例:使用TreeSet集合存储字符串元素,并遍历
public class myjavademo {
public static void main(String[] args)
{ TreeSet ts = new TreeSet();
ts.add("ccc");
ts.add("aaa");
ts.add("ddd");
ts.add("bbb");
System.out.println(ts); // [aaa, bbb, ccc, ddd]
}
}
6 Treeset的排序方式
方式一:元素自身具备比较性
元素自身具备比较性,需要元素实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序。
方式二:容器具备比较性
当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重写compare方法,并将该接口的子类实例对象作为参数传递给TreeMap集合的构造方法。
注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;
注意:在重写compareTo或者compare方法时,必须要明确比较的主要条件相等时要比较次要条件。
我们来看一下方式一的案例
public class myjavademo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person("aa", 20, "男"));
ts.add(new Person("bb", 18, "女"));
ts.add(new Person("cc", 17, "男"));
ts.add(new Person("dd", 17, "女"));
ts.add(new Person("dd", 15, "女"));
ts.add(new Person("dd", 15, "女"));
System.out.println(ts);
System.out.println(ts.size()); // 5
}
}
class Person implements Comparable {
private String name;
private int age;
private String gender;
public Person() {
}
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public int hashCode() {
return name.hashCode() + age * 37;
}
public boolean equals(Object obj) {
System.err.println(this + "equals :" + obj);
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender
+ "]"; }
@Override
public int compareTo(Object obj) {
Person p = (Person) obj;
System.out.println(this+" compareTo:"+p);
if (this.age > p.age) {
return 1;
}
if (this.age < p.age) {
return -1;
}
return this.name.compareTo(p.name);
}
}
public class myjavademo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person("aa", 20, "男"));
ts.add(new Person("bb", 18, "女"));
ts.add(new Person("cc", 17, "男"));
ts.add(new Person("dd", 17, "女"));
ts.add(new Person("dd", 15, "女"));
ts.add(new Person("dd", 15, "女"));
System.out.println(ts);
System.out.println(ts.size()); // 5
}
}
class Person implements Comparable {
private String name;
private int age;
private String gender;
public Person() {
}
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public int hashCode() {
return name.hashCode() + age * 37;
}
public boolean equals(Object obj) {
System.err.println(this + "equals :" + obj);
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender
+ "]"; }
@Override
public int compareTo(Object obj) {
Person p = (Person) obj;
System.out.println(this+" compareTo:"+p);
if (this.age > p.age) {
return 1;
}
if (this.age < p.age) {
return -1;
}
return this.name.compareTo(p.name);
}
}
我们再来看一下方式二的案例
public class myjavademo {
public static void main(String[] args) {
TreeSet ts = new TreeSet((Collection) new MyComparator());
ts.add(new Book("语文", 100));
ts.add(new Book("数学", 75));
ts.add(new Book("英语", 50));
ts.add(new Book("历史", 35));
ts.add(new Book("语文", 100));
ts.add(new Book("地理", 100));
System.out.println(ts);
}
}
class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
Book b1 = (Book) o1;
Book b2 = (Book) o2;
System.out.println(b1+" comparator "+b2);
if (b1.getPrice() > b2.getPrice()) {
return 1;
}
if (b1.getPrice() < b2.getPrice()) {
return -1;
}
return b1.getName().compareTo(b2.getName());
}
}
class Book {
private String name;
private double price;
public Book() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Book(String name, double price) {
this.name = name; this.price = price;
}
@Override
public String toString() {
return "Book [name=" + name + ", price=" + price + "]";
}
}
7 LinkedHashSet
会保存插入的顺序。
看到array,就要想到角标。
看到link,就要想到first,last。
看到hash,就要想到hashCode,equals.
看到tree,就要想到两个接口。Comparable,Comparator。