set集合框架

HashSet集合框架

**

一. 集合框架Set

**
思维导图:

在这里插入图片描述

  1. Set集合不能存放重复元素 字符串为例、八大基本数据类
  2. HashSet哈希表存储、重复元素存储底层探究
    List.contains 底层调用了equals方法
    set.add 底层调用了hashcode/equals

3.代码:
package com.xiaoyi.set;

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

/**

  • 1.set集合不能存放重复元素的问题
  • 不能存放重复元素 字符串为例、八大基本数据类型
  • set集合中的元素是无序的
  • 2.HashSet哈希表存储、重复元素存储底层探究
  • list.contains 底层调用了equals方法
  • set.add 底层调用了hashcode/equals方法
    */
    public class SetDemo {
    public static void main(String[] args) {
    //List l=new ArrayList<>();
    Set set=new HashSet<>();
    set.add(new Person(“hehe”, 14, 1980));
    set.add(new Person(“xiang”, 15, 3423));
    set.add(new Person(“haha”, 44, 23423));
    set.add(new Person(“xixi”, 19, 1980));
    set.add(new Person(“xiang”, 15, 3423));//生产地址同一个
    System.out.println(set.size());//set四个不能存放重复元素
    Iterator it= set.iterator();//迭代器来遍历
    while(it.hasNext()) {
    System.out.println(it.next());//下一个
    }
    }
    set集合中的元素是无序的 运行结果:
    在这里插入图片描述

}

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();
}
//用hashcode重写可以出现两个相同的地址
public int hashCode() {
System.out.println(“hashcode-----”+this.name);
int code=this.name.hashCode()+ this.age;
System.out.println(code);
return code;
}
//用hashcode重写可以出现两个相同的地址运行结果:
在这里插入图片描述

@Override
public boolean equals(Object obj) {
	Person p=(Person)obj;
	return this.name.equals(p.name) && this.age == p.age;
}

}

//用equals重写判断相同的地址只出现一个
在这里插入图片描述

二. 集合框架TreeSet(自然排序、数据结构二叉树、比较器排序)

TreeSet容器是根据二叉树的排序规则对容器中元素进行排序的
自然排序:元素自身具有比较器
实现Comparable接口,可以直接进行自然排序
类转换错误:
java.lang.ClassCastException:com.xiaoyi.set.Person cannot be cast to java.lang.Comparable

package com.xiaoyi.set;
import java.util.Iterator;
import java.util.TreeSet;
/**

  • 集合框架TreeSet(自然排序、数据结构二叉树、比较器排序)
  • 自然排序:元素自身具有比较器
  • 1.treeset容器是根据二叉树的排序规则对容器中元素进行排序的
    *类转换错误:
  • java.lang.ClassCastException: com.xiaoyi.set.Person cannot be cast to java.lang.Comparable

*/
public class TreeSetDemo {
public static void main(String[] args) {
//TreeSetset=new TreeSet<>();
TreeSetset=new TreeSet<>(new PersonMoneyAgaComp());
set.add(new Person(“hehe”, 14, 1980));
set.add(new Person(“xiang”, 15, 3423));
set.add(new Person(“haha”, 44, 23423));
set.add(new Person(“xixi”, 19, 1980));
set.add(new Person(“xiang”, 15, 3423));
//System.out.println(set);// 自然排序:元素自身具有比较器
Iterator it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());//升序排
}
}
}
//建一个比较器
//钱多年轻
//让元素具有比较性
class PersonMoneyAgaComp implements Comparator{
//钱多年轻
@Override
public int compare(Person o1, Person o2) {
int num=o2.getMoney()-o1.getMoney();//年龄对比
if(num==0) {
return o1.getAge()-o2.getAge();//再是钱进行对比
}
return num;
}
}
//元素具有比较性,运行结果如下:

在这里插入图片描述

//实现Comparable接口,可以直接进行自然排序
class Person implements Comparable{

//类转换错误,没有实现实现Comparable接口,运行结果rux:
java.lang.ClassCastException: com.xiaoyi.set.Person cannot be cast to java.lang.Comparable

在这里插入图片描述

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();
}

//用hashcode重写可以出现两个相同的地址
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;

//用equals重写判断相同的地址只出现一个
}
/**
 * 让元素进行比较性
 *注意:在做自然排序,一定判断主要条件,还要判断次要判断
 */
@Override
public int compareTo(Person o) {

int num=o.money-this.money;//先判断主要条件
if(num==0) {
return o.age-this.age;//后次要条件
}
return num;
}}
//在做自然排序,一定判断主要条件,还要判断次要判断(先判断钱,再判断年龄)运行结果如下:
在这里插入图片描述

**

三.泛型的简单应用:

**
好处、为啥出现?
1.将运行时期的异常转换成编译时的错误,让程序员更早的发现错误,从而解决代码隐患
2.提高了代码的健壮性
package com.xiaoyi.set;

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

/**
*泛型:
*好处、为啥出现?
*不使用泛型的情况下:会将未知的错误表现在运行时期
*如果说用代码去处理了可能发现的错误,那么运行时期的错误就不会暴露出来
*1.将运行时期的异常转换成编译时的错误,让程序员更早的发现错误,从而解决代码隐患
*2.提高了代码的健壮性
*泛型类
*泛型接口
*泛型方法
*对于编码而言有什么好处了?
*

  • java.lang.String cannot be cast to java.lang.Integer转换异常String类型不能转换成int类型
    */
    public class FanXinDemo {
    public static void main(String[] args) {
    List c=new ArrayList();
    c.add(23);
    c.add(21);
    c.add(26);
    c.add(24);
    c.add(53);
    //c.add(“s”);
    转换异常:
    java.lang.String cannot be cast to java.lang.Integer转换异常String类型不能转换成int类型
    在这里插入图片描述

     //ctrl+shift  快速导
     Iterator it=c.iterator();
     while(it.hasNext()) {
     Object obj=it.next();
     //if(obj instanceof Integer) {//转成int类型
    

    // int num=(int) it.next();放两个it.next()代码会报错
    int num=(int) obj;
    if(num%2==0) {
    System.out.println(num);
    }

}
}
}

/*
*购物车项目
*订单模块、用户模块、商品模块
*Class OrderDao{
*public List list(User User){
*}
*public int add(User User){}
*public int edit(User User){}
*public int del(User User){}

  • }
  • Class UserDao{
  • public List list(User User){
  • public int add(User User){}
    *public int edit(User User){}
    *public int del(User User){}
    *}
    *Class Product(){
    *}
    *---------不使用泛型的情况--------
    *---------使用泛型的情况--------
    *Class BaseDao{
  • public List list(T t){
  • public int add(T t){}
    *public int edit(T t){}
    *public int del(T t){}
    *}

*Class OrderDao extends BaseDao{}
*Class OrderDao extends BaseDao{}
*Class OrderDao extends BaseDao{}
*
*
*
*
*
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值