HashSet集合框架
**
一. 集合框架Set
**
思维导图:
- Set集合不能存放重复元素 字符串为例、八大基本数据类
- 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{}
*
*
*
*
*
*/