Java新手:HashSet集合和Collections工具类

HashSet集合

  1. Set接口的特点:
    1、存入集合的顺序和取出集合的顺序不一致。
    2、没有索引。
    3、存入集合的元素没有重复(要求元素唯一,最多只能有一个null元素)。
  2. 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]

注意

  1. 遍历Set和Collection:
    1、转成数组
    2、迭代器
    3、增强for循环
  2. 遍历list的:
    1、转成数组
    2、迭代器
    3、增强for循环
    4、普通for循环

Collections

  1. Collection和Collections有什么区别?
    Collection是集合体系的最顶层,包含了集合体系的共性。
    Collections是一个工具类,方法都是用来操作Collection的,不能创建对象,方法都是static修饰的。
  2. 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]
  1. 一个模拟斗地主发牌的小例子
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

猜你喜欢

转载自blog.csdn.net/w_e_i_1201/article/details/83934582