第一个重点,集合框架Set(HashSet哈希表存储、重复元素存储底层探究)
package com.qinwenpeng;
import java.util.Iterator;
import java.util.LinkedList;
/**
* 利用Linkedlist完成具有堆栈特性的容器
* 利用Linkedlist完成具有对列特性的容器
*
* @author Administrator
*
*/
public class LinkedListDemo {
public static void main(String[] args) {
// DuiZhan dz=new DuiZhan();
DuiLie dz=new DuiLie();
dz.push("a");
dz.push("b");
dz.push("c");
dz.push("d");
dz.push("e");
dz.bianLi();
}
}
class DuiZhan{
private LinkedList ll=new LinkedList<>();
public void push(Object obj) {
ll.addFirst(obj);
}
public Object pop() {
return ll.removeFirst();
}
public void bianLi() {
Iterator it = ll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
class DuiLie{
private LinkedList ll=new LinkedList<>();
public void push(Object obj) {
ll.addLast(obj);
}
public Object pop() {
return ll.removeFirst();
}
public void bianLi() {
Iterator it = ll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
运行结果
不相等就不用调用它
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p=(Person)obj;
System.out.println(this.getName()+"----equals---"+p.getName());
return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
}
return false;
调的方法少了很多,,性能优化了。在Set集合里面做去重就是这么写的。。。
package com.qinwenpeng.set;
import java.util.HashSet;
/**
* 演示set集合的特性
*
* 元素是不可重复的,针对于基本类型以及String,引用数据类型去重需要重写hashCode以及equals方法
* Set集合元素的去重
*
* @author Administrator
*
*/
public class SetDemo {
public static void main(String[] args) {
//不重复
HashSet al=new HashSet<>();
// hs.add("zs");
// hs.add("ls");
// hs.add("we");
// hs.add("mz");
// hs.add("zs");
//没有去重,,地址不一样
al.add(new Person("zs",18));
al.add(new Person("ls",21));
al.add(new Person("ww",22));
al.add(new Person("mazi",18));
al.add(new Person("zs",18));
System.out.println(al.size());
}
}
class Person {
private String name;
private int age;
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 Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
System.out.println("来了小老弟"+this.getName());
return this.getName().hashCode()+this.age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p=(Person)obj;
System.out.println(this.getName()+"----equals---"+p.getName());
return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
}
return false;
}
}
画图更加理解
第二个重点,2、2、集合框架TreeSet(自然排序、数据结构二叉树、比较器排序)
有序排练,,按照abc来。
package com.qinwenpeng.set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
/**
* 集合框架TreeSet
*
* @author Administrator
*
* 派出所返回的数据是无序的,怎么针对于这些数据进行排序呢?
*
*
*/
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet hs=new TreeSet <>();
hs.add("zs");
hs.add("ls");
hs.add("we");
hs.add("mz");
hs.add("zs");
//没有去重,,地址不一样
// al.add(new Person("zs",18));
// al.add(new Person("ls",21));
// al.add(new Person("ww",22));
// al.add(new Person("mazi",18));
// al.add(new Person("zs",18));
Iterator it=hs.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
对象转换异常,Person不能转换为Comparable。要转型,想排序就要实现Comparable接口,让元素具有比较性。
实现Comparable之后
package com.qinwenpeng.set;
import java.util.HashSet;
/**
* 演示set集合的特性
*
* 元素是不可重复的,针对于基本类型以及String,引用数据类型去重需要重写hashCode以及equals方法
* Set集合元素的去重
*
* @author Administrator
*
*/
public class SetDemo {
public static void main(String[] args) {
//不重复
HashSet al=new HashSet<>();
// hs.add("zs");
// hs.add("ls");
// hs.add("we");
// hs.add("mz");
// hs.add("zs");
//没有去重,,地址不一样
al.add(new Person("zs",18));
al.add(new Person("ls",21));
al.add(new Person("ww",22));
al.add(new Person("mazi",18));
al.add(new Person("zs",18));
System.out.println(al.size());
}
}
class Person implements Comparable<Person>{
private String name;
private int age;
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 Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
System.out.println("来了小老弟"+this.getName());
return this.getName().hashCode()+this.age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p=(Person)obj;
System.out.println(this.getName()+"----equals---"+p.getName());
return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
}
return false;
}
/**
* 本方法用来定义排序的规则
* 正数:代表后面的比前面的大
* 0:后面与前面的相等
* 负数:后面和前面的小
*
* this代表还没有存放到容器中的对象
* o代表已经在容器中的对象
* @param o
* @return
*/
@Override
public int compareTo(Person o) {
int num=this.getAge()-o.getAge();
//年龄不标准,就不找他
if(num == 0) {
return this.getName().compareTo(o.getName());
}
return num;
}
}
按照年龄来排序
按照名字来排序
package com.qinwenpeng.set;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
/**
* 集合框架TreeSet
*
* @author Administrator
*
* 派出所返回的数据是无序的,怎么针对于这些数据进行排序呢?
* 第一中方式:实现Comparable接口,让元素自身具备比较性
* 主要:再给元素添加比较性的时候,先判断的主要方式(年龄),在判断次要条件;
* 第一种方式维护性较差,也就是程序的拓展性较差;
*
*
* 第二种方式:实现comarator接口,让容器具有比较性;
* 针对于之前的需求发生改变(name)
* 钱多死的快
*/
public class TreeSetDemo {
public static void main(String[] args) {
// TreeSet al=new TreeSet<>();
TreeSet al=new TreeSet<>(new PersonComp());
// hs.add("zs");
// hs.add("ls");
// hs.add("we");
// hs.add("mz");
// hs.add("zs");
al.add(new Person("zs",18));
al.add(new Person("ls",21));
al.add(new Person("ww",22));
al.add(new Person("mazi",20));
al.add(new Person("zs",20));
Iterator it=al.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
class PersonComp implements Comparator<Person>{
/**
* 本方法用来定义排序的规则
* 正数:代表后面的比前面的大
* 0:后面与前面的相等
* 负数:后面和前面的小
*
* o1代表还没有存放到容器中的对象
* o2代表已经在容器中的对象
* @param o
* @return
*/
@Override
public int compare(Person o1, Person o2) {
int num=o1.getName().compareTo(o2.getName());
if(num==0) {
return o2.getAge()-o1.getAge();
}
return num;
}
}
名字一样的年龄大的排在年龄小的前面
解析思路
泛型
package com.qinwenpeng.set;
/**
* 泛型的好处
* 1.将运行时的错误转换到编译时的错误
* 2.提升了代码的健壮性,简化了代码。
*
*/
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<Integer> hs=new HashSet<>();
hs.add(22);
hs.add(32);
hs.add(33);
hs.add(34);
hs.add(45);
// hs.add("zs");
Iterator it=hs.iterator();
while(it.hasNext()) {
Object next = it.next();
if(next instanceof Integer) {
int i=(Integer)next;
if(i % 2 ==0)
System.out.println((i));
}
}
}
}
/**
* BooKDao
* add
* del
* ....
* UserDao
* add
* del
* ....
* OrderDao
* add--->Order
* del
* .....
*
*/
class CommonDao<T>{
public List<T> list(){
return null;
}
public int add (T t){
return 0;
}
public int del(T y){
return 0;
}
public int edit(T t){
return 0;
}
}