Set集合
前面我们学习了Collection 集合有两个子集合List和Set,List集合在前面我们已经介绍过了,接下来让我们看看Set集合以及他的子实现类:
先让我们看看Set集合和List集合的区别:
Set集合:不允许出现重复元素,存储和输出的顺序不一致(无序性),可以使元素为null
List集合:可以出现重复元素,存储和输出的顺序是一致的(有序性)
例如:
package com.SetDome; import java.util.HashSet; import java.util.Set; public class SetDome2 { public static void main(String[] args) { //创建一个set集合对象 Set<String> set=new HashSet<String>(); //添加元素给集合对象 set.add("Hello"); set.add("World"); set.add("Hello"); set.add("javaSE"); set.add("javaSE"); //增强for循环 for(String s:set) { System.out.println(s); } } } 运行结果: Hello javaSE World
由上例可以看出,set集合中的元素如果有重复元素,在输出时就会出现去重的效果,会达到这一效果的原因是Set的子实现类HashSet。
HashSet的存储原理:
当你向其中存储元素的时候,首先会调用该方法底层的HashCode方法将元素中的哈希码值(地址值)算出来,通过这个哈希码值就可以算出元素在哈希表中的位置
1)如果根据哈希码值算出来的位置上没有任何元素,则将该元素放在这个位置上
2)如果算出来的位置上有元素的存在,就要运用equals方法将输入的元素与位置上已经存在的元素进行比较,如果返回的是true,就不理睬它,如果返回的是false,就将该元素添加到哈希表中去
接下来我们再看看向set集合中添加自定义对象时会怎么样?
先创建一个自定义学生类:
package com.SetDome; public class Student { private String name; private int age; public Student() { super(); } 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; } @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; } }
再来创建一个测试类进行测试
package com.SetDome; import java.util.HashSet; import java.util.Set; public class SetDome { public static void main(String[] args) { //创建一个set集合对象 Set<Student> set=new HashSet<Student>(); Student s1=new Student("迪丽热巴",25); Student s2=new Student("赵星星",24); Student s3=new Student("吴宣仪",23); Student s4=new Student("迪丽热巴",25); set.add(s1); set.add(s2); set.add(s3); set.add(s4); for(Student str: set) { System.out.println(str.getName()+"---"+str.getAge()); } } } 运行结果: 赵星星---24 吴宣仪---23 迪丽热巴---25
大家可以看到上面的学生类里面我多写了HashCode方法和equals方法,因为是自定义类,系统不会在底层帮你重写这些方法,只能我们自己手动去重写,不然的话就达不到去重的效果