set集合框架

1、集合框架Set(HashSet哈希表存储、重复元素存储底层探究)
2、treeSet的自然排序
3、比较器排序
4、泛型的简单应用

1、集合框架Set(HashSet哈希表存储、重复元素存储底层探究)

set集合不能存放重复元素的问题
不能放重复 元素 字符串、八大基本数据类型
set集合中的元素是无序的

package com.ljy.set;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


/**
 * 1.set集合不能存放重复元素的问题
 *不能放重复 元素 字符串、八大基本数据类型
 *set集合中的元素是无序的
 *
 * 
 * 
 * 2.HashSet哈希表存储,重复元素存储底层探究
 * list.contains      底层调用了equa方法
 * set.add            底层调用了hashCode/equals
 * @author Felling
 *
 */
public class SetDemo {
public static void main(String[] args) {
//	List list= new ArrayList<>();
	Set set=new HashSet<>();
	set.add("张三");
	set.add("李四");
	set.add("王五");
	set.add("赵六");
	set.add("张三");
	System.out.println(set.size());//不能放重复 元素

	Iterator it =set.iterator();
	while (it.hasNext()) {
		System.out.println(it.next());
	}
}
}

输出结果
在这里插入图片描述
HashSet哈希表存储,重复元素存储底层探究
代码如下

package com.ljy.set;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


/**
 * 1.set集合不能存放重复元素的问题
 *不能放重复 元素 字符串、八大基本数据类型
 *set集合中的元素是无序的
 *
 * 
 * 
 * 2.HashSet哈希表存储,重复元素存储底层探究
 * list.contains      底层调用了equa方法
 * set.add            底层调用了hashCode/equals
 * @author Felling
 *
 */
public class SetDemo {
public static void main(String[] args) {
	Set set=new HashSet<>();
	set.add(new Person("张三",18,1500));
	set.add(new Person("李四",8,1000));
	set.add(new Person("王五",28,1100));
	set.add(new Person("赵六",38,1200));
	set.add(new Person("张三",18,1500));
	System.out.println(set.size());
	Iterator it =set.iterator();
	while (it.hasNext()) {
		System.out.println(it.next());
	}
}
}
class Person{
	private String name;
	private int age;
	private int money;
	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 int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", money=" + money + "]";
	}
	public Person(String name, int age, int money) {
		super();
		this.name = name;
		this.age = age;
		this.money = money;
	}
	public Person() {
		super();
	}
	public int hashCode() {
		System.out.println("hashCode------"+this.name);
		int code=this.name.hashCode()+this.age;
		System.out.println(code);
		return code;
		}
	
	
	@Override
	public boolean equals(Object obj) {
		Person p=(Person)obj;
		return this.name.equals(p.name)&& this.age==p.age;
	}
}

输出结果如下
在这里插入图片描述

2、treeSet的自然排序

TreeSet可以对set集合中元素进行排序
代码如下

public class TreeSetDemo {

public static void main(String[] args) {
	TreeSet set=new TreeSet<>();
			set.add(26);
			set.add(25);
			set.add(28);
			set.add(21);
			set.add(31);
			System.out.println(set);
}
}

结果
在这里插入图片描述
案例

package com.ljy.set;

import java.util.Iterator;
import java.util.TreeSet;

/**
 * 2.集合框架TreeSet(自然排序、数据结构二叉树、比较器排列)
 * treeSet容器是根据二叉树的排列规则对容器中元素进行排序的  自然排序(元素自身具有比较性)
 *  java.lang.ClassCastException: 
 *  com.ljy.set.Person cannot be cast to java.lang.Comparable
 *  
 */
public class TreeSetDemo {

public static void main(String[] args) {
	TreeSet set=new TreeSet<>();
	set.add(new Person("张三",18,1500));
	set.add(new Person("李四",23,500));
	set.add(new Person("王五",19,1200));
	set.add(new Person("赵六",22,2500));
	set.add(new Person("张三1",18,10500));
//	System.out.println(set);
	Iterator it =set.iterator();
	while (it.hasNext()) {
		System.out.println(it.next());
	}
}
			
}

class Person implements Comparable<Person>{
	private String name;
	private int age;
	private int money;
	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 int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", money=" + money + "]";
	}
	public Person(String name, int age, int money) {
		super();
		this.name = name;
		this.age = age;
		this.money = money;
	}
	public Person() {
		super();
	}
	public int hashCode() {
		System.out.println("hashCode------"+this.name);
		int code=this.name.hashCode()+this.age;
		System.out.println(code);
		return code;
		}
	
	
	@Override
	public boolean equals(Object obj) {
		Person p=(Person)obj;
		return this.name.equals(p.name)&& this.age==p.age;
	}
	@Override
  //让元素具备比较性
	//注意:在做自然排序方法重写的时候,一定先判断主要条件,还要判断次要条件
	public int compareTo(Person o) {
		int num= o.money-this.money;
		if(num==0) {
			return o.age-this.age;
		}
		return num;
	}
	
}

