javaSE基础 (二十七)

Collection

以value形式存在

Set

无序无重复

具体实现的类

HashSet

TreeSet

基本的使用

无序 无重复

无序 : 我们使用的集合存放元素的顺序 集合内取出来的顺序不一致 (不是集合本身是否有序 Tree自然有序)

无重复 :添加的元素不能一致(如果出现重复元素 只存第一个 不再存入)

集合本身是有自己的算法排布顺序 hash算法

HashSet——->(HashMap(数组+链表)散列表 邻接表)

java.util包

如何创建对象

无参数

有参数

集合容器的基本使用

增删改差
boolean = add(value) addAll(collection c) retainAll removeAll
boolean = remove(Object)
没有修改方法
size()

关于迭代器iterator

//获取一个迭代器对象 通过set集合获取
Iterator <String> it = set.iterator();// Iterator 接口 多态效果 父类引用子类对象
//判断下一个位置是否有元素
if(it.hashNext){
 String value = it.next();
 System.out.println(Value);
}

无重复原则

首先通过String类和Person类型存储
大概猜测 无重复原则 利用equals方法进行比较
如果我们让Person对象的name一致 认为是同一个对象
我们可以重写equals方法
重写了equals方法 发现还没有产生无重复的效果
证明可能原则不止equals方法这么简单
还有另一个规则同时起着作用 hashcode方法

为什么要重写equals()方法?

  因为默认equals在比较两个对象时,是看他们是否指向同一个地址的。但有时,我们需要两个不同对象只要是某些属性相同就认为它们equals()的结果为true。比如:

 person p1 = new person(1,"name");
 person p2 = new person(1,"name");
 如果不重写equals的话,他们是不相同的,所以我们要重些equals,判断只要他们的id和名字相同equals就为true,在一些集合里有时也这样用,集合里的contain也是用equals来比较

   先来看Object关于equals()的源码:

   public boolean equals(Object obj) {
   return (this == obj);
   }


 //String 就重写了equals方法
public boolean equals(Object obj){
    if(this==obj){
        return true;
    }
    if(obj instanceof Question) {
        Question anotherQuestion = (Question)obj;
       //this.title 按照?截取 与anotherQuestion.title截取之前的部分比较
        if(this.title.equals(anotherQuestion.title)){
            return true;
        }
    }
    return false;
}

当重写equals方法时,同时也要重写hashCode方法。

//修改equals 方法一定要修改hashcode方法 因为底层用hashCode比较
public int hash(){
   return this.title.hashCode();
}

TreeSet—–>(TreeMap 二叉树利用Node(Left item right))

无序无重复 java.util

无参构造方法 带Collection构造方法

基本常用方法

add(E e)  iterator() remove(E e) 没有修改 size()

无序无重复规则是如何实现的

treeSet集合本身是有顺序的  我们指的无序是存入和取出不一致
CompaerTo------>String类 按照字母的自然顺序排列
//如果想让Person对象存入TeeSet集合内  必须实现Comapareable接口 重写这个方法
piublic int compareTo(o.name){//当前对象name与另一个对象CompareTo结果
return this.name.compareTo(o.name);//当前对象name和另一对象name的CompareTO结果
}