set
程序员文章站
2024-03-22 13:56:46
...
Set 集合的特征 : 存储的元素 (引用数据类型) 无序的 不可重复的
HashSet 内部存储的是一个散列表 hashSet 内部实现的是一个 HashMap。
集合存在的意义 就是存储对象
//接口 = 实现类
Set<String> set = new HashSet<String>();
//实现类 = 实现类
HashSet<String> hSet = new HashSet<String>();
hSet.add("dahuang");
//Set 提供的方法
set.add("hello");
set.add("java");
set.add("sql");
set.add("oracle");
set.add("jack");
set.add("zee");
//Set 不可以重复存放元素
set.add("zee");
//遍历Set 集合
System.out.println(set.toString());
//数组长度 size
System.out.println(set.size());
//addall 将两个数组结合 拼接 无序
set.addAll(hSet);
System.out.println(set.toString());
//clear 清除集合中的所有元素
// set.clear();
// System.out.println(set.toString());
// contains 是否包含某个元素
System.out.println(set.contains("dahuang"));
//hashCode 变量都有hashCode值
System.out.println(set.hashCode());
//删除某个元素remove
set.remove("dahuang");
System.out.println(set.toString());
//集合遍历 1:toArray
Object[] ob = set.toArray();
for (Object obj : ob) {
String str = (String)obj;//强制类型转换
System.out.print(str+" ");
}
System.out.println();
//集合遍历 2 : forEach
for(String str : set){//提前声明了 <String>
System.out.print(str+" ");
}
System.out.println();
//集合遍历 3 iterator 迭代器 游标
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){//hasNext 判断下一位是否还有值
System.out.print(iterator.next()+" ");//输出下一位的值
}
Set set = new HashSet<>();//无序
set.add(1);//integer
set.add(32);
set.add(23);
set.add(54);
set.add(45);
System.out.println(set.toString());
Hashset 集合存储对象的原理
Hashset 储存对象 先判断对象的hashcode值是否存在于散列表中 如果没有 就存入Set集合
如果有 在判定 两个对象的equals是否相同 如果equals相同 不存储 如果equals不相同则存入
set集合中 有两个相同的hashcode 但是不可能有两个相同的equals
Student stu = new Student("张伟","男",8);
Student stu1 = new Student("李四","男",18);
Student stu2 = new Student("杨丹","女",28);
// stu3 和stu2 算不算重复 (不算 )
Student stu3 = new Student("杨丹","女",28);
//创建集合
Set<Student> stus = new HashSet<Student>();
stus.add(stu);
stus.add(stu1);
stus.add(stu2);
stus.add(stu3);
//hashCode
System.out.println(stu2.hashCode());
System.out.println(stu3.hashCode());
//再判断 equals 方法是否相同
System.out.println(stu2.equals(stu3));
//遍历集合
for(Student stud : stus){
System.out.println(stud);
}
// public int hashCode() {//修改 hashCode
//
// return name.hashCode()+age+sex.hashCode();
// }
// @Override
// public boolean equals(Object obj) {//修改equals方法
// Student student = (Student)obj;
// if(student.name.equals(this.name) && student.age == age &&
// student.sex.equals(this.sex) ){
// return true;
// }else{
// return false;
// }
// }
public class Student {
public String name;
public String sex;
public int age;
public Student(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.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;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}
LikedHashSet 有链表顺序 不能重复
Link 链表
Set<String> set = new LinkedHashSet<>();
set.add("hello");
set.add("java");
set.add("mysql");
set.add("oracle");
set.add("html");
set.add("css");
set.add("css");//不能重复
for(String str : set){
System.out.println(str + " ");
}
Tree 树
Tree 树形结构 有序的
TreeSet 是可排序的集合 默认按照字典或数字顺序排列
Set<String> set = new TreeSet<>();
set.add("hello");
set.add("java");
set.add("aaaa");
set.add("aaa");
set.add("bule");
set.add("gree");
set.add("full");
for(String str : set){
System.out.println(str);
}
public static void main(String[] args) {
Student stu = new Student("张伟","男",8);
Student stu1 = new Student("李四","男",18);
Student stu2 = new Student("杨丹","女",28);
TreeSet<Student> set = new TreeSet<Student>(new MyComparable());
set.add(stu);
set.add(stu1);
set.add(stu2);
//遍历集合
for(Student st : set){
System.out.println(st);//没有定义排列顺序 一开始报错
}
//自定义排序规则类
class MyComparable implements Comparator<Student>{
public int compare(Student o1, Student o2) {
return o1.age-o2.age;
}
public class Student implements Comparable<Student>{
public String name;
public String sex;
public int age;
public Student(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.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;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}
@Override
public int compareTo(Student o) {
return o.age-age;
}
// public int hashCode() {//修改 hashCode
//
// return name.hashCode()+age+sex.hashCode();
// }
// @Override
// public boolean equals(Object obj) {//修改equals方法
// Student student = (Student)obj;
// if(student.name.equals(this.name) && student.age == age &&
// student.sex.equals(this.sex) ){
// return true;
// }else{
// return false;
// }
上一篇: Set