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");
结果: