J2EE_03 set集合


在这里插入图片描述

1.set集合的特点

  • 容器中不会出现重复的元素;
  • set相较于List集合,是没有下标的;

2.set集合的遍历方式

  • foreach
  • 迭代器
package com.tft.set;

import java.util.HashSet;
import java.util.Iterator;

/**
 * set集合的遍历方式
 * @author Administrator
 *
 */
public class Demo01 {
public static void main(String[] args) {
	HashSet<String> set = new HashSet<>();
	set.add("zs");
	set.add("pp");
	set.add("hh");
	System.out.println(set);
	
	//foreach遍历方式
	for (String string : set) {
		System.out.println(string);
	}
	//迭代器遍历方式
	Iterator< String > it = set.iterator();
	if (it.hasNext()) {
		System.out.println(it.next());
	}
}
}

3.set集合去重原理

  • 1.hashset底层去重,与hashcode、equals方法相关
  • 2.是优先对比hashcode值在对比equals值,当hashcode值相同,并且equals返回值为true,则认定为重复元素
  • ①hashcode值不同,就不会调用equals方法进行比较了
  • ②hashcode值相同,才会调用equals方法,并且equals返回值为false,则认定不是重复元素
package com.tft.set;

import java.util.HashSet;

/**
 * set集合去重原理
 * @author Administrator
 *
 */
public class Demo02 {
   public static void main(String[] args) {
	HashSet<Person> set = new HashSet<>();
	Person p1 = new Person("tft", 14, 9999);
	Person p2 = new Person("ff", 19, 3333);
	Person p3 = new Person("hh", 17, 8888);
	Person p4 = new Person("tft", 14, 9999);
	set.add(p1);
	set.add(p2);
	set.add(p3);
	set.add(p4);
	System.out.println(set.size());
	for (Person person : set) {
		System.out.println(person);
	}
   }
}
class Person {
	private String name;
	private int age;
	private float salary;
	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 float getSalary() {
		return salary;
	}
	public void setSalary(float salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", salary=" + salary + "]";
	}
	public Person(String name, int age, float salary) {
		super();
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	@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());
		result = prime * result + Float.floatToIntBits(salary);
		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;
		Person other = (Person) 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 (Float.floatToIntBits(salary) != Float.floatToIntBits(other.salary))
			return false;
		return true;
	}
	
	
}

4.TreeSet自然排序接口&比较器排序

  • 自然排序:treeset相较于hashset是可以进行排序的 例子:按照首字母进行排序
  • 比较排序:treeSet中的元素想要排序,那么必须实现java.lang.Comparable接口
  • 案例:
package com.tft.set;

import java.util.HashSet;

/**
 * set集自然排序与比较排序
 * @author Administrator
 *
 */
public class Demo02 {
//实现Comparable接口
class Person implements Comparable<Person>{
	private String name;
	private int age;
	private float salary;
	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 float getSalary() {
		return salary;
	}
	public void setSalary(float salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", salary=" + salary + "]";
	}
	public Person(String name, int age, float salary) {
		super();
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	@Override
	public int compareTo(Person p) {
		// TODO Auto-generated method stub
		return (int) (this.salary-p.salary);
	}
  }	
}
package com.tft.set;

import java.util.TreeSet;

/**
 * set集合treeset自然排序及比较排序
 * @author Administrator
 *
 */
public class Demo03 {
public static void main(String[] args) {
//	当比较器参与排序,那么此时自然排序接口java.lang.Comparable接口就失效了
//	TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
//		@Override
//		public int compare(Person o1, Person o2) {
//			return o1.getName().compareTo(o2.getName());
//		}
//	});
//	左边:接口实现方法的参数列表 -> 右边:实现方法的方法体
//	TreeSet<Person> set = new TreeSet<>((o1,o2)->(int) (o2.getSalary() - o1.getSalary()));// 薪酬模块	jdk1.8新特性,lambda表达式
	TreeSet<Person> set = new TreeSet<>((x,y)->x.getAge() - y.getAge());// 储备干部管理模块
	Person p1 = new Person("zs", 28, 9000);
	Person p2 = new Person("ls", 18, 7000);
	Person p3 = new Person("ww", 22, 6000);
	set.add(p1);
	set.add(p2);
	set.add(p3);
	for (Person person : set) {
		System.out.println(person);
	}
	

  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值