主要条件是money
运行结果:
在这里插入图片描述

3、比较器排序

对比案例中的年龄和钱
代码如下:

package com.ljy.set;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * 2.集合框架TreeSet(自然排序、数据结构二叉树、比较器排列)
 * treeSet容器是根据二叉树的排列规则对容器中元素进行排序的  自然排序(元素自身具有比较性)
 *  java.lang.ClassCastException: 
 *  com.ljy.set.Person cannot be cast to java.lang.Comparable
 */
public class TreeSetDemo {

public static void main(String[] args) {
//	TreeSet set=new TreeSet<>();
	TreeSet<Person> set=new TreeSet<>(new PersonAgeMoneyComp());
//	TreeSet<Person> set=new TreeSet<>(new PersonMoneyCompAge());
	
	set.add(new Person("张三",17,10500));
	set.add(new Person("李四",23,500));
	set.add(new Person("王五",19,1200));
	set.add(new Person("赵六",22,2500));
	set.add(new Person("张三1",18,10500));
//	System.out.println(set);
	Iterator it =set.iterator();
	while (it.hasNext()) {
		System.out.println(it.next());
	}
}	
}
/**
 * 年少多金
 * @author Felling
 *
 */
class PersonAgeMoneyComp implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		int num=o1.getAge()-o2.getAge();
		if(num==0) {
			return o2.getMoney()-o1.getMoney();
		}
		return num;
	}
	
}
/**
 * 有钱并且年轻
 * @author Felling
 *
 */
class PersonMoneyCompAge implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		int num=o2.getMoney()-o1.getMoney();
		if(num==0) {
			return o1.getAge()-o2.getAge();
		}
		return num;
	}

}

class Person implements Comparable<Person>{
	private String name;
	private int age;
	private int money;
	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 int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", money=" + money + "]";
	}
	public Person(String name, int age, int money) {
		super();
		this.name = name;
		this.age = age;
		this.money = money;
	}
	public Person() {
		super();
	}
	public int hashCode() {
		System.out.println("hashCode------"+this.name);
		int code=this.name.hashCode()+this.age;
		System.out.println(code);
		return code;
		}
	
	
	@Override
	public boolean equals(Object obj) {
		Person p=(Person)obj;
		return this.name.equals(p.name)&& this.age==p.age;
	}
	@Override
  //让元素具备比较性
	//注意:在做自然排序方法重写的时候,一定先判断主要条件,还要判断次要条件
	public int compareTo(Person o) {
		int num= o.money-this.money;
		if(num==0) {
			return o.age-this.age;
		}
		return num;
	}
	
}

年少多金
输出结果:
在这里插入图片描述

4、泛型的简单应用

代码案例:

package com.ljy.set;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 泛型
 * 好处/为什么出现?
 *    不使用泛型的情况下,会将未知的错误表现在运行时期
 *     如果说用代码去处理了,这个可能发现的错误,那么运行时期的错误就不会暴露出来
 *     好处:
 * 1.将运行期的异常转换成编译期的错误,让程序员更早的发现,从而解决代码隐患
 * 2.提高了代码的健壮性
 * 泛型类
 * 泛型接口
 * 泛型方法
 * 对于编码而言有什么更深层次的好处呢?
 * @author Felling
 *
 */
public class FanXinDemo {
public static void main(String[] args) {
	List c = new ArrayList();
	c.add(22);
	c.add(23);
	c.add(26);
	c.add(28);
	c.add(55);
	c.add("s");//会报转换错误,要通过筛选判断
	 Iterator it =c.iterator();
	 while (it.hasNext()) {
		 Object obj=it.next();
		 if(obj instanceof Integer) {
				int n=(int) obj;
				if(n%2==0) {//求偶数
					System.out.println(n);
				}
			}
	 }
}
}
/*
 * 购物车项目
 * 订单模块,用户模块、商品模块
 * Class OrderDao{
 *  public List<Order> list(Order order){
 * 
 *  }
 * 
 *  public int add(Order order){}
 *  public int edit(Order order){}
 *  public int del(Order order){}
 * 
 * }
 * 
 * Class UserDao{
 *  public List<User> list(User User){}
 *  public int add(User User){}
 *  public int edit(User User){}
 *  public int del(User User){}
 * 
 * }
 * 
 * Class ProductDao{
 *  
 * }
 * 
 * --------不使用泛型的情况-----------------
 * --------使用泛型的情况-----------------
 * Class BaseDao<T>{
 *  public List<T> list(T t){}
 *  public int add(T t){}
 *  public int edit(T t){}
 *  public int del(T t){}
 * }
 * 
 * Class OrderDao extends BaseDao<Order>{}
 * Class UserDao extends BaseDao<User>{}
 * Class ProductDao extends BaseDao<Product>{}
 */

注意c.add("s");
结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值