set集合框架
一:集合特点
1:set集合是不重复的
public class dome {
public static void main(String[] args) {
/**
* set集合特点
* 1:----set集合是不重复的
*/
//新建set集合
Set<String> s=new HashSet<String>();
s.add("a");
s.add("b");
s.add("c");
s.add("a");
System.out.println(s);
}
}
输出结果如下:
从输出结果可以看出之前依次输入[a,b,c,a]
但结果只有[a,b,c]可以得出set集合是不重复的。
2:set集合是无序的
public class dome1 {
public static void main(String[] args) {
/**
* set集合特点
* 2:----set集合是无序的
*/
//新建set集合
Set<String> s=new HashSet<String>();
s.add("d");
s.add("b");
s.add("f");
s.add("r");
System.out.println(s);
}
}
输出结果如下:
依次输入的结果为 [d ,b ,f ,r] 但得到的是[b ,r ,d ,f] 可得set集合是无序的
二:set集合的遍历方式
set集合的遍历方式就fore循环和迭代器
public class dome1 {
public static void main(String[] args) {
/**
* set集合特点
* 2:----set集合是无序的
*/
//新建set集合
Set<String> s=new HashSet<String>();
s.add("d");
s.add("b");
s.add("a");
s.add("c");
//set集合的遍历方式
//1:fore循环
for (String string : s) {
System.out.println(string);
}
//2:迭代器
Iterator<String> it=s.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
三:HashSet哈希表储存.重复元素储存底层探究
set集合去重复分不同情况
上面第一个是对string类型的值进行了去重复调用的是equals()方法
还有是调用分别调用hashcode()和equals()
public class dome2 {
public static void main(String[] args) {
Set<Object> s=new HashSet<Object>();
s.add(new student("xxx", 18));
s.add(new student("yyy", 18));
s.add(new student("zzz", 18));
s.add(new student("xxx", 18));
for (Object object : s) {
System.out.println(object);
}
}
}
//新建一个学生类
public class student {
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 student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public student() {
// TODO Auto-generated constructor stub
}
@Override
public int hashCode() {
System.out.println("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) {
System.out.println("equals方法被调用");
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;
}
@Override
public String toString() {
return "student [name=" + name + ", age=" + age + "]";
}
}
如图所示 set集合每次增加数据都是new student("zzz", 18);就是新建一个student不管他们的值是否相同但是他们地址不同就不是同一个对象
但如果重写了equals()那么就会判断值是否有相同的
例:假设有两个长的一模一样的人,名字相同,相貌相同,年龄相同什么都相同但他们始终不是同一个人
当把hashcode()返回的地址不同时 输出的结果前四个显示hashcode()方法被调用说明是先进行hashcode()方法的判断判断是否有形同的地址
set.add(new student("xxx", 18));
set.add(new student("yyy", 18));
set.add(new student("zzz", 18));
set.add(new student("xxx", 18));因为重写了equals()方法所以第四个值相同所以输出就只有
student [name=xxx, age=18]
student [name=zzz, age=18]
student [name=yyy, age=18]
输入的值为
set.add(new student("xxx", 18));
set.add(new student("yyy", 18));
set.add(new student("zzz", 18));
set.add(new student("xxx", 18));当hashcode()方法地址相同时
输出的第一个结果为hashcode()方法被调用---因为set集合里面没值这是第一个地址
输出的第二个结果为hashcode()方法被调用---因为是新建了个地址但地址相同则
输出的第三个结果就为equals()方法被调用 调用equals()是对前面那个值进行判断看值是否相同
输出的第四个结果为hashcode()方法被调用---因为是新建了个地址但地址相同则
输出的第五,六个结果就为equals()方法被调用 调用equals()是对前面那个值进行判断看值是否相同
输出的第七个结果为hashcode()方法被调用---因为是新建了个地址但地址相同则
输出的第八个结果就为equals()方法被调用 调用equals()是对前面那个值进行判断看值是否相同 因为只有一个相同的值则判断一次后就结束了并删除了这个重复的值
student [name=xxx, age=18]
student [name=zzz, age=18]
student [name=yyy, age=18]
三:TreeSet(自然排序,比较器排序)
1:自然排序(自然排序是每一个模块都是按照那个排序进行)
//测试类
public class dome3 {
public static void main(String[] args) {
Set<user> set=new TreeSet<>();
set.add(new user("xxx", 20000));
set.add(new user("yyy", 10000));
set.add(new user("zzz", 25000));
for (user user : set) {
System.out.println(user);
}
}
}
//实体类
public class user {
private String name;
private int money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
@Override
public String toString() {
return "user [name=" + name + ", money=" + money + "]";
}
public user(String name, int money) {
super();
this.name = name;
this.money = money;
}
public user() {
// TODO Auto-generated constructor stub
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + money;
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;
user other = (user) obj;
if (money != other.money)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
直接运行会报下面这个错误 因为没有实现java.lang.Comparable 这个包
需要实现Comparable
并重写方法
根据money升序
根据money降序
2:比较器排序(可以自主的选择排序方式)
根据名字排序
public class dome5 { public static void main(String[] args) { Set<user> set=new TreeSet<>(new Comparator<user>() { @Override public int compare(user o1, user o2) { // TODO Auto-generated method stub return o1.getName().compareTo(o2.getName()); } }); set.add(new user("xxx", 20000)); set.add(new user("yyy", 10000)); set.add(new user("zzz", 25000)); for (user user : set) { System.out.println(user); } } }
根据金钱排序
public class dome4 { public static void main(String[] args) { Set<user> set=new TreeSet<>(new Comparator<user>() { @Override public int compare(user o1, user o2) { // TODO Auto-generated method stub return o1.getMoney() - o2.getMoney(); } }); set.add(new user("xxx", 20000)); set.add(new user("yyy", 10000)); set.add(new user("zzz", 25000)); for (user user : set) { System.out.println(user); } } }
今天就到这吧 ,依旧要努力哦!!!!