set集合
1、集合框架Set(HashSet哈希表存储、重复元素存储底层探究)
(1)元素是无序(存入和取出的顺序不一定一致),元素不可以重复;
结果:
(2)针对基本数据类型以及String,引用数据类型去重需要重写hashcode以及equels 方法:
package com.Liuyujian;
import java.util.HashSet;
public class SetDemo {
public static void main(String[] args) {
HashSet hs = new HashSet<>();
hs.add(new preson("zs", 12));
hs.add(new preson("ls", 22));
hs.add(new preson("ww", 21));
hs.add(new preson("mz", 18 ));
hs.add(new preson("zs", 12));
System.out.println(hs.size());
}
}
class preson implements Comparable<preson>{
private String name;
private int 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 preson(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
System.out.println("来了老弟"+this.getName());
return this.getName().hashCode()+this.age;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if(obj instanceof preson) {
preson p= (preson)obj;
System.out.println(this.getName()+"比较"+p.getName());
return this.getName().equals(p.getName())
&& this.getAge()==p.getAge();
}
return false;
}
@Override
public int compareTo(preson o) {
// TODO Auto-generated method stub
int num=this.getAge()-o.getAge();
if(num==0) {
return this.getName().compareTo(o.getName());
}
return num;
}
@Override
public String toString() {
return "preson [name=" + name + ", age=" + age + "]";
}
}
结果:
2:1、TreeSet自然排序
(1)TreeSet可以对set集合中元素进行排序
public static void main(String[] args) {
//排序
TreeSet ts= new TreeSet<>();
ts.add("zs");
ts.add("ls");
ts.add("ww");
ts.add("mz");
Iterator it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
结果:
(2)针对于数据排序:
第一种方式:实现comparable 接口,让元素自身具备比较性;
class preson implements Comparable<preson>{
private String name;
private int 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 preson(String name, int age) {
this.name = name;
this.age = age;
}
结果:
(3):实现comparato接口,让容器具有比较性,针对于之前的需求发生改变
:正数:代表后面的比前面的大
:负数
this代表还没有存放到容器中的对象
@Override
public int compareTo(preson o) {
// TODO Auto-generated method stub
int num=this.getAge()-o.getAge();
if(num==0) {
return this.getName().compareTo(o.getName());
}
return num;
}
3、泛型简介
(1)将运行时的错误转换到编译期;
1:错误演示:
HashSet hs=new HashSet<>();
hs.add(22);
hs.add(23);
hs.add(34);
hs.add(25);
hs.add("zs");
Iterator it = hs.iterator();
while(it.hasNext()) {
Object obj=it.next();
int i=(Integer)obj;
if(i%2==0) {
System.out.println(i);
}
}
}
结果
2:正确演示
:提升了代码的健壮性,简化了代码
package com.Liuyujian;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
/**
*
*
*
*/
public class HashsetDemo {
public static void main(String[] args) {
HashSet hs=new HashSet<>();
hs.add(22);
hs.add(23);
hs.add(34);
hs.add(25);
hs.add("zs");
Iterator it = hs.iterator();
while(it.hasNext()) {
Object obj=it.next();
if(obj instanceof Integer) {
int i=(Integer)obj;
if(i%2==0) {
System.out.println(i);
}
}
}
}
}
结果: