HashSet集合
- Set接口的特点:
1、存入集合的顺序和取出集合的顺序不一致。
2、没有索引。
3、存入集合的元素没有重复(要求元素唯一,最多只能有一个null元素)。 - HashSet唯一性原理:
新添加到HashSet集合的元素会与集合中已有的元素一一比较。
1、首先比较哈希值(每个元素都会调用hashCode()产生一个哈希值)
如果新添加的元素与集合中已有的元素的哈希值都不同,新添加的元素存入集合
如果新添加的元素与集合中已有的某个元素哈希值相同,需要调用equals方法比较
如果equals方法返回true,就说明新添加的元素与集合中已有的某个元素的属性值相同,那么新添加的元素不存入集合
如果返回false,说明新添加的元素与集合中已有的元素的属性值都不同,那么新添加的元素存入集合。
主函数:
public class HashSetDemo {
public static void main(String[] args) {
//创建集合对象
//如果写成Set<String> set = new HashSet<String>();这个set无法使用子类特有成员
HashSet<Student> hs = new HashSet<Student>();
//创建元素对象
Student s =new Student("张三", 20);
Student s1 =new Student("李四", 18);
Student s2 =new Student("李四", 18);
hs.add(s);
hs.add(s1);
hs.add(s2);
for (Student student : hs) {
System.out.println(student);
}
}
}
Student实体:
public class Student {
String name;//姓名
int 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;
}
//如果不重写equals方法,姓名和年龄相同的对象都可以存进去,因为地址值不同
@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;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
}
//如果不重写toString方法,返回的是地址值
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
输出结果:
Student [name=李四, age=18]
Student [name=张三, age=20]
注意:
- 遍历Set和Collection:
1、转成数组
2、迭代器
3、增强for循环 - 遍历list的:
1、转成数组
2、迭代器
3、增强for循环
4、普通for循环
Collections
- Collection和Collections有什么区别?
Collection是集合体系的最顶层,包含了集合体系的共性。
Collections是一个工具类,方法都是用来操作Collection的,不能创建对象,方法都是static修饰的。 - Collections的一些方法:
1、 static int binarySearch(List list, Object key): 使用二分查找法查找指定元素在指定列表的索引位置
2、static void copy(List dest, List src) :是把源列表中的数据覆盖到目标列表
注意:目标列表的长度至少等于源列表的长度
3、static void fill(List list, Object obj) :使用指定的对象填充指定列表的所有元素
4、static void reverse(List list) :反转
5、static void shuffle(List list):随机置换
6、static void sort(List list) :按照列表中元素的自然顺序进行排序
7、static void swap(List list, int i, int j) :将指定列表中的两个索引进行位置互换
public class collectionsDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
int index = Collections.binarySearch(list, 4);//
System.out.println("binarySearch(list, 4)=="+index);
Collections.shuffle(list);//
System.out.println("shuffle(list)=="+list);
Collections.sort(list);//
System.out.println("sort(list)=="+list);
Collections.reverse(list);//
System.out.println("reverse(list)=="+list);
Collections.swap(list, 0, 1);//
System.out.println("swap(list, 0, 1)=="+list);
Collections.fill(list, 5);//
System.out.println("fill(list, 5)=="+list);
List<Integer> dest = new ArrayList<Integer>();
dest.add(6);
dest.add(6);
dest.add(6);
dest.add(6);
dest.add(6);
Collections.copy(dest, list);//
System.out.println("copy(dest, list)=="+dest);
}
}
输出结果:
binarySearch(list, 4)==3
shuffle(list)==[2, 3, 4, 1]
sort(list)==[1, 2, 3, 4]
reverse(list)==[4, 3, 2, 1]
swap(list, 0, 1)==[3, 4, 2, 1]
fill(list, 5)==[5, 5, 5, 5]
copy(dest, list)==[5, 5, 5, 5, 6]
- 一个模拟斗地主发牌的小例子
public static void main(String[] args) {
//牌的生成
String[] arr ={"黑桃","红桃","方片","梅花"};
String[] arr2 = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
ArrayList<String> list =new ArrayList<String>();
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr2.length;j++){
list.add(arr[i]+arr2[j]);
}
}
list.add("大王");
list.add("小王");
//洗牌
Collections.shuffle(list);
//组成三个人
ArrayList<String> a1 =new ArrayList<String>();
ArrayList<String> a2 =new ArrayList<String>();
ArrayList<String> a3 =new ArrayList<String>();
//发牌
for(int i=0;i<list.size()-3;i++){
if(i%3==0){
a1.add(list.get(i));
}else if(i%3==1){
a2.add(list.get(i));
}else if(i%3==2){
a3.add(list.get(i));
}
}
//三个人的牌分别是
System.out.println("a1=="+a1);
System.out.println("a2=="+a2);
System.out.println("a3=="+a3);
//地主最后的三张牌
System.out.print("底牌=");
for(int i=list.size()-3;i<list.size();i++){
System.out.println(list.get(i));
}
}
输出结果:
a1==[梅花5, 方片Q, 方片10, 黑桃K, 黑桃10, 方片8, 梅花2, 大王, 黑桃4, 红桃10, 红桃6, 红桃9, 方片5, 梅花6, 方片A, 梅花7, 方片7]
a2==[黑桃6, 黑桃Q, 红桃4, 梅花A, 方片4, 方片K, 黑桃9, 红桃8, 红桃5, 梅花9, 梅花10, 黑桃8, 红桃3, 小王, 黑桃J, 方片6, 黑桃3]
a3==[梅花3, 红桃Q, 红桃K, 梅花8, 方片3, 方片9, 红桃2, 黑桃5, 黑桃A, 红桃A, 方片2, 黑桃2, 黑桃7, 梅花J, 红桃7, 梅花Q, 梅花K]
底牌=梅花4
红桃J
方片J