Set接口
set接口和常用方法
set接口基本介绍
1.无序:添加和取出的顺序不一样,没有索引
2.不允许重复元素,所以最多一个null
3.jdkAPI中set接口的实现类有:HashSet,TreeSet,等等
set接口的常用方法和接口
- 和list一样,set接口也是collection的子接口,因此,常用方法与collection接口一样
如:size():获取元素个数,isEmpty():判断是否为空,countains(object)查找元素是否存在,iterator()迭代器
add():添加元素,remove():删除元素,clear()清空,equales(object)比较
set接口的遍历方式
-
同collection的遍历方式一样,因为set解救是collection接口的子接口
1.可以使用迭代器,
2.可以使用增强for循环
3.注意:不能使用索引的方式来获取
-
使用set接口的实现类HashSet,来理解set接口的方法
-
Set接口的实现类的对象(set接口对象),不能存放重复元素,可以存放一个null;
-
存放对象是无序的,无序:添加的顺序,与取出的顺序不一致,
-
注意:取出顺序虽然不一致,但是是固定的
set接口实现类——HashSet
- HashSet实现了set接口
- HashSet,实际是HashMap(重点)
//源码
public HashSet() {
map = new HashMap<>();
}
package com.JiHe_.Set_;
import java.util.HashSet;
import java.util.Iterator;
public class Demo01 {
public static void main(String[] args) {
//使用set接口的实现类HashSet,来理解set接口的方法
//Set接口的实现类的对象(set接口对象),不能存放重复元素,可以存放一个null;
//存放对象是无序的,无序:添加的顺序,与取出的顺序不一致,注意:取出顺序虽然不一致,但是是固定的
HashSet hashSet = new HashSet();
hashSet.add(15);
hashSet.add(16);
hashSet.add(17);
hashSet.add(18);
hashSet.add(null);
hashSet.add(null);
//输出
System.out.println(hashSet);
//遍历
Iterator iterator = hashSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
- 查看是否添加成功
package com.JiHe_.Set_;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import java.util.HashSet;
public class Demo02 {
public static void main(String[] args) {
/*构造器走的源码
* public HashSet() {
map = new HashMap<>();
}
* */
//在执行add后会返回一个boolean值,成功返回true,失败则为false
HashSet hashSet = new HashSet<>();
System.out.println(hashSet.add("红楼"));//T
System.out.println(hashSet.add("西游"));//T
System.out.println(hashSet.add("水浒"));//T
System.out.println(hashSet.add("三国"));//T
System.out.println(hashSet.add("水浒"));//F
System.out.println(hashSet.add(null));//T
System.out.println(hashSet.add(null));//F
System.out.println(hashSet.add("红楼"));//F
System.out.println("set"+hashSet);
}
}
HashSet理解
案例:
package com.JiHe_.Set_;
import java.util.HashSet;
public class Demo02 {
public static void main(String[] args) {
/*构造器走的源码
* public HashSet() {
map = new HashMap<>();
}
* */
//在执行add后会返回一个boolean值,成功返回true,失败则为false
HashSet hashSet = new HashSet<>();
System.out.println(hashSet.add("红楼"));//T
System.out.println(hashSet.add("西游"));//T
System.out.println(hashSet.add("水浒"));//T
System.out.println(hashSet.add("三国"));//T
System.out.println(hashSet.add("水浒"));//F
System.out.println(hashSet.add(null));//T
System.out.println(hashSet.add(null));//F
System.out.println(hashSet.add("红楼"));//F
System.out.println("set"+hashSet);//此时,集合内有五个元素
hashSet = new HashSet();//相当于重新创建,此时集合内无元素
System.out.println(hashSet);
//hashset,不能存放相同的数据/对象!
hashSet.add("lucy");
hashSet.add("lucy");//加入不了
//new了两个不同的对象,只是对象中的内容一样
//内存地址不同,名字相同就好像世界上有两个名字相同但不是同一个人
hashSet.add(new Dog("tom"));//成功
hashSet.add(new Dog("tom"));//成功
System.out.println(hashSet);
hashSet = new HashSet();
//加深,非常经典面试题
//有坑,必须看源码,看看add发生了什么?=>底层机制
//每次new String()都生成一个新的对象,只不过String类继承了Obejct类重写了hasCode() 不在是按照地址计算hash值,所以不同对象在这里hash值相同,才不能添加进去
hashSet.add(new String("hsp"));//ok
hashSet.add(new String("hsp"));//失败
System.out.println(hashSet);
}
}
class Dog{
private String name;
public Dog(String name ) {
this.name=name;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
'}';
}
}