set
特点:
1. 元素不能重复,只能有一个null 判断元素是否重复的标准->equals
2. 元素无序
Set接口的常用方法:
使用同Collection
Set接口的常见实现:HashSet、TreeSet、LinkedHashSet
public static void main(String[] args) {
//创建一个Set集合
Set set = new HashSet();
//存入元素
set.add("java");
set.add("html");
set.add("mysql");
set.add("oracle");
//遍历集合
//使用增强for来遍历
for(Object obj : set){
System.out.println(obj);
}
}
遍历结果
使用迭代器迭代
//使用迭代器遍历
Iterator iter = set.iterator();
while(iter.hasNext()){
Object obj = iter.next();
System.out.println(obj);
}
Set集合的典型实现
HashSet
特点:
1. 底层数据结构的实现:哈希表
2. 线程不同步
3. 不保证元素的迭代顺序和存入顺序的一致性
4. 元素不重复
哈希表:
哈希值:是jdk根据对象的地址或者字符串或者数字计算得出的int类型的数值
获取对象的哈希值的方法:Object类提供
哈希值的特点:
1. 同一对象对此获取的hashcode值总是相同的
2. 不同对象的hashcode值肯定是不同的
3. 在自定义类中 需要重写hashcode方法,保证每一个对象的hash值是独有的
public static void main(String[] args) {
// 同一对象的hashCode值 是相同的 ,不同对象的hashCode值是不同的
//在特殊情况下, 可以通过重写hashCode来实现不同对象返回相同的哈希值
Student stu = new Student("张三",22);
System.out.println(stu.hashCode());
System.out.println(stu.hashCode());
Student stu1 = new Student("李四",23);
System.out.println(stu1.hashCode());
//特殊情况
System.out.println("---------------------------");
System.out.println("hello".hashCode());
System.out.println("world".hashCode());
System.out.println("java".hashCode());
System.out.println("hello".hashCode());
System.out.println("---------------------------");
System.out.println("通话".hashCode());//1179395
System.out.println("重地".hashCode());//1179395 在计算hashCode值的时候 有可能不同的对象返回相同的hanshCode
System.out.println("通话".equals("重地"));
//不同对象的equals返回false 但是他们的hashCode值 有可能相同
}
HashSet底层借助于HashMap实现
HashSet的初始容量是16,默认的负载因子为0.75
HashSet如何保证元素不可重复
-
HashSet中存储对象的位置,是由对象的HashCode值计算所得
-
存储方式的模拟解释
-
判断元素是否重复 :是hashCode值相同且equals方法返回true 此时才会认定这两个对象重复
HashSet集合存储元素,元素不能重复的保障:
元素的唯一性:重写对象类的equals和hashCode 同时当hashCode方法返回相同的hash值 且equals返回true 此时才会认定这两个元素是重复的。
LinkedHashSet
特点:
底层实现是哈希表和链表的实现。具有可预知的迭代次序
元素是有序的 (有序是由链表保障的)
元素也是不可重复的(哈希表保障了唯一性)
此实现不同步
public static void main(String[] args) {
LinkedHashSet lhs = new LinkedHashSet();
lhs.add("hello");
lhs.add("world");
lhs.add("java");
lhs.add("world");
lhs.add(null);
for(Object obj : lhs){
System.out.println(obj);
}
}